From 5d959e6d6efe7c2afeac21ddfbaf897fee9a4b01 Mon Sep 17 00:00:00 2001 From: dominik-zeglen Date: Wed, 19 Jun 2019 16:40:52 +0200 Subject: [PATCH] Initial commit --- .codeclimate.yml | 37 + .gitignore | 40 + .npmrc | 1 + .travis.yml | 73 + CHANGELOG.md | 517 + LICENSE | 29 + README.md | 143 + apollo.config.js | 14 + assets/images/arrow-down-icon.svg | 4 + assets/images/arrow-down.svg | 9 + assets/images/arrow-left.svg | 1 + assets/images/arrow-select.svg | 7 + assets/images/arrow-up-icon.svg | 4 + assets/images/arrow-up.svg | 9 + assets/images/avatars/avatar1.png | Bin 0 -> 112798 bytes assets/images/avatars/avatar10.png | Bin 0 -> 132035 bytes assets/images/avatars/avatar11.png | Bin 0 -> 108675 bytes assets/images/avatars/avatar12.png | Bin 0 -> 133438 bytes assets/images/avatars/avatar2.png | Bin 0 -> 112856 bytes assets/images/avatars/avatar3.png | Bin 0 -> 94893 bytes assets/images/avatars/avatar4.png | Bin 0 -> 122384 bytes assets/images/avatars/avatar5.png | Bin 0 -> 68339 bytes assets/images/avatars/avatar6.png | Bin 0 -> 110309 bytes assets/images/avatars/avatar7.png | Bin 0 -> 122515 bytes assets/images/avatars/avatar8.png | Bin 0 -> 99065 bytes assets/images/avatars/avatar9.png | Bin 0 -> 64071 bytes assets/images/block1.jpg | Bin 0 -> 266483 bytes assets/images/block2.jpg | Bin 0 -> 197784 bytes assets/images/block3.jpg | Bin 0 -> 133761 bytes assets/images/checkout-bg.png | Bin 0 -> 34322 bytes assets/images/checkout-bg2x.png | Bin 0 -> 51000 bytes assets/images/checkout.svg | 3 + assets/images/chevron-down.svg | 3 + assets/images/chevron-up.svg | 3 + assets/images/close.svg | 1 + assets/images/confirm-order-bg.png | Bin 0 -> 28185 bytes assets/images/confirm-order-bg2x.png | Bin 0 -> 38066 bytes assets/images/delete.svg | 13 + assets/images/dribbble-logo.svg | 97 + assets/images/edit.svg | 4 + assets/images/empty-checkout-bg.png | Bin 0 -> 10773 bytes assets/images/empty-checkout-bg2x.png | Bin 0 -> 21851 bytes assets/images/facebook-logo.svg | 37 + assets/images/favicon.svg | 43 + assets/images/filter-icon.svg | 10 + assets/images/gallery-arrow.svg | 18 + assets/images/github-logo.svg | 3 + assets/images/google-logo.svg | 72 + assets/images/instagram-logo.svg | 23 + assets/images/linkedin-logo.svg | 1 + assets/images/loader.svg | 46 + assets/images/login-background.svg | 201 + assets/images/login-bg.png | Bin 0 -> 7312 bytes assets/images/login-bg2x.png | Bin 0 -> 14388 bytes assets/images/logo-dark.svg | 9 + assets/images/logo-light.svg | 1 + assets/images/logo-white.svg | 1 + assets/images/meetup-logo.svg | 72 + assets/images/mobile-menu.svg | 5 + assets/images/no-results-bg.svg | 151 + assets/images/not-found-404.svg | 3 + assets/images/pass-invisible.svg | 19 + assets/images/pass-visible.svg | 15 + assets/images/photo-icon.svg | 9 + assets/images/placeholder1080x1080.png | Bin 0 -> 31718 bytes assets/images/placeholder120x120.png | Bin 0 -> 2683 bytes assets/images/placeholder255x255.png | Bin 0 -> 4710 bytes assets/images/placeholder540x540.png | Bin 0 -> 11505 bytes assets/images/placeholder60x60.png | Bin 0 -> 2284 bytes assets/images/reset-bg.png | Bin 0 -> 5864 bytes assets/images/sale-bg.svg | 3 + assets/images/sample-product.jpg | Bin 0 -> 26849 bytes assets/images/sample-product2.jpg | Bin 0 -> 22257 bytes assets/images/search.svg | 3 + assets/images/twitter-logo.svg | 2 + assets/images/what.svg | 3 + package-lock.json | 32039 ++++++ package.json | 177 + src/Baseline.tsx | 16 + src/NotFound.tsx | 11 + src/auth/AuthProvider.tsx | 135 + .../components/LoginLoading/LoginLoading.tsx | 21 + src/auth/components/LoginLoading/index.ts | 2 + src/auth/components/LoginPage/LoginPage.tsx | 201 + src/auth/components/LoginPage/index.ts | 2 + src/auth/components/SectionRoute.tsx | 34 + src/auth/index.tsx | 30 + src/auth/misc.ts | 5 + src/auth/mutations.ts | 58 + src/auth/types/TokenAuth.ts | 48 + src/auth/types/User.ts | 26 + src/auth/types/VerifyToken.ts | 40 + src/auth/views/Login.tsx | 27 + .../CategoryBackground/CategoryBackground.tsx | 133 + .../components/CategoryBackground/index.ts | 2 + .../CategoryCreatePage/CategoryCreatePage.tsx | 92 + .../components/CategoryCreatePage/index.ts | 2 + .../CategoryDeleteDialog.tsx | 65 + .../components/CategoryDeleteDialog/index.ts | 2 + .../CategoryDetailsForm.tsx | 77 + .../components/CategoryDetailsForm/index.ts | 2 + .../components/CategoryList/CategoryList.tsx | 190 + .../components/CategoryList/index.ts | 2 + .../CategoryListPage/CategoryListPage.tsx | 62 + .../components/CategoryListPage/index.ts | 2 + .../CategoryProducts/CategoryProducts.tsx | 136 + .../components/CategoryProducts/index.ts | 1 + .../CategoryProductsCard.tsx | 59 + .../components/CategoryProductsCard/index.ts | 2 + .../CategoryUpdatePage/CategoryUpdatePage.tsx | 219 + .../components/CategoryUpdatePage/index.ts | 2 + src/categories/fixtures.ts | 316 + src/categories/index.tsx | 71 + src/categories/mutations.ts | 88 + src/categories/queries.ts | 124 + src/categories/types/CategoryBulkDelete.ts | 26 + src/categories/types/CategoryCreate.ts | 52 + src/categories/types/CategoryDelete.ts | 26 + src/categories/types/CategoryDetails.ts | 118 + .../types/CategoryDetailsFragment.ts | 29 + src/categories/types/CategoryProperties.ts | 95 + src/categories/types/CategoryUpdate.ts | 52 + src/categories/types/RootCategories.ts | 55 + src/categories/types/RootCategoryChildren.ts | 39 + src/categories/urls.ts | 36 + src/categories/views/CategoryCreate.tsx | 75 + src/categories/views/CategoryDetails.tsx | 426 + src/categories/views/CategoryList.tsx | 153 + .../CollectionCreatePage.tsx | 167 + .../components/CollectionCreatePage/index.ts | 2 + .../CollectionDetails/CollectionDetails.tsx | 70 + .../components/CollectionDetails/index.ts | 2 + .../CollectionDetailsPage.tsx | 152 + .../components/CollectionDetailsPage/index.ts | 2 + .../CollectionImage/CollectionImage.tsx | 142 + .../components/CollectionImage/index.ts | 2 + .../CollectionList/CollectionList.tsx | 166 + .../components/CollectionList/index.ts | 2 + .../CollectionListPage/CollectionListPage.tsx | 37 + .../components/CollectionListPage/index.ts | 2 + .../CollectionProducts/CollectionProducts.tsx | 189 + .../components/CollectionProducts/index.ts | 2 + .../containers/CollectionOperations.tsx | 107 + src/collections/fixtures.ts | 123 + src/collections/index.tsx | 52 + src/collections/mutations.ts | 245 + src/collections/queries.ts | 123 + .../types/AssignHomepageCollection.ts | 36 + .../types/CollectionAssignProduct.ts | 77 + src/collections/types/CollectionBulkDelete.ts | 26 + .../types/CollectionBulkPublish.ts | 27 + src/collections/types/CollectionDetails.ts | 88 + .../types/CollectionDetailsFragment.ts | 25 + src/collections/types/CollectionFragment.ts | 14 + src/collections/types/CollectionList.ts | 50 + .../types/CollectionProductFragment.ts | 27 + src/collections/types/CollectionUpdate.ts | 48 + .../types/CollectionUpdateWithHomepage.ts | 72 + src/collections/types/CreateCollection.ts | 47 + src/collections/types/RemoveCollection.ts | 26 + src/collections/types/SearchProducts.ts | 44 + .../types/UnassignCollectionProduct.ts | 77 + src/collections/urls.ts | 29 + src/collections/views/CollectionCreate.tsx | 78 + src/collections/views/CollectionDetails.tsx | 395 + src/collections/views/CollectionList.tsx | 262 + src/components/ActionDialog/ActionDialog.tsx | 80 + src/components/ActionDialog/index.ts | 2 + src/components/AddressEdit/AddressEdit.tsx | 187 + src/components/AddressEdit/index.ts | 2 + .../AddressFormatter/AddressFormatter.tsx | 48 + src/components/AddressFormatter/index.ts | 2 + src/components/AppHeader/AppHeader.tsx | 74 + src/components/AppHeader/index.ts | 2 + src/components/AppLayout/AppActionContext.tsx | 7 + src/components/AppLayout/AppHeaderContext.tsx | 7 + src/components/AppLayout/AppLayout.tsx | 355 + src/components/AppLayout/MenuList.tsx | 176 + src/components/AppLayout/MenuNested.tsx | 61 + src/components/AppLayout/ResponsiveDrawer.tsx | 61 + src/components/AppLayout/ThemeSwitch.tsx | 43 + src/components/AppLayout/consts.ts | 3 + src/components/AppLayout/index.ts | 2 + src/components/AppLayout/menuStructure.ts | 97 + src/components/AppProgress/index.tsx | 30 + .../AssignCategoryDialog.tsx | 172 + src/components/AssignCategoryDialog/index.ts | 2 + .../AssignCollectionDialog.tsx | 172 + .../AssignCollectionDialog/index.ts | 2 + .../AssignProductDialog.tsx | 176 + src/components/AssignProductDialog/index.ts | 2 + .../AutocompleteSelectMenu.tsx | 194 + .../AutocompleteSelectMenu/index.ts | 2 + src/components/CardMenu/CardMenu.tsx | 102 + src/components/CardMenu/index.ts | 2 + src/components/CardSpacer.tsx | 29 + src/components/CardTitle/CardTitle.tsx | 83 + src/components/CardTitle/index.ts | 2 + src/components/Checkbox/Checkbox.tsx | 121 + src/components/Checkbox/index.ts | 2 + src/components/Chip/Chip.tsx | 56 + src/components/Chip/index.ts | 2 + .../ConfirmButton/ConfirmButton.tsx | 188 + src/components/ConfirmButton/index.ts | 2 + src/components/ConfirmFormLeaveDialog.tsx | 62 + src/components/Container.tsx | 35 + src/components/ControlledCheckbox.tsx | 31 + src/components/ControlledSwitch.tsx | 58 + src/components/CountryList/CountryList.tsx | 183 + src/components/CountryList/index.ts | 2 + src/components/Date/Date.test.tsx | 44 + src/components/Date/Date.tsx | 42 + src/components/Date/DateContext.tsx | 6 + src/components/Date/DateProvider.tsx | 34 + src/components/Date/DateTime.tsx | 51 + src/components/Date/index.ts | 4 + src/components/Debounce.tsx | 28 + src/components/DebounceForm.tsx | 27 + .../DeleteFilterTabDialog.tsx | 46 + src/components/DeleteFilterTabDialog/index.ts | 2 + src/components/DraftRenderer.tsx | 17 + src/components/Dropzone.tsx | 3 + .../EditableTableCell/EditableTableCell.tsx | 116 + src/components/EditableTableCell/index.ts | 2 + .../ErrorMessageCard/ErrorMessageCard.tsx | 25 + src/components/ErrorMessageCard/index.ts | 1 + src/components/ErrorPage/ErrorPage.tsx | 100 + src/components/ErrorPage/index.ts | 2 + .../ExtendedPageHeader/ExtendedPageHeader.tsx | 55 + src/components/ExtendedPageHeader/index.ts | 2 + src/components/ExternalLink/ExternalLink.tsx | 36 + src/components/ExternalLink/index.ts | 2 + src/components/FileUpload/FileUpload.tsx | 51 + src/components/FileUpload/index.ts | 2 + src/components/Filter/Filter.tsx | 152 + src/components/Filter/FilterContent.tsx | 137 + src/components/Filter/FilterElement.tsx | 211 + src/components/Filter/index.ts | 5 + src/components/Filter/types.ts | 30 + src/components/FilterBar/FilterBar.tsx | 82 + src/components/FilterBar/index.ts | 2 + src/components/FilterCard/FilterCard.tsx | 33 + src/components/FilterCard/index.ts | 1 + src/components/Form/Form.tsx | 170 + src/components/Form/FormActions.tsx | 40 + src/components/Form/FormContext.tsx | 54 + src/components/Form/index.ts | 5 + src/components/FormSpacer.tsx | 27 + src/components/Grid/Grid.tsx | 56 + src/components/Grid/index.ts | 2 + src/components/Hr.tsx | 32 + .../IconButtonTableCell.tsx | 49 + src/components/IconButtonTableCell/index.ts | 2 + src/components/ImageTile/ImageTile.tsx | 83 + src/components/ImageTile/index.ts | 2 + src/components/ImageUpload/ImageUpload.tsx | 111 + src/components/ImageUpload/index.tsx | 2 + .../LanguageSwitch/LanguageSwitch.tsx | 131 + src/components/LanguageSwitch/index.ts | 2 + src/components/Link.tsx | 65 + src/components/ListField/ListField.tsx | 132 + src/components/ListField/index.ts | 2 + src/components/Locale/Locale.tsx | 11 + src/components/Locale/index.ts | 1 + src/components/MenuToggle.tsx | 44 + src/components/Money/Money.tsx | 25 + src/components/Money/index.ts | 17 + src/components/MoneyRange/MoneyRange.tsx | 46 + src/components/MoneyRange/index.ts | 2 + .../MultiAutocompleteSelectField.tsx | 181 + .../MultiAutocompleteSelectField/index.ts | 2 + .../MultiSelectField/MultiSelectField.tsx | 126 + src/components/MultiSelectField/index.ts | 2 + src/components/NotFoundPage/NotFoundPage.tsx | 94 + src/components/NotFoundPage/index.ts | 2 + src/components/PageHeader/PageHeader.tsx | 43 + src/components/PageHeader/index.ts | 2 + src/components/Percent/Percent.tsx | 20 + src/components/Percent/index.ts | 2 + src/components/PhoneField/PhoneField.tsx | 58 + src/components/PhoneField/index.ts | 2 + src/components/PriceField/PriceField.tsx | 90 + src/components/PriceField/index.ts | 2 + src/components/ProductList/ProductList.tsx | 194 + src/components/ProductList/index.ts | 1 + src/components/RichTextEditor/ImageEntity.tsx | 112 + src/components/RichTextEditor/ImageSource.tsx | 100 + src/components/RichTextEditor/LinkEntity.tsx | 132 + src/components/RichTextEditor/LinkSource.tsx | 87 + .../RichTextEditor/RichTextEditor.tsx | 343 + src/components/RichTextEditor/index.ts | 2 + .../SaveButtonBar/SaveButtonBar.tsx | 147 + src/components/SaveButtonBar/index.ts | 2 + .../SaveFilterTabDialog.tsx | 87 + src/components/SaveFilterTabDialog/index.ts | 2 + src/components/SeoForm/SeoForm.tsx | 177 + src/components/SeoForm/index.ts | 2 + src/components/Shop/index.tsx | 20 + src/components/Shop/query.ts | 34 + src/components/Shop/types/ShopInfo.ts | 51 + .../SingleAutocompleteSelectField.tsx | 223 + .../SingleAutocompleteSelectField/index.ts | 2 + .../SingleSelectField/SingleSelectField.tsx | 95 + src/components/SingleSelectField/index.ts | 2 + src/components/Skeleton.tsx | 44 + src/components/StatusLabel/StatusLabel.tsx | 83 + src/components/StatusLabel/index.ts | 2 + src/components/Tab/Tab.tsx | 60 + src/components/Tab/TabContainer.tsx | 27 + src/components/Tab/Tabs.tsx | 31 + src/components/Tab/index.ts | 6 + .../TableCellAvatar/TableCellAvatar.tsx | 57 + src/components/TableCellAvatar/index.ts | 2 + src/components/TableFilter/FilterChips.tsx | 178 + src/components/TableFilter/FilterTab.tsx | 58 + src/components/TableFilter/FilterTabs.tsx | 35 + src/components/TableFilter/index.ts | 5 + src/components/TableHead/TableHead.tsx | 133 + src/components/TableHead/index.ts | 2 + .../TablePagination/TablePagination.tsx | 112 + .../TablePaginationActions.tsx | 112 + src/components/TablePagination/index.ts | 3 + .../TextFieldWithChoice.tsx | 132 + src/components/TextFieldWithChoice/index.ts | 2 + src/components/Theme/ThemeProvider.tsx | 99 + src/components/Theme/index.ts | 2 + src/components/Timeline/Timeline.tsx | 106 + src/components/Timeline/TimelineEvent.tsx | 100 + src/components/Timeline/TimelineNote.tsx | 107 + src/components/Timeline/index.ts | 4 + src/components/Timezone/Timezone.tsx | 10 + src/components/Timezone/index.ts | 2 + .../VisibilityCard/VisibilityCard.tsx | 119 + src/components/VisibilityCard/index.ts | 2 + src/components/Weight/Weight.tsx | 18 + src/components/Weight/index.ts | 2 + src/components/WeightRange/WeightRange.tsx | 35 + src/components/WeightRange/index.ts | 2 + src/components/WindowTitle/index.tsx | 18 + src/components/messages/MessageManager.tsx | 105 + src/components/messages/index.ts | 11 + src/config.ts | 12 + src/configuration/ConfigurationPage.tsx | 110 + src/configuration/index.tsx | 94 + src/containers/BaseSearch.tsx | 66 + src/containers/SearchCategories/index.tsx | 24 + .../types/SearchCategories.ts | 33 + src/containers/SearchCollections/index.tsx | 24 + .../types/SearchCollections.ts | 33 + src/containers/SearchCustomers/index.ts | 24 + .../SearchCustomers/types/SearchCustomers.ts | 33 + src/containers/SearchPages/index.tsx | 19 + .../SearchPages/types/SearchPages.ts | 33 + src/containers/SearchProducts/index.tsx | 27 + .../SearchProducts/types/SearchProducts.ts | 39 + .../CustomerAddress/CustomerAddress.tsx | 115 + .../components/CustomerAddress/index.ts | 2 + .../CustomerAddressDialog.tsx | 116 + .../components/CustomerAddressDialog/index.ts | 2 + .../CustomerAddressListPage.tsx | 144 + .../CustomerAddressListPage/index.ts | 2 + .../CustomerAddresses/CustomerAddresses.tsx | 102 + .../components/CustomerAddresses/index.ts | 2 + .../CustomerCreateAddress.tsx | 62 + .../components/CustomerCreateAddress/index.ts | 2 + .../CustomerCreateDetails.tsx | 87 + .../components/CustomerCreateDetails/index.ts | 2 + .../CustomerCreateNote/CustomerCreateNote.tsx | 50 + .../components/CustomerCreateNote/index.ts | 2 + .../CustomerCreatePage/CustomerCreatePage.tsx | 105 + .../components/CustomerCreatePage/index.ts | 2 + .../CustomerDetails/CustomerDetails.tsx | 145 + .../components/CustomerDetails/index.ts | 2 + .../CustomerDetailsPage.tsx | 109 + .../components/CustomerDetailsPage/index.ts | 2 + .../components/CustomerList/CustomerList.tsx | 147 + .../components/CustomerList/index.ts | 2 + .../CustomerListPage/CustomerListPage.tsx | 44 + .../components/CustomerListPage/index.ts | 2 + .../CustomerOrders/CustomerOrders.tsx | 137 + .../components/CustomerOrders/index.ts | 2 + .../CustomerStats/CustomerStats.tsx | 79 + .../components/CustomerStats/index.ts | 2 + src/customers/fixtures.ts | 1072 + src/customers/index.tsx | 76 + src/customers/mutations.ts | 188 + src/customers/queries.ts | 153 + src/customers/types.ts | 33 + src/customers/types/BulkRemoveCustomers.ts | 26 + src/customers/types/CreateCustomer.ts | 34 + src/customers/types/CreateCustomerAddress.ts | 96 + src/customers/types/CustomerAddresses.ts | 58 + .../types/CustomerAddressesFragment.ts | 50 + src/customers/types/CustomerCreateData.ts | 22 + src/customers/types/CustomerDetails.ts | 123 + .../types/CustomerDetailsFragment.ts | 65 + src/customers/types/CustomerFragment.ts | 15 + src/customers/types/ListCustomers.ts | 51 + src/customers/types/RemoveCustomer.ts | 26 + src/customers/types/RemoveCustomerAddress.ts | 70 + .../types/SetCustomerDefaultAddress.ts | 74 + src/customers/types/UpdateCustomer.ts | 88 + src/customers/types/UpdateCustomerAddress.ts | 52 + src/customers/urls.ts | 35 + src/customers/views/CustomerAddresses.tsx | 251 + src/customers/views/CustomerCreate.tsx | 95 + src/customers/views/CustomerDetails.tsx | 166 + src/customers/views/CustomerList.tsx | 153 + .../DiscountCategories/DiscountCategories.tsx | 173 + .../components/DiscountCategories/index.ts | 2 + .../DiscountCollections.tsx | 171 + .../components/DiscountCollections/index.ts | 2 + .../DiscountCountrySelectDialog.tsx | 190 + .../DiscountCountrySelectDialog/index.ts | 2 + .../DiscountProducts/DiscountProducts.tsx | 199 + .../components/DiscountProducts/index.ts | 2 + .../SaleCreatePage/SaleCreatePage.tsx | 85 + .../components/SaleCreatePage/index.ts | 2 + .../SaleDetailsPage/SaleDetailsPage.tsx | 238 + .../components/SaleDetailsPage/index.ts | 2 + .../components/SaleInfo/SaleInfo.tsx | 62 + src/discounts/components/SaleInfo/index.ts | 2 + .../components/SaleList/SaleList.tsx | 197 + src/discounts/components/SaleList/index.ts | 2 + .../components/SaleListPage/SaleListPage.tsx | 32 + .../components/SaleListPage/index.ts | 2 + .../components/SalePricing/SalePricing.tsx | 117 + src/discounts/components/SalePricing/index.ts | 2 + .../components/SaleSummary/SaleSummary.tsx | 82 + src/discounts/components/SaleSummary/index.ts | 2 + .../VoucherCreatePage/VoucherCreatePage.tsx | 101 + .../components/VoucherCreatePage/index.ts | 2 + .../VoucherDetailsPage/VoucherDetailsPage.tsx | 290 + .../components/VoucherDetailsPage/index.ts | 2 + .../components/VoucherInfo/VoucherInfo.tsx | 101 + src/discounts/components/VoucherInfo/index.ts | 2 + .../components/VoucherList/VoucherList.tsx | 243 + src/discounts/components/VoucherList/index.ts | 2 + .../VoucherListPage/VoucherListPage.tsx | 56 + .../components/VoucherListPage/index.ts | 2 + .../VoucherOptions/VoucherOptions.tsx | 177 + .../components/VoucherOptions/index.ts | 2 + .../VoucherSummary/VoucherSummary.tsx | 126 + .../components/VoucherSummary/index.ts | 2 + src/discounts/fixtures.ts | 303 + src/discounts/index.tsx | 89 + src/discounts/mutations.ts | 276 + src/discounts/queries.ts | 237 + src/discounts/translations.ts | 10 + src/discounts/types/SaleBulkDelete.ts | 26 + src/discounts/types/SaleCataloguesAdd.ts | 151 + src/discounts/types/SaleCataloguesRemove.ts | 151 + src/discounts/types/SaleCreate.ts | 39 + src/discounts/types/SaleDelete.ts | 26 + src/discounts/types/SaleDetails.ts | 138 + src/discounts/types/SaleDetailsFragment.ts | 126 + src/discounts/types/SaleFragment.ts | 19 + src/discounts/types/SaleList.ts | 49 + src/discounts/types/SaleUpdate.ts | 40 + src/discounts/types/VoucherBulkDelete.ts | 26 + src/discounts/types/VoucherCataloguesAdd.ts | 170 + .../types/VoucherCataloguesRemove.ts | 170 + src/discounts/types/VoucherCreate.ts | 54 + src/discounts/types/VoucherDelete.ts | 26 + src/discounts/types/VoucherDetails.ts | 157 + src/discounts/types/VoucherDetailsFragment.ts | 145 + src/discounts/types/VoucherFragment.ts | 34 + src/discounts/types/VoucherList.ts | 64 + src/discounts/types/VoucherUpdate.ts | 55 + src/discounts/urls.ts | 61 + src/discounts/views/SaleCreate.tsx | 77 + src/discounts/views/SaleDetails.tsx | 548 + src/discounts/views/SaleList.tsx | 146 + src/discounts/views/VoucherCreate.tsx | 88 + src/discounts/views/VoucherDetails.tsx | 625 + src/discounts/views/VoucherList.tsx | 147 + src/fixtures.ts | 125 + .../HomeActivityCard/HomeActivityCard.tsx | 74 + .../HomeActivityCard/activityMessages.ts | 26 + src/home/components/HomeActivityCard/index.ts | 2 + .../HomeAnalyticsCard/HomeAnalyticsCard.tsx | 93 + .../components/HomeAnalyticsCard/index.ts | 2 + src/home/components/HomeHeader/HomeHeader.tsx | 53 + src/home/components/HomeHeader/index.ts | 2 + .../HomeNotificationTable.tsx | 128 + .../components/HomeNotificationTable/index.ts | 2 + src/home/components/HomePage/HomePage.tsx | 123 + src/home/components/HomePage/index.ts | 2 + .../HomeProductListCard.tsx | 130 + .../components/HomeProductListCard/index.ts | 2 + src/home/components/HomeScreen.tsx | 40 + src/home/fixtures.ts | 340 + src/home/index.tsx | 7 + src/home/queries.ts | 77 + src/home/types/Home.ts | 136 + src/home/views/index.tsx | 62 + src/hooks/useBulkActions.ts | 45 + src/hooks/useDateLocalize.ts | 15 + src/hooks/useLocale.ts | 9 + src/hooks/useNavigator.ts | 21 + src/hooks/useNotifier.ts | 10 + src/hooks/usePaginator.ts | 85 + src/hooks/useScroll.ts | 25 + src/hooks/useShop.ts | 8 + src/hooks/useTheme.ts | 9 + src/hooks/useUser.ts | 9 + src/i18n.ts | 18 + src/icons/AccountCircle.tsx | 20 + src/icons/ArrowDropdown.tsx | 10 + src/icons/Ballot.tsx | 17 + src/icons/BoldIcon.tsx | 10 + src/icons/Calendar.tsx | 28 + src/icons/Draggable.tsx | 31 + src/icons/Folder.tsx | 12 + src/icons/HeaderOne.tsx | 11 + src/icons/HeaderThree.tsx | 11 + src/icons/HeaderTwo.tsx | 11 + src/icons/Home.tsx | 12 + src/icons/Image.tsx | 26 + src/icons/ItalicIcon.tsx | 10 + src/icons/LinkIcon.tsx | 10 + src/icons/LocalShipping.tsx | 12 + src/icons/Monetization.tsx | 14 + src/icons/Moon.tsx | 24 + src/icons/Navigation.tsx | 45 + src/icons/NoPhoto.tsx | 10 + src/icons/OrderedListIcon.tsx | 10 + src/icons/Orders.tsx | 28 + src/icons/Pages.tsx | 28 + src/icons/ProductTypes.tsx | 28 + src/icons/QuotationIcon.tsx | 10 + src/icons/Sales.tsx | 28 + src/icons/ShippingMethods.tsx | 28 + src/icons/Shop.tsx | 14 + src/icons/SiteSettings.tsx | 28 + src/icons/StaffMembers.tsx | 28 + src/icons/StoreMall.tsx | 12 + src/icons/StrikethroughIcon.tsx | 10 + src/icons/Sun.tsx | 14 + src/icons/Taxes.tsx | 28 + src/icons/Truck.tsx | 10 + src/icons/UnorderedListIcon.tsx | 10 + src/icons/Unstyled.tsx | 14 + src/index.html | 11 + src/index.tsx | 236 + src/misc.ts | 238 + src/mutations.tsx | 62 + .../MenuCreateDialog/MenuCreateDialog.tsx | 79 + .../components/MenuCreateDialog/index.ts | 2 + .../MenuDetailsPage/MenuDetailsPage.tsx | 126 + .../__snapshots__/tree.test.ts.snap | 57 + .../components/MenuDetailsPage/index.ts | 2 + .../components/MenuDetailsPage/tree.test.ts | 185 + .../components/MenuDetailsPage/tree.ts | 134 + .../MenuItemDialog/MenuItemDialog.tsx | 268 + .../components/MenuItemDialog/index.ts | 2 + .../components/MenuItems/MenuItems.tsx | 279 + .../MenuItems/__snapshots__/tree.test.ts.snap | 28 + src/navigation/components/MenuItems/index.ts | 3 + .../components/MenuItems/tree.test.ts | 88 + src/navigation/components/MenuItems/tree.ts | 117 + .../components/MenuList/MenuList.tsx | 143 + src/navigation/components/MenuList/index.ts | 2 + .../components/MenuListPage/MenuListPage.tsx | 41 + .../components/MenuListPage/index.ts | 2 + .../MenuProperties/MenuProperties.tsx | 36 + .../components/MenuProperties/index.ts | 2 + src/navigation/fixtures.ts | 113 + src/navigation/index.tsx | 34 + src/navigation/mutations.ts | 143 + src/navigation/queries.ts | 103 + src/navigation/types/MenuBulkDelete.ts | 26 + src/navigation/types/MenuCreate.ts | 34 + src/navigation/types/MenuDelete.ts | 26 + src/navigation/types/MenuDetails.ts | 238 + src/navigation/types/MenuDetailsFragment.ts | 230 + src/navigation/types/MenuFragment.ts | 19 + src/navigation/types/MenuItemCreate.ts | 256 + src/navigation/types/MenuItemFragment.ts | 37 + .../types/MenuItemNestedFragment.ts | 223 + src/navigation/types/MenuItemUpdate.ts | 60 + src/navigation/types/MenuList.ts | 49 + src/navigation/types/MenuUpdate.ts | 55 + src/navigation/urls.ts | 20 + src/navigation/views/MenuDetails/index.tsx | 397 + .../views/MenuDetails/successHandlers.ts | 78 + src/navigation/views/MenuDetails/utils.ts | 68 + src/navigation/views/MenuList.tsx | 256 + .../OrderAddressEditDialog.tsx | 90 + .../OrderAddressEditDialog/index.ts | 2 + .../OrderBulkCancelDialog.tsx | 51 + .../components/OrderBulkCancelDialog/index.ts | 2 + .../OrderCancelDialog/OrderCancelDialog.tsx | 104 + .../components/OrderCancelDialog/index.ts | 2 + .../OrderCustomer/OrderCustomer.tsx | 286 + src/orders/components/OrderCustomer/index.ts | 2 + .../OrderCustomerEditDialog.tsx | 110 + .../OrderCustomerEditDialog/index.ts | 2 + .../OrderCustomerNote/OrderCustomerNote.tsx | 36 + .../components/OrderCustomerNote/index.ts | 2 + .../OrderDetailsPage/OrderDetailsPage.tsx | 178 + .../components/OrderDetailsPage/index.ts | 2 + .../OrderDraftCancelDialog.tsx | 43 + .../OrderDraftCancelDialog/index.ts | 2 + .../OrderDraftDetails/OrderDraftDetails.tsx | 62 + .../components/OrderDraftDetails/index.ts | 2 + .../OrderDraftDetailsProducts.tsx | 168 + .../OrderDraftDetailsProducts/index.ts | 2 + .../OrderDraftDetailsSummary.tsx | 123 + .../OrderDraftDetailsSummary/index.ts | 2 + .../OrderDraftFinalizeDialog.tsx | 92 + .../OrderDraftFinalizeDialog/index.ts | 2 + .../OrderDraftList/OrderDraftList.tsx | 189 + src/orders/components/OrderDraftList/index.ts | 2 + .../OrderDraftListPage/OrderDraftListPage.tsx | 39 + .../components/OrderDraftListPage/index.ts | 2 + .../OrderDraftPage/OrderDraftPage.tsx | 155 + src/orders/components/OrderDraftPage/index.ts | 2 + .../OrderFulfillment/OrderFulfillment.tsx | 198 + .../components/OrderFulfillment/index.ts | 2 + .../OrderFulfillmentCancelDialog.tsx | 92 + .../OrderFulfillmentCancelDialog/index.ts | 2 + .../OrderFulfillmentDialog.tsx | 185 + .../OrderFulfillmentDialog/index.ts | 2 + .../OrderFulfillmentTrackingDialog.tsx | 65 + .../OrderFulfillmentTrackingDialog/index.ts | 2 + .../components/OrderHistory/OrderHistory.tsx | 208 + src/orders/components/OrderHistory/index.ts | 2 + src/orders/components/OrderList/OrderList.tsx | 224 + src/orders/components/OrderList/index.ts | 2 + .../OrderListFilter/OrderListFilter.tsx | 128 + .../components/OrderListFilter/index.ts | 2 + .../OrderListPage/OrderListPage.tsx | 65 + src/orders/components/OrderListPage/index.ts | 2 + .../OrderMarkAsPaidDialog.tsx | 33 + .../components/OrderMarkAsPaidDialog/index.ts | 2 + .../components/OrderPayment/OrderPayment.tsx | 231 + src/orders/components/OrderPayment/index.ts | 2 + .../OrderPaymentDialog/OrderPaymentDialog.tsx | 89 + .../components/OrderPaymentDialog/index.ts | 2 + .../OrderPaymentVoidDialog.tsx | 45 + .../OrderPaymentVoidDialog/index.ts | 2 + .../OrderProductAddDialog.tsx | 349 + .../components/OrderProductAddDialog/index.ts | 2 + .../OrderShippingMethodEditDialog.tsx | 122 + .../OrderShippingMethodEditDialog/index.ts | 2 + .../OrderUnfulfilledItems.tsx | 128 + .../components/OrderUnfulfilledItems/index.ts | 2 + src/orders/containers/OrderOperations.tsx | 342 + src/orders/fixtures.ts | 1218 + src/orders/index.tsx | 60 + src/orders/mutations.ts | 472 + src/orders/queries.ts | 315 + src/orders/types/AddressFragment.ts | 29 + src/orders/types/OrderAddNote.ts | 55 + src/orders/types/OrderBulkCancel.ts | 27 + src/orders/types/OrderCancel.ts | 282 + src/orders/types/OrderCapture.ts | 282 + src/orders/types/OrderCreateFulfillment.ts | 282 + src/orders/types/OrderDetails.ts | 282 + src/orders/types/OrderDetailsFragment.ts | 261 + src/orders/types/OrderDraftBulkCancel.ts | 26 + src/orders/types/OrderDraftCancel.ts | 281 + src/orders/types/OrderDraftCreate.ts | 28 + src/orders/types/OrderDraftFinalize.ts | 281 + src/orders/types/OrderDraftList.ts | 84 + src/orders/types/OrderDraftUpdate.ts | 282 + src/orders/types/OrderEventFragment.ts | 28 + src/orders/types/OrderFulfillmentCancel.ts | 282 + .../types/OrderFulfillmentUpdateTracking.ts | 282 + src/orders/types/OrderLineDelete.ts | 281 + src/orders/types/OrderLineFragment.ts | 42 + src/orders/types/OrderLineUpdate.ts | 282 + src/orders/types/OrderLinesAdd.ts | 282 + src/orders/types/OrderList.ts | 86 + src/orders/types/OrderMarkAsPaid.ts | 281 + src/orders/types/OrderRefund.ts | 282 + src/orders/types/OrderRelease.ts | 267 + src/orders/types/OrderShippingMethodUpdate.ts | 69 + src/orders/types/OrderShippingMethods.ts | 31 + src/orders/types/OrderUpdate.ts | 82 + src/orders/types/OrderVoid.ts | 281 + src/orders/types/SearchOrderVariant.ts | 63 + src/orders/urls.ts | 72 + .../OrderDetails/OrderDetailsMessages.tsx | 314 + src/orders/views/OrderDetails/index.tsx | 673 + src/orders/views/OrderDraftList.tsx | 171 + src/orders/views/OrderList/OrderList.tsx | 270 + src/orders/views/OrderList/filters.ts | 174 + src/orders/views/OrderList/index.ts | 2 + .../PageDetailsPage/PageDetailsPage.tsx | 136 + src/pages/components/PageDetailsPage/index.ts | 2 + src/pages/components/PageInfo/PageInfo.tsx | 69 + src/pages/components/PageInfo/index.ts | 2 + src/pages/components/PageList/PageList.tsx | 151 + src/pages/components/PageList/index.ts | 2 + .../components/PageListPage/PageListPage.tsx | 62 + src/pages/components/PageListPage/index.ts | 2 + src/pages/components/PageSlug/PageSlug.tsx | 45 + src/pages/components/PageSlug/index.ts | 2 + src/pages/fixtures.ts | 45 + src/pages/index.tsx | 51 + src/pages/mutations.ts | 95 + src/pages/queries.ts | 60 + src/pages/types/PageBulkPublish.ts | 27 + src/pages/types/PageBulkRemove.ts | 26 + src/pages/types/PageCreate.ts | 41 + src/pages/types/PageDetails.ts | 27 + src/pages/types/PageDetailsFragment.ts | 19 + src/pages/types/PageFragment.ts | 15 + src/pages/types/PageList.ts | 45 + src/pages/types/PageRemove.ts | 26 + src/pages/types/PageUpdate.ts | 42 + src/pages/urls.ts | 23 + src/pages/views/PageCreate.tsx | 84 + src/pages/views/PageDetails.tsx | 141 + src/pages/views/PageList.tsx | 252 + .../ProductTypeAttributeEditDialog.tsx | 99 + .../ProductTypeAttributeEditDialog/index.ts | 2 + .../ProductTypeAttributes.tsx | 139 + .../components/ProductTypeAttributes/index.ts | 2 + .../ProductTypeCreatePage.tsx | 102 + .../components/ProductTypeCreatePage/index.ts | 2 + .../ProductTypeDetails/ProductTypeDetails.tsx | 42 + .../components/ProductTypeDetails/index.ts | 2 + .../ProductTypeDetailsPage.tsx | 179 + .../ProductTypeDetailsPage/index.ts | 2 + .../ProductTypeList/ProductTypeList.tsx | 174 + .../components/ProductTypeList/index.ts | 2 + .../ProductTypeListPage.tsx | 37 + .../components/ProductTypeListPage/index.ts | 2 + .../ProductTypeShipping.tsx | 53 + .../components/ProductTypeShipping/index.ts | 2 + .../ProductTypeTaxes/ProductTypeTaxes.tsx | 44 + .../components/ProductTypeTaxes/index.ts | 2 + .../containers/ProductTypeOperations.tsx | 117 + src/productTypes/fixtures.ts | 580 + src/productTypes/index.tsx | 56 + src/productTypes/mutations.ts | 164 + src/productTypes/queries.ts | 108 + src/productTypes/types/AttributeCreate.ts | 79 + src/productTypes/types/AttributeDelete.ts | 77 + src/productTypes/types/AttributeFragment.ts | 22 + src/productTypes/types/AttributeUpdate.ts | 45 + .../types/ProductTypeBulkDelete.ts | 26 + src/productTypes/types/ProductTypeCreate.ts | 77 + .../types/ProductTypeCreateData.ts | 18 + src/productTypes/types/ProductTypeDelete.ts | 32 + src/productTypes/types/ProductTypeDetails.ts | 71 + .../types/ProductTypeDetailsFragment.ts | 57 + src/productTypes/types/ProductTypeFragment.ts | 18 + src/productTypes/types/ProductTypeList.ts | 48 + src/productTypes/types/ProductTypeUpdate.ts | 78 + src/productTypes/urls.ts | 32 + src/productTypes/views/ProductTypeCreate.tsx | 74 + src/productTypes/views/ProductTypeList.tsx | 156 + .../views/ProductTypeUpdate/errors.tsx | 46 + .../views/ProductTypeUpdate/index.tsx | 350 + .../views/ProductTypeUpdate/urls.ts | 0 .../ProductCategoryAndCollectionsForm.tsx | 59 + .../index.ts | 2 + .../ProductCreatePage/ProductCreatePage.tsx | 229 + .../components/ProductCreatePage/index.ts | 2 + .../ProductDetailsForm/ProductDetailsForm.tsx | 80 + .../components/ProductDetailsForm/index.ts | 2 + .../ProductImageNavigation.tsx | 94 + .../ProductImageNavigation/index.ts | 2 + .../ProductImagePage/ProductImagePage.tsx | 136 + .../components/ProductImagePage/index.ts | 2 + .../ProductImages/ProductImages.tsx | 242 + .../components/ProductImages/index.ts | 2 + .../ProductListCard/ProductListCard.tsx | 68 + .../components/ProductListCard/index.ts | 2 + .../ProductListFilter/ProductListFilter.tsx | 95 + .../components/ProductListFilter/index.ts | 2 + .../ProductOrganization.tsx | 319 + .../components/ProductOrganization/index.ts | 2 + .../ProductPricing/ProductPricing.tsx | 63 + .../components/ProductPricing/index.ts | 2 + .../components/ProductStock/ProductStock.tsx | 73 + src/products/components/ProductStock/index.ts | 2 + .../ProductUpdatePage/ProductUpdatePage.tsx | 314 + .../components/ProductUpdatePage/index.ts | 2 + .../ProductVariantAttributes.tsx | 139 + .../ProductVariantAttributes/index.ts | 2 + .../ProductVariantCreatePage.tsx | 130 + .../ProductVariantCreatePage/index.ts | 2 + .../ProductVariantDeleteDialog.tsx | 82 + .../ProductVariantDeleteDialog/index.ts | 2 + .../ProductVariantImageSelectDialog.tsx | 107 + .../ProductVariantImageSelectDialog/index.ts | 2 + .../ProductVariantImages.tsx | 94 + .../components/ProductVariantImages/index.ts | 2 + .../ProductVariantNavigation.tsx | 122 + .../ProductVariantNavigation/index.ts | 2 + .../ProductVariantPage/ProductVariantPage.tsx | 183 + .../components/ProductVariantPage/index.ts | 2 + .../ProductVariantPrice.tsx | 81 + .../components/ProductVariantPrice/index.ts | 2 + .../ProductVariantStock.tsx | 89 + .../components/ProductVariantStock/index.ts | 2 + .../ProductVariants/ProductVariants.tsx | 203 + .../components/ProductVariants/index.ts | 2 + .../containers/ProductImagesReorder.tsx | 57 + .../containers/ProductUpdateOperations.tsx | 155 + .../containers/ProductVariantOperations.tsx | 77 + src/products/fixtures.ts | 2424 + src/products/index.tsx | 113 + src/products/mutations.ts | 468 + src/products/queries.ts | 358 + src/products/types/Money.ts | 13 + src/products/types/Product.ts | 166 + src/products/types/ProductCreate.ts | 199 + src/products/types/ProductCreateData.ts | 45 + src/products/types/ProductDelete.ts | 32 + src/products/types/ProductDetails.ts | 174 + src/products/types/ProductFragment.ts | 34 + src/products/types/ProductImage.ts | 14 + src/products/types/ProductImageById.ts | 37 + src/products/types/ProductImageCreate.ts | 188 + src/products/types/ProductImageDelete.ts | 31 + src/products/types/ProductImageFragment.ts | 15 + src/products/types/ProductImageReorder.ts | 42 + src/products/types/ProductImageUpdate.ts | 187 + src/products/types/ProductList.ts | 67 + src/products/types/ProductUpdate.ts | 197 + src/products/types/ProductVariant.ts | 103 + .../types/ProductVariantBulkDelete.ts | 26 + .../types/ProductVariantCreateData.ts | 73 + src/products/types/ProductVariantDetails.ts | 111 + src/products/types/SimpleProductUpdate.ts | 308 + src/products/types/VariantCreate.ts | 131 + src/products/types/VariantDelete.ts | 32 + src/products/types/VariantImageAssign.ts | 124 + src/products/types/VariantImageUnassign.ts | 124 + src/products/types/VariantUpdate.ts | 131 + src/products/types/productBulkDelete.ts | 26 + src/products/types/productBulkPublish.ts | 27 + src/products/urls.ts | 73 + src/products/views/ProductCreate.tsx | 136 + src/products/views/ProductImage.tsx | 132 + .../views/ProductList/ProductList.tsx | 363 + src/products/views/ProductList/filters.ts | 190 + src/products/views/ProductList/index.ts | 2 + src/products/views/ProductUpdate.tsx | 366 + src/products/views/ProductVariant.tsx | 169 + src/products/views/ProductVariantCreate.tsx | 111 + src/queries.tsx | 169 + .../ShippingWeightUnitForm.tsx | 74 + .../ShippingWeightUnitForm/index.ts | 2 + .../ShippingZoneCountriesAssignDialog.tsx | 233 + .../index.ts | 2 + .../ShippingZoneCreatePage.tsx | 130 + .../ShippingZoneCreatePage/index.ts | 2 + .../ShippingZoneDetailsPage.tsx | 135 + .../ShippingZoneDetailsPage/index.ts | 2 + .../ShippingZoneInfo/ShippingZoneInfo.tsx | 38 + .../components/ShippingZoneInfo/index.ts | 2 + .../ShippingZoneRateDialog.tsx | 301 + .../ShippingZoneRateDialog/index.ts | 2 + .../ShippingZoneRates/ShippingZoneRates.tsx | 163 + .../components/ShippingZoneRates/index.ts | 2 + .../ShippingZonesList/ShippingZonesList.tsx | 174 + .../components/ShippingZonesList/index.ts | 2 + .../ShippingZonesListPage.tsx | 47 + .../components/ShippingZonesListPage/index.ts | 2 + src/shipping/fixtures.ts | 1648 + src/shipping/index.tsx | 52 + src/shipping/mutations.ts | 209 + src/shipping/queries.ts | 93 + src/shipping/types/BulkDeleteShippingRate.ts | 26 + src/shipping/types/BulkDeleteShippingZone.ts | 26 + src/shipping/types/CreateShippingRate.ts | 86 + src/shipping/types/CreateShippingZone.ts | 43 + src/shipping/types/DeleteShippingRate.ts | 86 + src/shipping/types/DeleteShippingZone.ts | 26 + src/shipping/types/ShippingMethodFragment.ts | 51 + src/shipping/types/ShippingZone.ts | 74 + .../types/ShippingZoneDetailsFragment.ts | 66 + src/shipping/types/ShippingZoneFragment.ts | 20 + src/shipping/types/ShippingZones.ts | 50 + src/shipping/types/UpdateDefaultWeightUnit.ts | 34 + src/shipping/types/UpdateShippingRate.ts | 72 + src/shipping/types/UpdateShippingZone.ts | 44 + src/shipping/urls.ts | 39 + src/shipping/views/ShippingZoneCreate.tsx | 59 + .../ShippingZoneDetailsDialogs.tsx | 240 + .../ShippingZoneOperations.tsx | 113 + .../views/ShippingZoneDetails/index.tsx | 239 + src/shipping/views/ShippingZonesList.tsx | 272 + .../SiteSettingsDetails.tsx | 81 + .../components/SiteSettingsDetails/index.ts | 2 + .../SiteSettingsKeyDialog.tsx | 102 + .../components/SiteSettingsKeyDialog/index.ts | 2 + .../SiteSettingsKeys/SiteSettingsKeys.tsx | 118 + .../components/SiteSettingsKeys/index.ts | 2 + .../SiteSettingsPage/SiteSettingsPage.tsx | 98 + .../components/SiteSettingsPage/index.ts | 2 + src/siteSettings/fixtures.ts | 19 + src/siteSettings/index.tsx | 18 + src/siteSettings/mutations.ts | 91 + src/siteSettings/queries.ts | 28 + src/siteSettings/types/AuthorizationKeyAdd.ts | 49 + .../types/AuthorizationKeyDelete.ts | 48 + src/siteSettings/types/ShopFragment.ts | 28 + src/siteSettings/types/ShopSettingsUpdate.ts | 73 + src/siteSettings/types/SiteSettings.ts | 32 + src/siteSettings/urls.ts | 11 + src/siteSettings/views/index.tsx | 201 + .../StaffAddMemberDialog.tsx | 154 + .../components/StaffAddMemberDialog/index.ts | 2 + .../StaffDetailsPage/StaffDetailsPage.tsx | 125 + .../components/StaffDetailsPage/index.ts | 2 + src/staff/components/StaffList/StaffList.tsx | 172 + src/staff/components/StaffList/index.ts | 2 + .../StaffListPage/StaffListPage.tsx | 42 + src/staff/components/StaffListPage/index.ts | 2 + .../StaffPermissions/StaffPermissions.tsx | 121 + .../components/StaffPermissions/index.ts | 2 + .../StaffProperties/StaffProperties.tsx | 201 + src/staff/components/StaffProperties/index.ts | 2 + .../components/StaffStatus/StaffStatus.tsx | 40 + src/staff/components/StaffStatus/index.ts | 2 + src/staff/fixtures.ts | 238 + src/staff/index.tsx | 51 + src/staff/mutations.ts | 116 + src/staff/queries.ts | 77 + src/staff/types/StaffAvatarDelete.ts | 34 + src/staff/types/StaffAvatarUpdate.ts | 38 + src/staff/types/StaffList.ts | 67 + src/staff/types/StaffMemberAdd.ts | 51 + src/staff/types/StaffMemberDelete.ts | 26 + src/staff/types/StaffMemberDetails.ts | 51 + src/staff/types/StaffMemberDetailsFragment.ts | 31 + src/staff/types/StaffMemberFragment.ts | 22 + src/staff/types/StaffMemberUpdate.ts | 52 + src/staff/urls.ts | 25 + src/staff/views/StaffDetails.tsx | 226 + src/staff/views/StaffList.tsx | 130 + src/storybook/.babelrc | 3 + src/storybook/CardDecorator.tsx | 16 + src/storybook/Decorator.tsx | 28 + src/storybook/Stories.test.ts | 27 + .../__snapshots__/Stories.test.ts.snap | 83985 ++++++++++++++++ src/storybook/config.js | 151 + src/storybook/misc.ts | 4 + src/storybook/mock.tsx | 73 + src/storybook/stories/auth/LoginLoading.tsx | 9 + src/storybook/stories/auth/LoginPage.tsx | 19 + .../stories/categories/CategoryCreatePage.tsx | 22 + .../stories/categories/CategoryListPage.tsx | 25 + .../stories/categories/CategoryProducts.tsx | 96 + .../stories/categories/CategoryUpdatePage.tsx | 70 + .../collections/CollectionCreatePage.tsx | 21 + .../collections/CollectionDetailsPage.tsx | 52 + .../collections/CollectionListPage.tsx | 22 + .../stories/components/ActionDialog.tsx | 19 + .../stories/components/AddressEdit.tsx | 30 + .../stories/components/AddressFormatter.tsx | 15 + .../components/AutocompleteSelectMenu.tsx | 115 + src/storybook/stories/components/CardMenu.tsx | 15 + src/storybook/stories/components/Checkbox.tsx | 39 + src/storybook/stories/components/Chip.tsx | 16 + src/storybook/stories/components/Date.tsx | 12 + src/storybook/stories/components/DateTime.tsx | 14 + .../components/DeleteFilterTabDialog.tsx | 19 + .../stories/components/EditableTableCell.tsx | 34 + .../stories/components/ErrorMessageCard.tsx | 8 + .../stories/components/ErrorPage.tsx | 14 + .../stories/components/ExternalLink.tsx | 18 + .../stories/components/FileUpload.tsx | 10 + src/storybook/stories/components/Filter.tsx | 124 + src/storybook/stories/components/Money.tsx | 18 + .../stories/components/MoneyRange.tsx | 24 + .../MultiAutocompleteSelectField.tsx | 106 + .../stories/components/MultiSelectField.tsx | 81 + .../stories/components/NotFoundPage.tsx | 9 + .../stories/components/PageHeader.tsx | 19 + src/storybook/stories/components/Percent.tsx | 11 + .../stories/components/PhoneField.tsx | 20 + .../stories/components/PriceField.tsx | 44 + .../stories/components/RichTextEditor.tsx | 119 + .../stories/components/SaveButtonBar.tsx | 73 + .../components/SaveFilterTabDialog.tsx | 18 + .../SingleAutocompleteSelectField.tsx | 91 + .../stories/components/SingleSelectField.tsx | 66 + src/storybook/stories/components/Skeleton.tsx | 11 + .../stories/components/StatusLabel.tsx | 19 + .../stories/components/TablePagination.tsx | 55 + src/storybook/stories/components/Timeline.tsx | 67 + src/storybook/stories/components/Weight.tsx | 18 + .../stories/components/WeightRange.tsx | 24 + src/storybook/stories/components/messages.tsx | 36 + .../configuration/ConfigurationPage.tsx | 38 + .../customers/CustomerAddressDialog.tsx | 25 + .../customers/CustomerAddressListPage.tsx | 31 + .../stories/customers/CustomerCreatePage.tsx | 49 + .../stories/customers/CustomerDetailsPage.tsx | 106 + .../stories/customers/CustomerListPage.tsx | 23 + .../discounts/DiscountCountrySelectDialog.tsx | 26 + .../stories/discounts/SaleCreatePage.tsx | 28 + .../stories/discounts/SaleDetailsPage.tsx | 62 + .../stories/discounts/SaleListPage.tsx | 22 + .../stories/discounts/VoucherCreatePage.tsx | 39 + .../stories/discounts/VoucherDetailsPage.tsx | 64 + .../stories/discounts/VoucherListPage.tsx | 22 + src/storybook/stories/home/HomePage.tsx | 45 + .../stories/navigation/MenuCreateDialog.tsx | 22 + .../stories/navigation/MenuDetailsPage.tsx | 36 + .../stories/navigation/MenuItemDialog.tsx | 35 + .../stories/navigation/MenuListPage.tsx | 25 + .../stories/orders/OrderAddressEditDialog.tsx | 36 + .../stories/orders/OrderBulkCancelDialog.tsx | 19 + .../stories/orders/OrderCancelDialog.tsx | 17 + .../stories/orders/OrderCustomer.tsx | 40 + .../orders/OrderCustomerEditDialog.tsx | 26 + .../stories/orders/OrderDetailsPage.tsx | 153 + .../stories/orders/OrderDraftCancelDialog.tsx | 19 + .../orders/OrderDraftFinalizeDialog.tsx | 26 + .../stories/orders/OrderDraftListPage.tsx | 24 + .../stories/orders/OrderDraftPage.tsx | 45 + .../orders/OrderFulfillmentCancelDialog.tsx | 16 + .../stories/orders/OrderFulfillmentDialog.tsx | 24 + .../orders/OrderFulfillmentTrackingDialog.tsx | 17 + src/storybook/stories/orders/OrderHistory.tsx | 14 + .../stories/orders/OrderListPage.tsx | 37 + .../stories/orders/OrderMarkAsPaidDialog.tsx | 18 + .../stories/orders/OrderPaymentDialog.tsx | 28 + .../stories/orders/OrderPaymentVoidDialog.tsx | 16 + .../stories/orders/OrderProductAddDialog.tsx | 23 + .../orders/OrderShippingMethodEditDialog.tsx | 21 + .../stories/pages/PageDetailsPage.tsx | 41 + src/storybook/stories/pages/PageListPage.tsx | 24 + .../ProductTypeAttributeEditDialog.tsx | 41 + .../productTypes/ProductTypeCreatePage.tsx | 26 + .../productTypes/ProductTypeDetailsPage.tsx | 37 + .../productTypes/ProductTypeListPage.tsx | 26 + .../stories/products/ProductCreatePage.tsx | 70 + .../stories/products/ProductImagePage.tsx | 38 + .../stories/products/ProductListCard.tsx | 43 + .../stories/products/ProductUpdatePage.tsx | 117 + .../products/ProductVariantCreatePage.tsx | 69 + .../ProductVariantImageSelectDialog.tsx | 25 + .../stories/products/ProductVariantPage.tsx | 41 + .../ShippingZoneCountriesAssignDialog.tsx | 22 + .../shipping/ShippingZoneCreatePage.tsx | 50 + .../shipping/ShippingZoneDetailsPage.tsx | 40 + .../shipping/ShippingZoneRateDialog.tsx | 52 + .../shipping/ShippingZonesListPage.tsx | 35 + .../siteSettings/SiteSettingsKeyDialog.tsx | 30 + .../stories/siteSettings/SiteSettingsPage.tsx | 34 + .../stories/staff/StaffDetailsPage.tsx | 48 + src/storybook/stories/staff/StaffListPage.tsx | 23 + .../stories/taxes/CountryListPage.tsx | 30 + .../stories/taxes/CountryTaxesPage.tsx | 25 + src/storybook/stories/taxes/fixtures.ts | 2716 + .../TranslationsEntitiesListPage.tsx | 60 + .../TranslationsLanguageListPage.tsx | 23 + src/storybook/webpack.config.js | 26 + .../components/CountryList/CountryList.tsx | 87 + src/taxes/components/CountryList/index.ts | 2 + .../CountryListPage/CountryListPage.tsx | 69 + src/taxes/components/CountryListPage/index.ts | 2 + .../CountryTaxesPage/CountryTaxesPage.tsx | 105 + .../components/CountryTaxesPage/index.ts | 2 + .../TaxConfiguration/TaxConfiguration.tsx | 73 + .../components/TaxConfiguration/index.ts | 2 + src/taxes/index.tsx | 30 + src/taxes/mutations.ts | 46 + src/taxes/queries.ts | 44 + src/taxes/types/CountryFragment.ts | 13 + src/taxes/types/CountryList.ts | 40 + src/taxes/types/CountryWithTaxesFragment.ts | 28 + src/taxes/types/FetchTaxes.ts | 34 + src/taxes/types/ShopTaxesFragment.ts | 14 + src/taxes/types/UpdateTaxSettings.ts | 36 + src/taxes/urls.ts | 9 + src/taxes/views/CountryList.tsx | 56 + src/taxes/views/CountryTaxes.tsx | 35 + src/theme.ts | 355 + .../TranslationFields/TranslationFields.tsx | 252 + .../TranslationFieldsLong.tsx | 59 + .../TranslationFieldsRich.tsx | 62 + .../TranslationFieldsSave.tsx | 55 + .../TranslationFieldsShort.tsx | 58 + .../components/TranslationFields/index.ts | 3 + .../TranslationsCategoriesPage.tsx | 124 + .../TranslationsCategoriesPage/index.ts | 2 + .../TranslationsCollectionsPage.tsx | 128 + .../TranslationsCollectionsPage/index.ts | 2 + .../TranslationsEntitiesList.tsx | 124 + .../TranslationsEntitiesList/index.ts | 2 + .../TranslationsEntitiesListPage.tsx | 85 + .../TranslationsEntitiesListPage/index.ts | 2 + .../TranslationsLanguageList.tsx | 79 + .../TranslationsLanguageList/index.ts | 2 + .../TranslationsLanguageListPage.tsx | 32 + .../TranslationsLanguageListPage/index.ts | 2 + .../TranslationsPagesPage.tsx | 121 + .../components/TranslationsPagesPage/index.ts | 2 + .../TranslationsProductTypesPage.tsx | 160 + .../TranslationsProductTypesPage/index.ts | 2 + .../TranslationsProductsPage.tsx | 124 + .../TranslationsProductsPage/index.ts | 2 + .../TranslationsSalesPage.tsx | 77 + .../components/TranslationsSalesPage/index.ts | 2 + .../TranslationsVouchersPage.tsx | 80 + .../TranslationsVouchersPage/index.ts | 2 + src/translations/fixtures.ts | 25 + src/translations/index.tsx | 258 + src/translations/mutations.ts | 235 + src/translations/queries.ts | 489 + .../types/AttributeTranslationFragment.ts | 34 + .../types/CategoryTranslationDetails.ts | 43 + .../types/CategoryTranslationFragment.ts | 32 + .../types/CategoryTranslations.ts | 65 + .../types/CollectionTranslationDetails.ts | 43 + .../types/CollectionTranslationFragment.ts | 32 + .../types/CollectionTranslations.ts | 65 + .../types/PageTranslationDetails.ts | 44 + .../types/PageTranslationFragment.ts | 35 + src/translations/types/PageTranslations.ts | 66 + .../types/ProductTranslationDetails.ts | 44 + .../types/ProductTranslationFragment.ts | 35 + src/translations/types/ProductTranslations.ts | 66 + .../types/ProductTypeTranslationDetails.ts | 80 + .../types/ProductTypeTranslationFragment.ts | 69 + .../types/ProductTypeTranslations.ts | 102 + .../types/SaleTranslationDetails.ts | 38 + .../types/SaleTranslationFragment.ts | 29 + src/translations/types/SaleTranslations.ts | 60 + .../ShippingMethodTranslationFragment.ts | 29 + .../types/TranslationsEntitiesPage.ts | 15 + .../types/UpdateAttributeTranslations.ts | 44 + .../types/UpdateAttributeValueTranslations.ts | 44 + .../types/UpdateCategoryTranslations.ts | 56 + .../types/UpdateCollectionTranslations.ts | 56 + .../types/UpdatePageTranslations.ts | 57 + .../types/UpdateProductTranslations.ts | 57 + .../types/UpdateSaleTranslations.ts | 51 + .../types/UpdateVoucherTranslations.ts | 51 + .../types/VoucherTranslationDetails.ts | 38 + .../types/VoucherTranslationFragment.ts | 29 + src/translations/types/VoucherTranslations.ts | 60 + src/translations/urls.ts | 37 + .../views/TranslationsCategories.tsx | 129 + .../views/TranslationsCollections.tsx | 136 + .../views/TranslationsEntities.tsx | 496 + .../views/TranslationsLanguageList.tsx | 22 + src/translations/views/TranslationsPages.tsx | 129 + .../views/TranslationsProductTypes.tsx | 177 + .../views/TranslationsProducts.tsx | 129 + src/translations/views/TranslationsSales.tsx | 123 + .../views/TranslationsVouchers.tsx | 126 + src/types.ts | 90 + src/types/PageInfoFragment.ts | 15 + src/types/globalTypes.ts | 583 + src/utils/filters/filters.ts | 24 + src/utils/filters/index.ts | 5 + src/utils/filters/storage.ts | 51 + .../menu/__snapshots__/menu.test.ts.snap | 114 + src/utils/menu/index.ts | 1 + src/utils/menu/menu.test.ts | 171 + src/utils/menu/menu.ts | 158 + tsconfig.json | 16 + tslint.json | 12 + webpack.config.js | 101 + webpack.d.ts | 6 + 1168 files changed, 205791 insertions(+) create mode 100644 .codeclimate.yml create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .travis.yml create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 apollo.config.js create mode 100644 assets/images/arrow-down-icon.svg create mode 100644 assets/images/arrow-down.svg create mode 100644 assets/images/arrow-left.svg create mode 100644 assets/images/arrow-select.svg create mode 100644 assets/images/arrow-up-icon.svg create mode 100644 assets/images/arrow-up.svg create mode 100644 assets/images/avatars/avatar1.png create mode 100644 assets/images/avatars/avatar10.png create mode 100644 assets/images/avatars/avatar11.png create mode 100644 assets/images/avatars/avatar12.png create mode 100644 assets/images/avatars/avatar2.png create mode 100644 assets/images/avatars/avatar3.png create mode 100644 assets/images/avatars/avatar4.png create mode 100644 assets/images/avatars/avatar5.png create mode 100644 assets/images/avatars/avatar6.png create mode 100644 assets/images/avatars/avatar7.png create mode 100644 assets/images/avatars/avatar8.png create mode 100644 assets/images/avatars/avatar9.png create mode 100644 assets/images/block1.jpg create mode 100644 assets/images/block2.jpg create mode 100644 assets/images/block3.jpg create mode 100644 assets/images/checkout-bg.png create mode 100644 assets/images/checkout-bg2x.png create mode 100644 assets/images/checkout.svg create mode 100644 assets/images/chevron-down.svg create mode 100644 assets/images/chevron-up.svg create mode 100644 assets/images/close.svg create mode 100644 assets/images/confirm-order-bg.png create mode 100644 assets/images/confirm-order-bg2x.png create mode 100644 assets/images/delete.svg create mode 100644 assets/images/dribbble-logo.svg create mode 100644 assets/images/edit.svg create mode 100644 assets/images/empty-checkout-bg.png create mode 100644 assets/images/empty-checkout-bg2x.png create mode 100644 assets/images/facebook-logo.svg create mode 100644 assets/images/favicon.svg create mode 100644 assets/images/filter-icon.svg create mode 100644 assets/images/gallery-arrow.svg create mode 100644 assets/images/github-logo.svg create mode 100644 assets/images/google-logo.svg create mode 100644 assets/images/instagram-logo.svg create mode 100644 assets/images/linkedin-logo.svg create mode 100644 assets/images/loader.svg create mode 100644 assets/images/login-background.svg create mode 100644 assets/images/login-bg.png create mode 100644 assets/images/login-bg2x.png create mode 100644 assets/images/logo-dark.svg create mode 100644 assets/images/logo-light.svg create mode 100644 assets/images/logo-white.svg create mode 100644 assets/images/meetup-logo.svg create mode 100644 assets/images/mobile-menu.svg create mode 100644 assets/images/no-results-bg.svg create mode 100644 assets/images/not-found-404.svg create mode 100644 assets/images/pass-invisible.svg create mode 100644 assets/images/pass-visible.svg create mode 100644 assets/images/photo-icon.svg create mode 100644 assets/images/placeholder1080x1080.png create mode 100644 assets/images/placeholder120x120.png create mode 100644 assets/images/placeholder255x255.png create mode 100644 assets/images/placeholder540x540.png create mode 100644 assets/images/placeholder60x60.png create mode 100644 assets/images/reset-bg.png create mode 100644 assets/images/sale-bg.svg create mode 100644 assets/images/sample-product.jpg create mode 100644 assets/images/sample-product2.jpg create mode 100755 assets/images/search.svg create mode 100644 assets/images/twitter-logo.svg create mode 100644 assets/images/what.svg create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/Baseline.tsx create mode 100644 src/NotFound.tsx create mode 100644 src/auth/AuthProvider.tsx create mode 100644 src/auth/components/LoginLoading/LoginLoading.tsx create mode 100644 src/auth/components/LoginLoading/index.ts create mode 100644 src/auth/components/LoginPage/LoginPage.tsx create mode 100644 src/auth/components/LoginPage/index.ts create mode 100644 src/auth/components/SectionRoute.tsx create mode 100644 src/auth/index.tsx create mode 100644 src/auth/misc.ts create mode 100644 src/auth/mutations.ts create mode 100644 src/auth/types/TokenAuth.ts create mode 100644 src/auth/types/User.ts create mode 100644 src/auth/types/VerifyToken.ts create mode 100644 src/auth/views/Login.tsx create mode 100644 src/categories/components/CategoryBackground/CategoryBackground.tsx create mode 100644 src/categories/components/CategoryBackground/index.ts create mode 100644 src/categories/components/CategoryCreatePage/CategoryCreatePage.tsx create mode 100644 src/categories/components/CategoryCreatePage/index.ts create mode 100644 src/categories/components/CategoryDeleteDialog/CategoryDeleteDialog.tsx create mode 100644 src/categories/components/CategoryDeleteDialog/index.ts create mode 100644 src/categories/components/CategoryDetailsForm/CategoryDetailsForm.tsx create mode 100644 src/categories/components/CategoryDetailsForm/index.ts create mode 100644 src/categories/components/CategoryList/CategoryList.tsx create mode 100644 src/categories/components/CategoryList/index.ts create mode 100644 src/categories/components/CategoryListPage/CategoryListPage.tsx create mode 100644 src/categories/components/CategoryListPage/index.ts create mode 100644 src/categories/components/CategoryProducts/CategoryProducts.tsx create mode 100644 src/categories/components/CategoryProducts/index.ts create mode 100644 src/categories/components/CategoryProductsCard/CategoryProductsCard.tsx create mode 100644 src/categories/components/CategoryProductsCard/index.ts create mode 100644 src/categories/components/CategoryUpdatePage/CategoryUpdatePage.tsx create mode 100644 src/categories/components/CategoryUpdatePage/index.ts create mode 100644 src/categories/fixtures.ts create mode 100644 src/categories/index.tsx create mode 100644 src/categories/mutations.ts create mode 100644 src/categories/queries.ts create mode 100644 src/categories/types/CategoryBulkDelete.ts create mode 100644 src/categories/types/CategoryCreate.ts create mode 100644 src/categories/types/CategoryDelete.ts create mode 100644 src/categories/types/CategoryDetails.ts create mode 100644 src/categories/types/CategoryDetailsFragment.ts create mode 100644 src/categories/types/CategoryProperties.ts create mode 100644 src/categories/types/CategoryUpdate.ts create mode 100644 src/categories/types/RootCategories.ts create mode 100644 src/categories/types/RootCategoryChildren.ts create mode 100644 src/categories/urls.ts create mode 100644 src/categories/views/CategoryCreate.tsx create mode 100644 src/categories/views/CategoryDetails.tsx create mode 100644 src/categories/views/CategoryList.tsx create mode 100644 src/collections/components/CollectionCreatePage/CollectionCreatePage.tsx create mode 100644 src/collections/components/CollectionCreatePage/index.ts create mode 100644 src/collections/components/CollectionDetails/CollectionDetails.tsx create mode 100644 src/collections/components/CollectionDetails/index.ts create mode 100644 src/collections/components/CollectionDetailsPage/CollectionDetailsPage.tsx create mode 100644 src/collections/components/CollectionDetailsPage/index.ts create mode 100644 src/collections/components/CollectionImage/CollectionImage.tsx create mode 100644 src/collections/components/CollectionImage/index.ts create mode 100644 src/collections/components/CollectionList/CollectionList.tsx create mode 100644 src/collections/components/CollectionList/index.ts create mode 100644 src/collections/components/CollectionListPage/CollectionListPage.tsx create mode 100644 src/collections/components/CollectionListPage/index.ts create mode 100644 src/collections/components/CollectionProducts/CollectionProducts.tsx create mode 100644 src/collections/components/CollectionProducts/index.ts create mode 100644 src/collections/containers/CollectionOperations.tsx create mode 100644 src/collections/fixtures.ts create mode 100644 src/collections/index.tsx create mode 100644 src/collections/mutations.ts create mode 100644 src/collections/queries.ts create mode 100644 src/collections/types/AssignHomepageCollection.ts create mode 100644 src/collections/types/CollectionAssignProduct.ts create mode 100644 src/collections/types/CollectionBulkDelete.ts create mode 100644 src/collections/types/CollectionBulkPublish.ts create mode 100644 src/collections/types/CollectionDetails.ts create mode 100644 src/collections/types/CollectionDetailsFragment.ts create mode 100644 src/collections/types/CollectionFragment.ts create mode 100644 src/collections/types/CollectionList.ts create mode 100644 src/collections/types/CollectionProductFragment.ts create mode 100644 src/collections/types/CollectionUpdate.ts create mode 100644 src/collections/types/CollectionUpdateWithHomepage.ts create mode 100644 src/collections/types/CreateCollection.ts create mode 100644 src/collections/types/RemoveCollection.ts create mode 100644 src/collections/types/SearchProducts.ts create mode 100644 src/collections/types/UnassignCollectionProduct.ts create mode 100644 src/collections/urls.ts create mode 100644 src/collections/views/CollectionCreate.tsx create mode 100644 src/collections/views/CollectionDetails.tsx create mode 100644 src/collections/views/CollectionList.tsx create mode 100644 src/components/ActionDialog/ActionDialog.tsx create mode 100644 src/components/ActionDialog/index.ts create mode 100644 src/components/AddressEdit/AddressEdit.tsx create mode 100644 src/components/AddressEdit/index.ts create mode 100644 src/components/AddressFormatter/AddressFormatter.tsx create mode 100644 src/components/AddressFormatter/index.ts create mode 100644 src/components/AppHeader/AppHeader.tsx create mode 100644 src/components/AppHeader/index.ts create mode 100644 src/components/AppLayout/AppActionContext.tsx create mode 100644 src/components/AppLayout/AppHeaderContext.tsx create mode 100644 src/components/AppLayout/AppLayout.tsx create mode 100644 src/components/AppLayout/MenuList.tsx create mode 100644 src/components/AppLayout/MenuNested.tsx create mode 100644 src/components/AppLayout/ResponsiveDrawer.tsx create mode 100644 src/components/AppLayout/ThemeSwitch.tsx create mode 100644 src/components/AppLayout/consts.ts create mode 100644 src/components/AppLayout/index.ts create mode 100644 src/components/AppLayout/menuStructure.ts create mode 100644 src/components/AppProgress/index.tsx create mode 100644 src/components/AssignCategoryDialog/AssignCategoryDialog.tsx create mode 100644 src/components/AssignCategoryDialog/index.ts create mode 100644 src/components/AssignCollectionDialog/AssignCollectionDialog.tsx create mode 100644 src/components/AssignCollectionDialog/index.ts create mode 100644 src/components/AssignProductDialog/AssignProductDialog.tsx create mode 100644 src/components/AssignProductDialog/index.ts create mode 100644 src/components/AutocompleteSelectMenu/AutocompleteSelectMenu.tsx create mode 100644 src/components/AutocompleteSelectMenu/index.ts create mode 100644 src/components/CardMenu/CardMenu.tsx create mode 100644 src/components/CardMenu/index.ts create mode 100644 src/components/CardSpacer.tsx create mode 100644 src/components/CardTitle/CardTitle.tsx create mode 100644 src/components/CardTitle/index.ts create mode 100644 src/components/Checkbox/Checkbox.tsx create mode 100644 src/components/Checkbox/index.ts create mode 100644 src/components/Chip/Chip.tsx create mode 100644 src/components/Chip/index.ts create mode 100644 src/components/ConfirmButton/ConfirmButton.tsx create mode 100644 src/components/ConfirmButton/index.ts create mode 100644 src/components/ConfirmFormLeaveDialog.tsx create mode 100644 src/components/Container.tsx create mode 100644 src/components/ControlledCheckbox.tsx create mode 100644 src/components/ControlledSwitch.tsx create mode 100644 src/components/CountryList/CountryList.tsx create mode 100644 src/components/CountryList/index.ts create mode 100644 src/components/Date/Date.test.tsx create mode 100644 src/components/Date/Date.tsx create mode 100644 src/components/Date/DateContext.tsx create mode 100644 src/components/Date/DateProvider.tsx create mode 100644 src/components/Date/DateTime.tsx create mode 100644 src/components/Date/index.ts create mode 100644 src/components/Debounce.tsx create mode 100644 src/components/DebounceForm.tsx create mode 100644 src/components/DeleteFilterTabDialog/DeleteFilterTabDialog.tsx create mode 100644 src/components/DeleteFilterTabDialog/index.ts create mode 100644 src/components/DraftRenderer.tsx create mode 100644 src/components/Dropzone.tsx create mode 100644 src/components/EditableTableCell/EditableTableCell.tsx create mode 100644 src/components/EditableTableCell/index.ts create mode 100644 src/components/ErrorMessageCard/ErrorMessageCard.tsx create mode 100644 src/components/ErrorMessageCard/index.ts create mode 100644 src/components/ErrorPage/ErrorPage.tsx create mode 100644 src/components/ErrorPage/index.ts create mode 100644 src/components/ExtendedPageHeader/ExtendedPageHeader.tsx create mode 100644 src/components/ExtendedPageHeader/index.ts create mode 100644 src/components/ExternalLink/ExternalLink.tsx create mode 100644 src/components/ExternalLink/index.ts create mode 100644 src/components/FileUpload/FileUpload.tsx create mode 100644 src/components/FileUpload/index.ts create mode 100644 src/components/Filter/Filter.tsx create mode 100644 src/components/Filter/FilterContent.tsx create mode 100644 src/components/Filter/FilterElement.tsx create mode 100644 src/components/Filter/index.ts create mode 100644 src/components/Filter/types.ts create mode 100644 src/components/FilterBar/FilterBar.tsx create mode 100644 src/components/FilterBar/index.ts create mode 100644 src/components/FilterCard/FilterCard.tsx create mode 100644 src/components/FilterCard/index.ts create mode 100644 src/components/Form/Form.tsx create mode 100644 src/components/Form/FormActions.tsx create mode 100644 src/components/Form/FormContext.tsx create mode 100644 src/components/Form/index.ts create mode 100644 src/components/FormSpacer.tsx create mode 100644 src/components/Grid/Grid.tsx create mode 100644 src/components/Grid/index.ts create mode 100644 src/components/Hr.tsx create mode 100644 src/components/IconButtonTableCell/IconButtonTableCell.tsx create mode 100644 src/components/IconButtonTableCell/index.ts create mode 100644 src/components/ImageTile/ImageTile.tsx create mode 100644 src/components/ImageTile/index.ts create mode 100644 src/components/ImageUpload/ImageUpload.tsx create mode 100644 src/components/ImageUpload/index.tsx create mode 100644 src/components/LanguageSwitch/LanguageSwitch.tsx create mode 100644 src/components/LanguageSwitch/index.ts create mode 100644 src/components/Link.tsx create mode 100644 src/components/ListField/ListField.tsx create mode 100644 src/components/ListField/index.ts create mode 100644 src/components/Locale/Locale.tsx create mode 100644 src/components/Locale/index.ts create mode 100644 src/components/MenuToggle.tsx create mode 100644 src/components/Money/Money.tsx create mode 100644 src/components/Money/index.ts create mode 100644 src/components/MoneyRange/MoneyRange.tsx create mode 100644 src/components/MoneyRange/index.ts create mode 100644 src/components/MultiAutocompleteSelectField/MultiAutocompleteSelectField.tsx create mode 100644 src/components/MultiAutocompleteSelectField/index.ts create mode 100644 src/components/MultiSelectField/MultiSelectField.tsx create mode 100644 src/components/MultiSelectField/index.ts create mode 100644 src/components/NotFoundPage/NotFoundPage.tsx create mode 100644 src/components/NotFoundPage/index.ts create mode 100644 src/components/PageHeader/PageHeader.tsx create mode 100644 src/components/PageHeader/index.ts create mode 100644 src/components/Percent/Percent.tsx create mode 100644 src/components/Percent/index.ts create mode 100644 src/components/PhoneField/PhoneField.tsx create mode 100644 src/components/PhoneField/index.ts create mode 100644 src/components/PriceField/PriceField.tsx create mode 100644 src/components/PriceField/index.ts create mode 100644 src/components/ProductList/ProductList.tsx create mode 100644 src/components/ProductList/index.ts create mode 100644 src/components/RichTextEditor/ImageEntity.tsx create mode 100644 src/components/RichTextEditor/ImageSource.tsx create mode 100644 src/components/RichTextEditor/LinkEntity.tsx create mode 100644 src/components/RichTextEditor/LinkSource.tsx create mode 100644 src/components/RichTextEditor/RichTextEditor.tsx create mode 100644 src/components/RichTextEditor/index.ts create mode 100644 src/components/SaveButtonBar/SaveButtonBar.tsx create mode 100644 src/components/SaveButtonBar/index.ts create mode 100644 src/components/SaveFilterTabDialog/SaveFilterTabDialog.tsx create mode 100644 src/components/SaveFilterTabDialog/index.ts create mode 100644 src/components/SeoForm/SeoForm.tsx create mode 100644 src/components/SeoForm/index.ts create mode 100644 src/components/Shop/index.tsx create mode 100644 src/components/Shop/query.ts create mode 100644 src/components/Shop/types/ShopInfo.ts create mode 100644 src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx create mode 100644 src/components/SingleAutocompleteSelectField/index.ts create mode 100644 src/components/SingleSelectField/SingleSelectField.tsx create mode 100644 src/components/SingleSelectField/index.ts create mode 100644 src/components/Skeleton.tsx create mode 100644 src/components/StatusLabel/StatusLabel.tsx create mode 100644 src/components/StatusLabel/index.ts create mode 100644 src/components/Tab/Tab.tsx create mode 100644 src/components/Tab/TabContainer.tsx create mode 100644 src/components/Tab/Tabs.tsx create mode 100644 src/components/Tab/index.ts create mode 100644 src/components/TableCellAvatar/TableCellAvatar.tsx create mode 100644 src/components/TableCellAvatar/index.ts create mode 100644 src/components/TableFilter/FilterChips.tsx create mode 100644 src/components/TableFilter/FilterTab.tsx create mode 100644 src/components/TableFilter/FilterTabs.tsx create mode 100644 src/components/TableFilter/index.ts create mode 100644 src/components/TableHead/TableHead.tsx create mode 100644 src/components/TableHead/index.ts create mode 100644 src/components/TablePagination/TablePagination.tsx create mode 100644 src/components/TablePagination/TablePaginationActions.tsx create mode 100644 src/components/TablePagination/index.ts create mode 100644 src/components/TextFieldWithChoice/TextFieldWithChoice.tsx create mode 100644 src/components/TextFieldWithChoice/index.ts create mode 100644 src/components/Theme/ThemeProvider.tsx create mode 100644 src/components/Theme/index.ts create mode 100644 src/components/Timeline/Timeline.tsx create mode 100644 src/components/Timeline/TimelineEvent.tsx create mode 100644 src/components/Timeline/TimelineNote.tsx create mode 100644 src/components/Timeline/index.ts create mode 100644 src/components/Timezone/Timezone.tsx create mode 100644 src/components/Timezone/index.ts create mode 100644 src/components/VisibilityCard/VisibilityCard.tsx create mode 100644 src/components/VisibilityCard/index.ts create mode 100644 src/components/Weight/Weight.tsx create mode 100644 src/components/Weight/index.ts create mode 100644 src/components/WeightRange/WeightRange.tsx create mode 100644 src/components/WeightRange/index.ts create mode 100644 src/components/WindowTitle/index.tsx create mode 100644 src/components/messages/MessageManager.tsx create mode 100644 src/components/messages/index.ts create mode 100644 src/config.ts create mode 100644 src/configuration/ConfigurationPage.tsx create mode 100644 src/configuration/index.tsx create mode 100644 src/containers/BaseSearch.tsx create mode 100644 src/containers/SearchCategories/index.tsx create mode 100644 src/containers/SearchCategories/types/SearchCategories.ts create mode 100644 src/containers/SearchCollections/index.tsx create mode 100644 src/containers/SearchCollections/types/SearchCollections.ts create mode 100644 src/containers/SearchCustomers/index.ts create mode 100644 src/containers/SearchCustomers/types/SearchCustomers.ts create mode 100644 src/containers/SearchPages/index.tsx create mode 100644 src/containers/SearchPages/types/SearchPages.ts create mode 100644 src/containers/SearchProducts/index.tsx create mode 100644 src/containers/SearchProducts/types/SearchProducts.ts create mode 100644 src/customers/components/CustomerAddress/CustomerAddress.tsx create mode 100644 src/customers/components/CustomerAddress/index.ts create mode 100644 src/customers/components/CustomerAddressDialog/CustomerAddressDialog.tsx create mode 100644 src/customers/components/CustomerAddressDialog/index.ts create mode 100644 src/customers/components/CustomerAddressListPage/CustomerAddressListPage.tsx create mode 100644 src/customers/components/CustomerAddressListPage/index.ts create mode 100644 src/customers/components/CustomerAddresses/CustomerAddresses.tsx create mode 100644 src/customers/components/CustomerAddresses/index.ts create mode 100644 src/customers/components/CustomerCreateAddress/CustomerCreateAddress.tsx create mode 100644 src/customers/components/CustomerCreateAddress/index.ts create mode 100644 src/customers/components/CustomerCreateDetails/CustomerCreateDetails.tsx create mode 100644 src/customers/components/CustomerCreateDetails/index.ts create mode 100644 src/customers/components/CustomerCreateNote/CustomerCreateNote.tsx create mode 100644 src/customers/components/CustomerCreateNote/index.ts create mode 100644 src/customers/components/CustomerCreatePage/CustomerCreatePage.tsx create mode 100644 src/customers/components/CustomerCreatePage/index.ts create mode 100644 src/customers/components/CustomerDetails/CustomerDetails.tsx create mode 100644 src/customers/components/CustomerDetails/index.ts create mode 100644 src/customers/components/CustomerDetailsPage/CustomerDetailsPage.tsx create mode 100644 src/customers/components/CustomerDetailsPage/index.ts create mode 100644 src/customers/components/CustomerList/CustomerList.tsx create mode 100644 src/customers/components/CustomerList/index.ts create mode 100644 src/customers/components/CustomerListPage/CustomerListPage.tsx create mode 100644 src/customers/components/CustomerListPage/index.ts create mode 100644 src/customers/components/CustomerOrders/CustomerOrders.tsx create mode 100644 src/customers/components/CustomerOrders/index.ts create mode 100644 src/customers/components/CustomerStats/CustomerStats.tsx create mode 100644 src/customers/components/CustomerStats/index.ts create mode 100644 src/customers/fixtures.ts create mode 100644 src/customers/index.tsx create mode 100644 src/customers/mutations.ts create mode 100644 src/customers/queries.ts create mode 100644 src/customers/types.ts create mode 100644 src/customers/types/BulkRemoveCustomers.ts create mode 100644 src/customers/types/CreateCustomer.ts create mode 100644 src/customers/types/CreateCustomerAddress.ts create mode 100644 src/customers/types/CustomerAddresses.ts create mode 100644 src/customers/types/CustomerAddressesFragment.ts create mode 100644 src/customers/types/CustomerCreateData.ts create mode 100644 src/customers/types/CustomerDetails.ts create mode 100644 src/customers/types/CustomerDetailsFragment.ts create mode 100644 src/customers/types/CustomerFragment.ts create mode 100644 src/customers/types/ListCustomers.ts create mode 100644 src/customers/types/RemoveCustomer.ts create mode 100644 src/customers/types/RemoveCustomerAddress.ts create mode 100644 src/customers/types/SetCustomerDefaultAddress.ts create mode 100644 src/customers/types/UpdateCustomer.ts create mode 100644 src/customers/types/UpdateCustomerAddress.ts create mode 100644 src/customers/urls.ts create mode 100644 src/customers/views/CustomerAddresses.tsx create mode 100644 src/customers/views/CustomerCreate.tsx create mode 100644 src/customers/views/CustomerDetails.tsx create mode 100644 src/customers/views/CustomerList.tsx create mode 100644 src/discounts/components/DiscountCategories/DiscountCategories.tsx create mode 100644 src/discounts/components/DiscountCategories/index.ts create mode 100644 src/discounts/components/DiscountCollections/DiscountCollections.tsx create mode 100644 src/discounts/components/DiscountCollections/index.ts create mode 100644 src/discounts/components/DiscountCountrySelectDialog/DiscountCountrySelectDialog.tsx create mode 100644 src/discounts/components/DiscountCountrySelectDialog/index.ts create mode 100644 src/discounts/components/DiscountProducts/DiscountProducts.tsx create mode 100644 src/discounts/components/DiscountProducts/index.ts create mode 100644 src/discounts/components/SaleCreatePage/SaleCreatePage.tsx create mode 100644 src/discounts/components/SaleCreatePage/index.ts create mode 100644 src/discounts/components/SaleDetailsPage/SaleDetailsPage.tsx create mode 100644 src/discounts/components/SaleDetailsPage/index.ts create mode 100644 src/discounts/components/SaleInfo/SaleInfo.tsx create mode 100644 src/discounts/components/SaleInfo/index.ts create mode 100644 src/discounts/components/SaleList/SaleList.tsx create mode 100644 src/discounts/components/SaleList/index.ts create mode 100644 src/discounts/components/SaleListPage/SaleListPage.tsx create mode 100644 src/discounts/components/SaleListPage/index.ts create mode 100644 src/discounts/components/SalePricing/SalePricing.tsx create mode 100644 src/discounts/components/SalePricing/index.ts create mode 100644 src/discounts/components/SaleSummary/SaleSummary.tsx create mode 100644 src/discounts/components/SaleSummary/index.ts create mode 100644 src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx create mode 100644 src/discounts/components/VoucherCreatePage/index.ts create mode 100644 src/discounts/components/VoucherDetailsPage/VoucherDetailsPage.tsx create mode 100644 src/discounts/components/VoucherDetailsPage/index.ts create mode 100644 src/discounts/components/VoucherInfo/VoucherInfo.tsx create mode 100644 src/discounts/components/VoucherInfo/index.ts create mode 100644 src/discounts/components/VoucherList/VoucherList.tsx create mode 100644 src/discounts/components/VoucherList/index.ts create mode 100644 src/discounts/components/VoucherListPage/VoucherListPage.tsx create mode 100644 src/discounts/components/VoucherListPage/index.ts create mode 100644 src/discounts/components/VoucherOptions/VoucherOptions.tsx create mode 100644 src/discounts/components/VoucherOptions/index.ts create mode 100644 src/discounts/components/VoucherSummary/VoucherSummary.tsx create mode 100644 src/discounts/components/VoucherSummary/index.ts create mode 100644 src/discounts/fixtures.ts create mode 100644 src/discounts/index.tsx create mode 100644 src/discounts/mutations.ts create mode 100644 src/discounts/queries.ts create mode 100644 src/discounts/translations.ts create mode 100644 src/discounts/types/SaleBulkDelete.ts create mode 100644 src/discounts/types/SaleCataloguesAdd.ts create mode 100644 src/discounts/types/SaleCataloguesRemove.ts create mode 100644 src/discounts/types/SaleCreate.ts create mode 100644 src/discounts/types/SaleDelete.ts create mode 100644 src/discounts/types/SaleDetails.ts create mode 100644 src/discounts/types/SaleDetailsFragment.ts create mode 100644 src/discounts/types/SaleFragment.ts create mode 100644 src/discounts/types/SaleList.ts create mode 100644 src/discounts/types/SaleUpdate.ts create mode 100644 src/discounts/types/VoucherBulkDelete.ts create mode 100644 src/discounts/types/VoucherCataloguesAdd.ts create mode 100644 src/discounts/types/VoucherCataloguesRemove.ts create mode 100644 src/discounts/types/VoucherCreate.ts create mode 100644 src/discounts/types/VoucherDelete.ts create mode 100644 src/discounts/types/VoucherDetails.ts create mode 100644 src/discounts/types/VoucherDetailsFragment.ts create mode 100644 src/discounts/types/VoucherFragment.ts create mode 100644 src/discounts/types/VoucherList.ts create mode 100644 src/discounts/types/VoucherUpdate.ts create mode 100644 src/discounts/urls.ts create mode 100644 src/discounts/views/SaleCreate.tsx create mode 100644 src/discounts/views/SaleDetails.tsx create mode 100644 src/discounts/views/SaleList.tsx create mode 100644 src/discounts/views/VoucherCreate.tsx create mode 100644 src/discounts/views/VoucherDetails.tsx create mode 100644 src/discounts/views/VoucherList.tsx create mode 100644 src/fixtures.ts create mode 100644 src/home/components/HomeActivityCard/HomeActivityCard.tsx create mode 100644 src/home/components/HomeActivityCard/activityMessages.ts create mode 100644 src/home/components/HomeActivityCard/index.ts create mode 100644 src/home/components/HomeAnalyticsCard/HomeAnalyticsCard.tsx create mode 100644 src/home/components/HomeAnalyticsCard/index.ts create mode 100644 src/home/components/HomeHeader/HomeHeader.tsx create mode 100644 src/home/components/HomeHeader/index.ts create mode 100644 src/home/components/HomeNotificationTable/HomeNotificationTable.tsx create mode 100644 src/home/components/HomeNotificationTable/index.ts create mode 100644 src/home/components/HomePage/HomePage.tsx create mode 100644 src/home/components/HomePage/index.ts create mode 100644 src/home/components/HomeProductListCard/HomeProductListCard.tsx create mode 100644 src/home/components/HomeProductListCard/index.ts create mode 100644 src/home/components/HomeScreen.tsx create mode 100644 src/home/fixtures.ts create mode 100644 src/home/index.tsx create mode 100644 src/home/queries.ts create mode 100644 src/home/types/Home.ts create mode 100644 src/home/views/index.tsx create mode 100644 src/hooks/useBulkActions.ts create mode 100644 src/hooks/useDateLocalize.ts create mode 100644 src/hooks/useLocale.ts create mode 100644 src/hooks/useNavigator.ts create mode 100644 src/hooks/useNotifier.ts create mode 100644 src/hooks/usePaginator.ts create mode 100644 src/hooks/useScroll.ts create mode 100644 src/hooks/useShop.ts create mode 100644 src/hooks/useTheme.ts create mode 100644 src/hooks/useUser.ts create mode 100644 src/i18n.ts create mode 100644 src/icons/AccountCircle.tsx create mode 100644 src/icons/ArrowDropdown.tsx create mode 100644 src/icons/Ballot.tsx create mode 100644 src/icons/BoldIcon.tsx create mode 100644 src/icons/Calendar.tsx create mode 100644 src/icons/Draggable.tsx create mode 100644 src/icons/Folder.tsx create mode 100644 src/icons/HeaderOne.tsx create mode 100644 src/icons/HeaderThree.tsx create mode 100644 src/icons/HeaderTwo.tsx create mode 100644 src/icons/Home.tsx create mode 100644 src/icons/Image.tsx create mode 100644 src/icons/ItalicIcon.tsx create mode 100644 src/icons/LinkIcon.tsx create mode 100644 src/icons/LocalShipping.tsx create mode 100644 src/icons/Monetization.tsx create mode 100644 src/icons/Moon.tsx create mode 100644 src/icons/Navigation.tsx create mode 100644 src/icons/NoPhoto.tsx create mode 100644 src/icons/OrderedListIcon.tsx create mode 100644 src/icons/Orders.tsx create mode 100644 src/icons/Pages.tsx create mode 100644 src/icons/ProductTypes.tsx create mode 100644 src/icons/QuotationIcon.tsx create mode 100644 src/icons/Sales.tsx create mode 100644 src/icons/ShippingMethods.tsx create mode 100644 src/icons/Shop.tsx create mode 100644 src/icons/SiteSettings.tsx create mode 100644 src/icons/StaffMembers.tsx create mode 100644 src/icons/StoreMall.tsx create mode 100644 src/icons/StrikethroughIcon.tsx create mode 100644 src/icons/Sun.tsx create mode 100644 src/icons/Taxes.tsx create mode 100644 src/icons/Truck.tsx create mode 100644 src/icons/UnorderedListIcon.tsx create mode 100644 src/icons/Unstyled.tsx create mode 100644 src/index.html create mode 100644 src/index.tsx create mode 100644 src/misc.ts create mode 100644 src/mutations.tsx create mode 100644 src/navigation/components/MenuCreateDialog/MenuCreateDialog.tsx create mode 100644 src/navigation/components/MenuCreateDialog/index.ts create mode 100644 src/navigation/components/MenuDetailsPage/MenuDetailsPage.tsx create mode 100644 src/navigation/components/MenuDetailsPage/__snapshots__/tree.test.ts.snap create mode 100644 src/navigation/components/MenuDetailsPage/index.ts create mode 100644 src/navigation/components/MenuDetailsPage/tree.test.ts create mode 100644 src/navigation/components/MenuDetailsPage/tree.ts create mode 100644 src/navigation/components/MenuItemDialog/MenuItemDialog.tsx create mode 100644 src/navigation/components/MenuItemDialog/index.ts create mode 100644 src/navigation/components/MenuItems/MenuItems.tsx create mode 100644 src/navigation/components/MenuItems/__snapshots__/tree.test.ts.snap create mode 100644 src/navigation/components/MenuItems/index.ts create mode 100644 src/navigation/components/MenuItems/tree.test.ts create mode 100644 src/navigation/components/MenuItems/tree.ts create mode 100644 src/navigation/components/MenuList/MenuList.tsx create mode 100644 src/navigation/components/MenuList/index.ts create mode 100644 src/navigation/components/MenuListPage/MenuListPage.tsx create mode 100644 src/navigation/components/MenuListPage/index.ts create mode 100644 src/navigation/components/MenuProperties/MenuProperties.tsx create mode 100644 src/navigation/components/MenuProperties/index.ts create mode 100644 src/navigation/fixtures.ts create mode 100644 src/navigation/index.tsx create mode 100644 src/navigation/mutations.ts create mode 100644 src/navigation/queries.ts create mode 100644 src/navigation/types/MenuBulkDelete.ts create mode 100644 src/navigation/types/MenuCreate.ts create mode 100644 src/navigation/types/MenuDelete.ts create mode 100644 src/navigation/types/MenuDetails.ts create mode 100644 src/navigation/types/MenuDetailsFragment.ts create mode 100644 src/navigation/types/MenuFragment.ts create mode 100644 src/navigation/types/MenuItemCreate.ts create mode 100644 src/navigation/types/MenuItemFragment.ts create mode 100644 src/navigation/types/MenuItemNestedFragment.ts create mode 100644 src/navigation/types/MenuItemUpdate.ts create mode 100644 src/navigation/types/MenuList.ts create mode 100644 src/navigation/types/MenuUpdate.ts create mode 100644 src/navigation/urls.ts create mode 100644 src/navigation/views/MenuDetails/index.tsx create mode 100644 src/navigation/views/MenuDetails/successHandlers.ts create mode 100644 src/navigation/views/MenuDetails/utils.ts create mode 100644 src/navigation/views/MenuList.tsx create mode 100644 src/orders/components/OrderAddressEditDialog/OrderAddressEditDialog.tsx create mode 100644 src/orders/components/OrderAddressEditDialog/index.ts create mode 100644 src/orders/components/OrderBulkCancelDialog/OrderBulkCancelDialog.tsx create mode 100644 src/orders/components/OrderBulkCancelDialog/index.ts create mode 100644 src/orders/components/OrderCancelDialog/OrderCancelDialog.tsx create mode 100644 src/orders/components/OrderCancelDialog/index.ts create mode 100644 src/orders/components/OrderCustomer/OrderCustomer.tsx create mode 100644 src/orders/components/OrderCustomer/index.ts create mode 100644 src/orders/components/OrderCustomerEditDialog/OrderCustomerEditDialog.tsx create mode 100644 src/orders/components/OrderCustomerEditDialog/index.ts create mode 100644 src/orders/components/OrderCustomerNote/OrderCustomerNote.tsx create mode 100644 src/orders/components/OrderCustomerNote/index.ts create mode 100644 src/orders/components/OrderDetailsPage/OrderDetailsPage.tsx create mode 100644 src/orders/components/OrderDetailsPage/index.ts create mode 100644 src/orders/components/OrderDraftCancelDialog/OrderDraftCancelDialog.tsx create mode 100644 src/orders/components/OrderDraftCancelDialog/index.ts create mode 100644 src/orders/components/OrderDraftDetails/OrderDraftDetails.tsx create mode 100644 src/orders/components/OrderDraftDetails/index.ts create mode 100644 src/orders/components/OrderDraftDetailsProducts/OrderDraftDetailsProducts.tsx create mode 100644 src/orders/components/OrderDraftDetailsProducts/index.ts create mode 100644 src/orders/components/OrderDraftDetailsSummary/OrderDraftDetailsSummary.tsx create mode 100644 src/orders/components/OrderDraftDetailsSummary/index.ts create mode 100644 src/orders/components/OrderDraftFinalizeDialog/OrderDraftFinalizeDialog.tsx create mode 100644 src/orders/components/OrderDraftFinalizeDialog/index.ts create mode 100644 src/orders/components/OrderDraftList/OrderDraftList.tsx create mode 100644 src/orders/components/OrderDraftList/index.ts create mode 100644 src/orders/components/OrderDraftListPage/OrderDraftListPage.tsx create mode 100644 src/orders/components/OrderDraftListPage/index.ts create mode 100644 src/orders/components/OrderDraftPage/OrderDraftPage.tsx create mode 100644 src/orders/components/OrderDraftPage/index.ts create mode 100644 src/orders/components/OrderFulfillment/OrderFulfillment.tsx create mode 100644 src/orders/components/OrderFulfillment/index.ts create mode 100644 src/orders/components/OrderFulfillmentCancelDialog/OrderFulfillmentCancelDialog.tsx create mode 100644 src/orders/components/OrderFulfillmentCancelDialog/index.ts create mode 100644 src/orders/components/OrderFulfillmentDialog/OrderFulfillmentDialog.tsx create mode 100644 src/orders/components/OrderFulfillmentDialog/index.ts create mode 100644 src/orders/components/OrderFulfillmentTrackingDialog/OrderFulfillmentTrackingDialog.tsx create mode 100644 src/orders/components/OrderFulfillmentTrackingDialog/index.ts create mode 100644 src/orders/components/OrderHistory/OrderHistory.tsx create mode 100644 src/orders/components/OrderHistory/index.ts create mode 100644 src/orders/components/OrderList/OrderList.tsx create mode 100644 src/orders/components/OrderList/index.ts create mode 100644 src/orders/components/OrderListFilter/OrderListFilter.tsx create mode 100644 src/orders/components/OrderListFilter/index.ts create mode 100644 src/orders/components/OrderListPage/OrderListPage.tsx create mode 100644 src/orders/components/OrderListPage/index.ts create mode 100644 src/orders/components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog.tsx create mode 100644 src/orders/components/OrderMarkAsPaidDialog/index.ts create mode 100644 src/orders/components/OrderPayment/OrderPayment.tsx create mode 100644 src/orders/components/OrderPayment/index.ts create mode 100644 src/orders/components/OrderPaymentDialog/OrderPaymentDialog.tsx create mode 100644 src/orders/components/OrderPaymentDialog/index.ts create mode 100644 src/orders/components/OrderPaymentVoidDialog/OrderPaymentVoidDialog.tsx create mode 100644 src/orders/components/OrderPaymentVoidDialog/index.ts create mode 100644 src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx create mode 100644 src/orders/components/OrderProductAddDialog/index.ts create mode 100644 src/orders/components/OrderShippingMethodEditDialog/OrderShippingMethodEditDialog.tsx create mode 100644 src/orders/components/OrderShippingMethodEditDialog/index.ts create mode 100644 src/orders/components/OrderUnfulfilledItems/OrderUnfulfilledItems.tsx create mode 100644 src/orders/components/OrderUnfulfilledItems/index.ts create mode 100644 src/orders/containers/OrderOperations.tsx create mode 100644 src/orders/fixtures.ts create mode 100644 src/orders/index.tsx create mode 100644 src/orders/mutations.ts create mode 100644 src/orders/queries.ts create mode 100644 src/orders/types/AddressFragment.ts create mode 100644 src/orders/types/OrderAddNote.ts create mode 100644 src/orders/types/OrderBulkCancel.ts create mode 100644 src/orders/types/OrderCancel.ts create mode 100644 src/orders/types/OrderCapture.ts create mode 100644 src/orders/types/OrderCreateFulfillment.ts create mode 100644 src/orders/types/OrderDetails.ts create mode 100644 src/orders/types/OrderDetailsFragment.ts create mode 100644 src/orders/types/OrderDraftBulkCancel.ts create mode 100644 src/orders/types/OrderDraftCancel.ts create mode 100644 src/orders/types/OrderDraftCreate.ts create mode 100644 src/orders/types/OrderDraftFinalize.ts create mode 100644 src/orders/types/OrderDraftList.ts create mode 100644 src/orders/types/OrderDraftUpdate.ts create mode 100644 src/orders/types/OrderEventFragment.ts create mode 100644 src/orders/types/OrderFulfillmentCancel.ts create mode 100644 src/orders/types/OrderFulfillmentUpdateTracking.ts create mode 100644 src/orders/types/OrderLineDelete.ts create mode 100644 src/orders/types/OrderLineFragment.ts create mode 100644 src/orders/types/OrderLineUpdate.ts create mode 100644 src/orders/types/OrderLinesAdd.ts create mode 100644 src/orders/types/OrderList.ts create mode 100644 src/orders/types/OrderMarkAsPaid.ts create mode 100644 src/orders/types/OrderRefund.ts create mode 100644 src/orders/types/OrderRelease.ts create mode 100644 src/orders/types/OrderShippingMethodUpdate.ts create mode 100644 src/orders/types/OrderShippingMethods.ts create mode 100644 src/orders/types/OrderUpdate.ts create mode 100644 src/orders/types/OrderVoid.ts create mode 100644 src/orders/types/SearchOrderVariant.ts create mode 100644 src/orders/urls.ts create mode 100644 src/orders/views/OrderDetails/OrderDetailsMessages.tsx create mode 100644 src/orders/views/OrderDetails/index.tsx create mode 100644 src/orders/views/OrderDraftList.tsx create mode 100644 src/orders/views/OrderList/OrderList.tsx create mode 100644 src/orders/views/OrderList/filters.ts create mode 100644 src/orders/views/OrderList/index.ts create mode 100644 src/pages/components/PageDetailsPage/PageDetailsPage.tsx create mode 100644 src/pages/components/PageDetailsPage/index.ts create mode 100644 src/pages/components/PageInfo/PageInfo.tsx create mode 100644 src/pages/components/PageInfo/index.ts create mode 100644 src/pages/components/PageList/PageList.tsx create mode 100644 src/pages/components/PageList/index.ts create mode 100644 src/pages/components/PageListPage/PageListPage.tsx create mode 100644 src/pages/components/PageListPage/index.ts create mode 100644 src/pages/components/PageSlug/PageSlug.tsx create mode 100644 src/pages/components/PageSlug/index.ts create mode 100644 src/pages/fixtures.ts create mode 100644 src/pages/index.tsx create mode 100644 src/pages/mutations.ts create mode 100644 src/pages/queries.ts create mode 100644 src/pages/types/PageBulkPublish.ts create mode 100644 src/pages/types/PageBulkRemove.ts create mode 100644 src/pages/types/PageCreate.ts create mode 100644 src/pages/types/PageDetails.ts create mode 100644 src/pages/types/PageDetailsFragment.ts create mode 100644 src/pages/types/PageFragment.ts create mode 100644 src/pages/types/PageList.ts create mode 100644 src/pages/types/PageRemove.ts create mode 100644 src/pages/types/PageUpdate.ts create mode 100644 src/pages/urls.ts create mode 100644 src/pages/views/PageCreate.tsx create mode 100644 src/pages/views/PageDetails.tsx create mode 100644 src/pages/views/PageList.tsx create mode 100644 src/productTypes/components/ProductTypeAttributeEditDialog/ProductTypeAttributeEditDialog.tsx create mode 100644 src/productTypes/components/ProductTypeAttributeEditDialog/index.ts create mode 100644 src/productTypes/components/ProductTypeAttributes/ProductTypeAttributes.tsx create mode 100644 src/productTypes/components/ProductTypeAttributes/index.ts create mode 100644 src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx create mode 100644 src/productTypes/components/ProductTypeCreatePage/index.ts create mode 100644 src/productTypes/components/ProductTypeDetails/ProductTypeDetails.tsx create mode 100644 src/productTypes/components/ProductTypeDetails/index.ts create mode 100644 src/productTypes/components/ProductTypeDetailsPage/ProductTypeDetailsPage.tsx create mode 100644 src/productTypes/components/ProductTypeDetailsPage/index.ts create mode 100644 src/productTypes/components/ProductTypeList/ProductTypeList.tsx create mode 100644 src/productTypes/components/ProductTypeList/index.ts create mode 100644 src/productTypes/components/ProductTypeListPage/ProductTypeListPage.tsx create mode 100644 src/productTypes/components/ProductTypeListPage/index.ts create mode 100644 src/productTypes/components/ProductTypeShipping/ProductTypeShipping.tsx create mode 100644 src/productTypes/components/ProductTypeShipping/index.ts create mode 100644 src/productTypes/components/ProductTypeTaxes/ProductTypeTaxes.tsx create mode 100644 src/productTypes/components/ProductTypeTaxes/index.ts create mode 100644 src/productTypes/containers/ProductTypeOperations.tsx create mode 100644 src/productTypes/fixtures.ts create mode 100644 src/productTypes/index.tsx create mode 100644 src/productTypes/mutations.ts create mode 100644 src/productTypes/queries.ts create mode 100644 src/productTypes/types/AttributeCreate.ts create mode 100644 src/productTypes/types/AttributeDelete.ts create mode 100644 src/productTypes/types/AttributeFragment.ts create mode 100644 src/productTypes/types/AttributeUpdate.ts create mode 100644 src/productTypes/types/ProductTypeBulkDelete.ts create mode 100644 src/productTypes/types/ProductTypeCreate.ts create mode 100644 src/productTypes/types/ProductTypeCreateData.ts create mode 100644 src/productTypes/types/ProductTypeDelete.ts create mode 100644 src/productTypes/types/ProductTypeDetails.ts create mode 100644 src/productTypes/types/ProductTypeDetailsFragment.ts create mode 100644 src/productTypes/types/ProductTypeFragment.ts create mode 100644 src/productTypes/types/ProductTypeList.ts create mode 100644 src/productTypes/types/ProductTypeUpdate.ts create mode 100644 src/productTypes/urls.ts create mode 100644 src/productTypes/views/ProductTypeCreate.tsx create mode 100644 src/productTypes/views/ProductTypeList.tsx create mode 100644 src/productTypes/views/ProductTypeUpdate/errors.tsx create mode 100644 src/productTypes/views/ProductTypeUpdate/index.tsx create mode 100644 src/productTypes/views/ProductTypeUpdate/urls.ts create mode 100644 src/products/components/ProductCategoryAndCollectionsForm/ProductCategoryAndCollectionsForm.tsx create mode 100644 src/products/components/ProductCategoryAndCollectionsForm/index.ts create mode 100644 src/products/components/ProductCreatePage/ProductCreatePage.tsx create mode 100644 src/products/components/ProductCreatePage/index.ts create mode 100644 src/products/components/ProductDetailsForm/ProductDetailsForm.tsx create mode 100644 src/products/components/ProductDetailsForm/index.ts create mode 100644 src/products/components/ProductImageNavigation/ProductImageNavigation.tsx create mode 100644 src/products/components/ProductImageNavigation/index.ts create mode 100644 src/products/components/ProductImagePage/ProductImagePage.tsx create mode 100644 src/products/components/ProductImagePage/index.ts create mode 100644 src/products/components/ProductImages/ProductImages.tsx create mode 100644 src/products/components/ProductImages/index.ts create mode 100644 src/products/components/ProductListCard/ProductListCard.tsx create mode 100644 src/products/components/ProductListCard/index.ts create mode 100644 src/products/components/ProductListFilter/ProductListFilter.tsx create mode 100644 src/products/components/ProductListFilter/index.ts create mode 100644 src/products/components/ProductOrganization/ProductOrganization.tsx create mode 100644 src/products/components/ProductOrganization/index.ts create mode 100644 src/products/components/ProductPricing/ProductPricing.tsx create mode 100644 src/products/components/ProductPricing/index.ts create mode 100644 src/products/components/ProductStock/ProductStock.tsx create mode 100644 src/products/components/ProductStock/index.ts create mode 100644 src/products/components/ProductUpdatePage/ProductUpdatePage.tsx create mode 100644 src/products/components/ProductUpdatePage/index.ts create mode 100644 src/products/components/ProductVariantAttributes/ProductVariantAttributes.tsx create mode 100644 src/products/components/ProductVariantAttributes/index.ts create mode 100644 src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx create mode 100644 src/products/components/ProductVariantCreatePage/index.ts create mode 100644 src/products/components/ProductVariantDeleteDialog/ProductVariantDeleteDialog.tsx create mode 100644 src/products/components/ProductVariantDeleteDialog/index.ts create mode 100644 src/products/components/ProductVariantImageSelectDialog/ProductVariantImageSelectDialog.tsx create mode 100644 src/products/components/ProductVariantImageSelectDialog/index.ts create mode 100644 src/products/components/ProductVariantImages/ProductVariantImages.tsx create mode 100644 src/products/components/ProductVariantImages/index.ts create mode 100644 src/products/components/ProductVariantNavigation/ProductVariantNavigation.tsx create mode 100644 src/products/components/ProductVariantNavigation/index.ts create mode 100644 src/products/components/ProductVariantPage/ProductVariantPage.tsx create mode 100644 src/products/components/ProductVariantPage/index.ts create mode 100644 src/products/components/ProductVariantPrice/ProductVariantPrice.tsx create mode 100644 src/products/components/ProductVariantPrice/index.ts create mode 100644 src/products/components/ProductVariantStock/ProductVariantStock.tsx create mode 100644 src/products/components/ProductVariantStock/index.ts create mode 100644 src/products/components/ProductVariants/ProductVariants.tsx create mode 100644 src/products/components/ProductVariants/index.ts create mode 100644 src/products/containers/ProductImagesReorder.tsx create mode 100644 src/products/containers/ProductUpdateOperations.tsx create mode 100644 src/products/containers/ProductVariantOperations.tsx create mode 100644 src/products/fixtures.ts create mode 100644 src/products/index.tsx create mode 100644 src/products/mutations.ts create mode 100644 src/products/queries.ts create mode 100644 src/products/types/Money.ts create mode 100644 src/products/types/Product.ts create mode 100644 src/products/types/ProductCreate.ts create mode 100644 src/products/types/ProductCreateData.ts create mode 100644 src/products/types/ProductDelete.ts create mode 100644 src/products/types/ProductDetails.ts create mode 100644 src/products/types/ProductFragment.ts create mode 100644 src/products/types/ProductImage.ts create mode 100644 src/products/types/ProductImageById.ts create mode 100644 src/products/types/ProductImageCreate.ts create mode 100644 src/products/types/ProductImageDelete.ts create mode 100644 src/products/types/ProductImageFragment.ts create mode 100644 src/products/types/ProductImageReorder.ts create mode 100644 src/products/types/ProductImageUpdate.ts create mode 100644 src/products/types/ProductList.ts create mode 100644 src/products/types/ProductUpdate.ts create mode 100644 src/products/types/ProductVariant.ts create mode 100644 src/products/types/ProductVariantBulkDelete.ts create mode 100644 src/products/types/ProductVariantCreateData.ts create mode 100644 src/products/types/ProductVariantDetails.ts create mode 100644 src/products/types/SimpleProductUpdate.ts create mode 100644 src/products/types/VariantCreate.ts create mode 100644 src/products/types/VariantDelete.ts create mode 100644 src/products/types/VariantImageAssign.ts create mode 100644 src/products/types/VariantImageUnassign.ts create mode 100644 src/products/types/VariantUpdate.ts create mode 100644 src/products/types/productBulkDelete.ts create mode 100644 src/products/types/productBulkPublish.ts create mode 100644 src/products/urls.ts create mode 100644 src/products/views/ProductCreate.tsx create mode 100644 src/products/views/ProductImage.tsx create mode 100644 src/products/views/ProductList/ProductList.tsx create mode 100644 src/products/views/ProductList/filters.ts create mode 100644 src/products/views/ProductList/index.ts create mode 100644 src/products/views/ProductUpdate.tsx create mode 100644 src/products/views/ProductVariant.tsx create mode 100644 src/products/views/ProductVariantCreate.tsx create mode 100644 src/queries.tsx create mode 100644 src/shipping/components/ShippingWeightUnitForm/ShippingWeightUnitForm.tsx create mode 100644 src/shipping/components/ShippingWeightUnitForm/index.ts create mode 100644 src/shipping/components/ShippingZoneCountriesAssignDialog/ShippingZoneCountriesAssignDialog.tsx create mode 100644 src/shipping/components/ShippingZoneCountriesAssignDialog/index.ts create mode 100644 src/shipping/components/ShippingZoneCreatePage/ShippingZoneCreatePage.tsx create mode 100644 src/shipping/components/ShippingZoneCreatePage/index.ts create mode 100644 src/shipping/components/ShippingZoneDetailsPage/ShippingZoneDetailsPage.tsx create mode 100644 src/shipping/components/ShippingZoneDetailsPage/index.ts create mode 100644 src/shipping/components/ShippingZoneInfo/ShippingZoneInfo.tsx create mode 100644 src/shipping/components/ShippingZoneInfo/index.ts create mode 100644 src/shipping/components/ShippingZoneRateDialog/ShippingZoneRateDialog.tsx create mode 100644 src/shipping/components/ShippingZoneRateDialog/index.ts create mode 100644 src/shipping/components/ShippingZoneRates/ShippingZoneRates.tsx create mode 100644 src/shipping/components/ShippingZoneRates/index.ts create mode 100644 src/shipping/components/ShippingZonesList/ShippingZonesList.tsx create mode 100644 src/shipping/components/ShippingZonesList/index.ts create mode 100644 src/shipping/components/ShippingZonesListPage/ShippingZonesListPage.tsx create mode 100644 src/shipping/components/ShippingZonesListPage/index.ts create mode 100644 src/shipping/fixtures.ts create mode 100644 src/shipping/index.tsx create mode 100644 src/shipping/mutations.ts create mode 100644 src/shipping/queries.ts create mode 100644 src/shipping/types/BulkDeleteShippingRate.ts create mode 100644 src/shipping/types/BulkDeleteShippingZone.ts create mode 100644 src/shipping/types/CreateShippingRate.ts create mode 100644 src/shipping/types/CreateShippingZone.ts create mode 100644 src/shipping/types/DeleteShippingRate.ts create mode 100644 src/shipping/types/DeleteShippingZone.ts create mode 100644 src/shipping/types/ShippingMethodFragment.ts create mode 100644 src/shipping/types/ShippingZone.ts create mode 100644 src/shipping/types/ShippingZoneDetailsFragment.ts create mode 100644 src/shipping/types/ShippingZoneFragment.ts create mode 100644 src/shipping/types/ShippingZones.ts create mode 100644 src/shipping/types/UpdateDefaultWeightUnit.ts create mode 100644 src/shipping/types/UpdateShippingRate.ts create mode 100644 src/shipping/types/UpdateShippingZone.ts create mode 100644 src/shipping/urls.ts create mode 100644 src/shipping/views/ShippingZoneCreate.tsx create mode 100644 src/shipping/views/ShippingZoneDetails/ShippingZoneDetailsDialogs.tsx create mode 100644 src/shipping/views/ShippingZoneDetails/ShippingZoneOperations.tsx create mode 100644 src/shipping/views/ShippingZoneDetails/index.tsx create mode 100644 src/shipping/views/ShippingZonesList.tsx create mode 100644 src/siteSettings/components/SiteSettingsDetails/SiteSettingsDetails.tsx create mode 100644 src/siteSettings/components/SiteSettingsDetails/index.ts create mode 100644 src/siteSettings/components/SiteSettingsKeyDialog/SiteSettingsKeyDialog.tsx create mode 100644 src/siteSettings/components/SiteSettingsKeyDialog/index.ts create mode 100644 src/siteSettings/components/SiteSettingsKeys/SiteSettingsKeys.tsx create mode 100644 src/siteSettings/components/SiteSettingsKeys/index.ts create mode 100644 src/siteSettings/components/SiteSettingsPage/SiteSettingsPage.tsx create mode 100644 src/siteSettings/components/SiteSettingsPage/index.ts create mode 100644 src/siteSettings/fixtures.ts create mode 100644 src/siteSettings/index.tsx create mode 100644 src/siteSettings/mutations.ts create mode 100644 src/siteSettings/queries.ts create mode 100644 src/siteSettings/types/AuthorizationKeyAdd.ts create mode 100644 src/siteSettings/types/AuthorizationKeyDelete.ts create mode 100644 src/siteSettings/types/ShopFragment.ts create mode 100644 src/siteSettings/types/ShopSettingsUpdate.ts create mode 100644 src/siteSettings/types/SiteSettings.ts create mode 100644 src/siteSettings/urls.ts create mode 100644 src/siteSettings/views/index.tsx create mode 100644 src/staff/components/StaffAddMemberDialog/StaffAddMemberDialog.tsx create mode 100644 src/staff/components/StaffAddMemberDialog/index.ts create mode 100644 src/staff/components/StaffDetailsPage/StaffDetailsPage.tsx create mode 100644 src/staff/components/StaffDetailsPage/index.ts create mode 100644 src/staff/components/StaffList/StaffList.tsx create mode 100644 src/staff/components/StaffList/index.ts create mode 100644 src/staff/components/StaffListPage/StaffListPage.tsx create mode 100644 src/staff/components/StaffListPage/index.ts create mode 100644 src/staff/components/StaffPermissions/StaffPermissions.tsx create mode 100644 src/staff/components/StaffPermissions/index.ts create mode 100644 src/staff/components/StaffProperties/StaffProperties.tsx create mode 100644 src/staff/components/StaffProperties/index.ts create mode 100644 src/staff/components/StaffStatus/StaffStatus.tsx create mode 100644 src/staff/components/StaffStatus/index.ts create mode 100644 src/staff/fixtures.ts create mode 100644 src/staff/index.tsx create mode 100644 src/staff/mutations.ts create mode 100644 src/staff/queries.ts create mode 100644 src/staff/types/StaffAvatarDelete.ts create mode 100644 src/staff/types/StaffAvatarUpdate.ts create mode 100644 src/staff/types/StaffList.ts create mode 100644 src/staff/types/StaffMemberAdd.ts create mode 100644 src/staff/types/StaffMemberDelete.ts create mode 100644 src/staff/types/StaffMemberDetails.ts create mode 100644 src/staff/types/StaffMemberDetailsFragment.ts create mode 100644 src/staff/types/StaffMemberFragment.ts create mode 100644 src/staff/types/StaffMemberUpdate.ts create mode 100644 src/staff/urls.ts create mode 100644 src/staff/views/StaffDetails.tsx create mode 100644 src/staff/views/StaffList.tsx create mode 100644 src/storybook/.babelrc create mode 100644 src/storybook/CardDecorator.tsx create mode 100644 src/storybook/Decorator.tsx create mode 100644 src/storybook/Stories.test.ts create mode 100644 src/storybook/__snapshots__/Stories.test.ts.snap create mode 100644 src/storybook/config.js create mode 100644 src/storybook/misc.ts create mode 100644 src/storybook/mock.tsx create mode 100644 src/storybook/stories/auth/LoginLoading.tsx create mode 100644 src/storybook/stories/auth/LoginPage.tsx create mode 100644 src/storybook/stories/categories/CategoryCreatePage.tsx create mode 100644 src/storybook/stories/categories/CategoryListPage.tsx create mode 100644 src/storybook/stories/categories/CategoryProducts.tsx create mode 100644 src/storybook/stories/categories/CategoryUpdatePage.tsx create mode 100644 src/storybook/stories/collections/CollectionCreatePage.tsx create mode 100644 src/storybook/stories/collections/CollectionDetailsPage.tsx create mode 100644 src/storybook/stories/collections/CollectionListPage.tsx create mode 100644 src/storybook/stories/components/ActionDialog.tsx create mode 100644 src/storybook/stories/components/AddressEdit.tsx create mode 100644 src/storybook/stories/components/AddressFormatter.tsx create mode 100644 src/storybook/stories/components/AutocompleteSelectMenu.tsx create mode 100644 src/storybook/stories/components/CardMenu.tsx create mode 100644 src/storybook/stories/components/Checkbox.tsx create mode 100644 src/storybook/stories/components/Chip.tsx create mode 100644 src/storybook/stories/components/Date.tsx create mode 100644 src/storybook/stories/components/DateTime.tsx create mode 100644 src/storybook/stories/components/DeleteFilterTabDialog.tsx create mode 100644 src/storybook/stories/components/EditableTableCell.tsx create mode 100644 src/storybook/stories/components/ErrorMessageCard.tsx create mode 100644 src/storybook/stories/components/ErrorPage.tsx create mode 100644 src/storybook/stories/components/ExternalLink.tsx create mode 100644 src/storybook/stories/components/FileUpload.tsx create mode 100644 src/storybook/stories/components/Filter.tsx create mode 100644 src/storybook/stories/components/Money.tsx create mode 100644 src/storybook/stories/components/MoneyRange.tsx create mode 100644 src/storybook/stories/components/MultiAutocompleteSelectField.tsx create mode 100644 src/storybook/stories/components/MultiSelectField.tsx create mode 100644 src/storybook/stories/components/NotFoundPage.tsx create mode 100644 src/storybook/stories/components/PageHeader.tsx create mode 100644 src/storybook/stories/components/Percent.tsx create mode 100644 src/storybook/stories/components/PhoneField.tsx create mode 100644 src/storybook/stories/components/PriceField.tsx create mode 100644 src/storybook/stories/components/RichTextEditor.tsx create mode 100644 src/storybook/stories/components/SaveButtonBar.tsx create mode 100644 src/storybook/stories/components/SaveFilterTabDialog.tsx create mode 100644 src/storybook/stories/components/SingleAutocompleteSelectField.tsx create mode 100644 src/storybook/stories/components/SingleSelectField.tsx create mode 100644 src/storybook/stories/components/Skeleton.tsx create mode 100644 src/storybook/stories/components/StatusLabel.tsx create mode 100644 src/storybook/stories/components/TablePagination.tsx create mode 100644 src/storybook/stories/components/Timeline.tsx create mode 100644 src/storybook/stories/components/Weight.tsx create mode 100644 src/storybook/stories/components/WeightRange.tsx create mode 100644 src/storybook/stories/components/messages.tsx create mode 100644 src/storybook/stories/configuration/ConfigurationPage.tsx create mode 100644 src/storybook/stories/customers/CustomerAddressDialog.tsx create mode 100644 src/storybook/stories/customers/CustomerAddressListPage.tsx create mode 100644 src/storybook/stories/customers/CustomerCreatePage.tsx create mode 100644 src/storybook/stories/customers/CustomerDetailsPage.tsx create mode 100644 src/storybook/stories/customers/CustomerListPage.tsx create mode 100644 src/storybook/stories/discounts/DiscountCountrySelectDialog.tsx create mode 100644 src/storybook/stories/discounts/SaleCreatePage.tsx create mode 100644 src/storybook/stories/discounts/SaleDetailsPage.tsx create mode 100644 src/storybook/stories/discounts/SaleListPage.tsx create mode 100644 src/storybook/stories/discounts/VoucherCreatePage.tsx create mode 100644 src/storybook/stories/discounts/VoucherDetailsPage.tsx create mode 100644 src/storybook/stories/discounts/VoucherListPage.tsx create mode 100644 src/storybook/stories/home/HomePage.tsx create mode 100644 src/storybook/stories/navigation/MenuCreateDialog.tsx create mode 100644 src/storybook/stories/navigation/MenuDetailsPage.tsx create mode 100644 src/storybook/stories/navigation/MenuItemDialog.tsx create mode 100644 src/storybook/stories/navigation/MenuListPage.tsx create mode 100644 src/storybook/stories/orders/OrderAddressEditDialog.tsx create mode 100644 src/storybook/stories/orders/OrderBulkCancelDialog.tsx create mode 100644 src/storybook/stories/orders/OrderCancelDialog.tsx create mode 100644 src/storybook/stories/orders/OrderCustomer.tsx create mode 100644 src/storybook/stories/orders/OrderCustomerEditDialog.tsx create mode 100644 src/storybook/stories/orders/OrderDetailsPage.tsx create mode 100644 src/storybook/stories/orders/OrderDraftCancelDialog.tsx create mode 100644 src/storybook/stories/orders/OrderDraftFinalizeDialog.tsx create mode 100644 src/storybook/stories/orders/OrderDraftListPage.tsx create mode 100644 src/storybook/stories/orders/OrderDraftPage.tsx create mode 100644 src/storybook/stories/orders/OrderFulfillmentCancelDialog.tsx create mode 100644 src/storybook/stories/orders/OrderFulfillmentDialog.tsx create mode 100644 src/storybook/stories/orders/OrderFulfillmentTrackingDialog.tsx create mode 100644 src/storybook/stories/orders/OrderHistory.tsx create mode 100644 src/storybook/stories/orders/OrderListPage.tsx create mode 100644 src/storybook/stories/orders/OrderMarkAsPaidDialog.tsx create mode 100644 src/storybook/stories/orders/OrderPaymentDialog.tsx create mode 100644 src/storybook/stories/orders/OrderPaymentVoidDialog.tsx create mode 100644 src/storybook/stories/orders/OrderProductAddDialog.tsx create mode 100644 src/storybook/stories/orders/OrderShippingMethodEditDialog.tsx create mode 100644 src/storybook/stories/pages/PageDetailsPage.tsx create mode 100644 src/storybook/stories/pages/PageListPage.tsx create mode 100644 src/storybook/stories/productTypes/ProductTypeAttributeEditDialog.tsx create mode 100644 src/storybook/stories/productTypes/ProductTypeCreatePage.tsx create mode 100644 src/storybook/stories/productTypes/ProductTypeDetailsPage.tsx create mode 100644 src/storybook/stories/productTypes/ProductTypeListPage.tsx create mode 100644 src/storybook/stories/products/ProductCreatePage.tsx create mode 100644 src/storybook/stories/products/ProductImagePage.tsx create mode 100644 src/storybook/stories/products/ProductListCard.tsx create mode 100644 src/storybook/stories/products/ProductUpdatePage.tsx create mode 100644 src/storybook/stories/products/ProductVariantCreatePage.tsx create mode 100644 src/storybook/stories/products/ProductVariantImageSelectDialog.tsx create mode 100644 src/storybook/stories/products/ProductVariantPage.tsx create mode 100644 src/storybook/stories/shipping/ShippingZoneCountriesAssignDialog.tsx create mode 100644 src/storybook/stories/shipping/ShippingZoneCreatePage.tsx create mode 100644 src/storybook/stories/shipping/ShippingZoneDetailsPage.tsx create mode 100644 src/storybook/stories/shipping/ShippingZoneRateDialog.tsx create mode 100644 src/storybook/stories/shipping/ShippingZonesListPage.tsx create mode 100644 src/storybook/stories/siteSettings/SiteSettingsKeyDialog.tsx create mode 100644 src/storybook/stories/siteSettings/SiteSettingsPage.tsx create mode 100644 src/storybook/stories/staff/StaffDetailsPage.tsx create mode 100644 src/storybook/stories/staff/StaffListPage.tsx create mode 100644 src/storybook/stories/taxes/CountryListPage.tsx create mode 100644 src/storybook/stories/taxes/CountryTaxesPage.tsx create mode 100644 src/storybook/stories/taxes/fixtures.ts create mode 100644 src/storybook/stories/translations/TranslationsEntitiesListPage.tsx create mode 100644 src/storybook/stories/translations/TranslationsLanguageListPage.tsx create mode 100644 src/storybook/webpack.config.js create mode 100644 src/taxes/components/CountryList/CountryList.tsx create mode 100644 src/taxes/components/CountryList/index.ts create mode 100644 src/taxes/components/CountryListPage/CountryListPage.tsx create mode 100644 src/taxes/components/CountryListPage/index.ts create mode 100644 src/taxes/components/CountryTaxesPage/CountryTaxesPage.tsx create mode 100644 src/taxes/components/CountryTaxesPage/index.ts create mode 100644 src/taxes/components/TaxConfiguration/TaxConfiguration.tsx create mode 100644 src/taxes/components/TaxConfiguration/index.ts create mode 100644 src/taxes/index.tsx create mode 100644 src/taxes/mutations.ts create mode 100644 src/taxes/queries.ts create mode 100644 src/taxes/types/CountryFragment.ts create mode 100644 src/taxes/types/CountryList.ts create mode 100644 src/taxes/types/CountryWithTaxesFragment.ts create mode 100644 src/taxes/types/FetchTaxes.ts create mode 100644 src/taxes/types/ShopTaxesFragment.ts create mode 100644 src/taxes/types/UpdateTaxSettings.ts create mode 100644 src/taxes/urls.ts create mode 100644 src/taxes/views/CountryList.tsx create mode 100644 src/taxes/views/CountryTaxes.tsx create mode 100644 src/theme.ts create mode 100644 src/translations/components/TranslationFields/TranslationFields.tsx create mode 100644 src/translations/components/TranslationFields/TranslationFieldsLong.tsx create mode 100644 src/translations/components/TranslationFields/TranslationFieldsRich.tsx create mode 100644 src/translations/components/TranslationFields/TranslationFieldsSave.tsx create mode 100644 src/translations/components/TranslationFields/TranslationFieldsShort.tsx create mode 100644 src/translations/components/TranslationFields/index.ts create mode 100644 src/translations/components/TranslationsCategoriesPage/TranslationsCategoriesPage.tsx create mode 100644 src/translations/components/TranslationsCategoriesPage/index.ts create mode 100644 src/translations/components/TranslationsCollectionsPage/TranslationsCollectionsPage.tsx create mode 100644 src/translations/components/TranslationsCollectionsPage/index.ts create mode 100644 src/translations/components/TranslationsEntitiesList/TranslationsEntitiesList.tsx create mode 100644 src/translations/components/TranslationsEntitiesList/index.ts create mode 100644 src/translations/components/TranslationsEntitiesListPage/TranslationsEntitiesListPage.tsx create mode 100644 src/translations/components/TranslationsEntitiesListPage/index.ts create mode 100644 src/translations/components/TranslationsLanguageList/TranslationsLanguageList.tsx create mode 100644 src/translations/components/TranslationsLanguageList/index.ts create mode 100644 src/translations/components/TranslationsLanguageListPage/TranslationsLanguageListPage.tsx create mode 100644 src/translations/components/TranslationsLanguageListPage/index.ts create mode 100644 src/translations/components/TranslationsPagesPage/TranslationsPagesPage.tsx create mode 100644 src/translations/components/TranslationsPagesPage/index.ts create mode 100644 src/translations/components/TranslationsProductTypesPage/TranslationsProductTypesPage.tsx create mode 100644 src/translations/components/TranslationsProductTypesPage/index.ts create mode 100644 src/translations/components/TranslationsProductsPage/TranslationsProductsPage.tsx create mode 100644 src/translations/components/TranslationsProductsPage/index.ts create mode 100644 src/translations/components/TranslationsSalesPage/TranslationsSalesPage.tsx create mode 100644 src/translations/components/TranslationsSalesPage/index.ts create mode 100644 src/translations/components/TranslationsVouchersPage/TranslationsVouchersPage.tsx create mode 100644 src/translations/components/TranslationsVouchersPage/index.ts create mode 100644 src/translations/fixtures.ts create mode 100644 src/translations/index.tsx create mode 100644 src/translations/mutations.ts create mode 100644 src/translations/queries.ts create mode 100644 src/translations/types/AttributeTranslationFragment.ts create mode 100644 src/translations/types/CategoryTranslationDetails.ts create mode 100644 src/translations/types/CategoryTranslationFragment.ts create mode 100644 src/translations/types/CategoryTranslations.ts create mode 100644 src/translations/types/CollectionTranslationDetails.ts create mode 100644 src/translations/types/CollectionTranslationFragment.ts create mode 100644 src/translations/types/CollectionTranslations.ts create mode 100644 src/translations/types/PageTranslationDetails.ts create mode 100644 src/translations/types/PageTranslationFragment.ts create mode 100644 src/translations/types/PageTranslations.ts create mode 100644 src/translations/types/ProductTranslationDetails.ts create mode 100644 src/translations/types/ProductTranslationFragment.ts create mode 100644 src/translations/types/ProductTranslations.ts create mode 100644 src/translations/types/ProductTypeTranslationDetails.ts create mode 100644 src/translations/types/ProductTypeTranslationFragment.ts create mode 100644 src/translations/types/ProductTypeTranslations.ts create mode 100644 src/translations/types/SaleTranslationDetails.ts create mode 100644 src/translations/types/SaleTranslationFragment.ts create mode 100644 src/translations/types/SaleTranslations.ts create mode 100644 src/translations/types/ShippingMethodTranslationFragment.ts create mode 100644 src/translations/types/TranslationsEntitiesPage.ts create mode 100644 src/translations/types/UpdateAttributeTranslations.ts create mode 100644 src/translations/types/UpdateAttributeValueTranslations.ts create mode 100644 src/translations/types/UpdateCategoryTranslations.ts create mode 100644 src/translations/types/UpdateCollectionTranslations.ts create mode 100644 src/translations/types/UpdatePageTranslations.ts create mode 100644 src/translations/types/UpdateProductTranslations.ts create mode 100644 src/translations/types/UpdateSaleTranslations.ts create mode 100644 src/translations/types/UpdateVoucherTranslations.ts create mode 100644 src/translations/types/VoucherTranslationDetails.ts create mode 100644 src/translations/types/VoucherTranslationFragment.ts create mode 100644 src/translations/types/VoucherTranslations.ts create mode 100644 src/translations/urls.ts create mode 100644 src/translations/views/TranslationsCategories.tsx create mode 100644 src/translations/views/TranslationsCollections.tsx create mode 100644 src/translations/views/TranslationsEntities.tsx create mode 100644 src/translations/views/TranslationsLanguageList.tsx create mode 100644 src/translations/views/TranslationsPages.tsx create mode 100644 src/translations/views/TranslationsProductTypes.tsx create mode 100644 src/translations/views/TranslationsProducts.tsx create mode 100644 src/translations/views/TranslationsSales.tsx create mode 100644 src/translations/views/TranslationsVouchers.tsx create mode 100644 src/types.ts create mode 100644 src/types/PageInfoFragment.ts create mode 100644 src/types/globalTypes.ts create mode 100644 src/utils/filters/filters.ts create mode 100644 src/utils/filters/index.ts create mode 100644 src/utils/filters/storage.ts create mode 100644 src/utils/menu/__snapshots__/menu.test.ts.snap create mode 100644 src/utils/menu/index.ts create mode 100644 src/utils/menu/menu.test.ts create mode 100644 src/utils/menu/menu.ts create mode 100644 tsconfig.json create mode 100644 tslint.json create mode 100644 webpack.config.js create mode 100644 webpack.d.ts diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 000000000..65a8dd271 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,37 @@ +engines: + eslint: + enabled: true + channel: eslint-4 + isort: + enabled: true + channel: beta + pep8: + enabled: true + pylint: + enabled: true + channel: beta + plugins: + - celery + - django + checks: + import-error: + enabled: false + tslint: + enabled: true + config: tslint.json + duplication: + enabled: true + config: + languages: + python: + mass_threshold: 100 + python_version: 3 +exclude_patterns: +- ".*" +- "**/__pycache__/" +- "**/migrations/" +- "node_modules/" +- "tests/" +ratings: + paths: + - saleor/** diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..aa6004261 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +*.py[cod] +.* +!.babelrc +!.circleci +!.codeclimate.yml +!.coveragerc +!.dockerignore +!.eslintrc.json +!.flowconfig +!.gqlconfig +!.github +!.gitignore +!.nvmrc +!.npmrc +!.plop +!.pylintrc +!.travis* +!.tx +*.css +*.log +*.pot +*.pyc +local_settings.py +__pycache__/ +build/ +coverage/ +dist/ +*\.egg* +# data +/docs/_build/ +/media/ +/node_modules/ +/static/ +/saleor/static/assets/ +webpack-bundle.json +/templates/templated_email/compiled/* +!/templates/templated_email/compiled/.gitkeep + +# Exported results file +django-queries-results.html diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..0ecb29384 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +puppeteer_skip_chromium_download = true diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..b66f6e5c3 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,73 @@ +dist: xenial +language: python +sudo: false + +python: + - "3.6" + - "3.7" + +branches: + only: + - master + - /next\/.*/ + +cache: + pip: true + directories: + - node_modules + - $HOME/.cache/pip + +install: + - pip install -U pip setuptools wheel + - pip install tox-travis pytest-django-queries + - git clone https://github.com/NyanKiyoshi/pytest-django-queries-ci-tools.git --depth 1 ../queries-ci-tools + - > + if [ -n "$DJANGO" ]; then + nvm install 10 \ + && npm i \ + && npm run build-assets --production \ + && npm run build-emails + fi + +script: + - > + if [ -n "$DJANGO" ]; then + npm run test + fi + - tox + +env: + global: + - DATABASE_URL="postgres://postgres@localhost:5432/saleor" + - SECRET_KEY="irrelevant" + - DIFF_RESULTS_BASE_URL="http://dhrwmpu5reeyd.cloudfront.net" + - QUERIES_RESULTS_PATH=/tmp/queries-results.json + matrix: + - DJANGO="2.2" + - DJANGO="master" + +matrix: + fast_finish: true + include: + - env: TOXENV=black + python: "3.6" + - env: TOXENV=flake8 + python: "3.6" + - env: TOXENV=check_gql_schema + python: "3.6" + - env: TOXENV=check_migrations + python: "3.6" + allow_failures: + - python: "3.6" + env: DJANGO="master" + - python: "3.7" + env: DJANGO="master" + +services: + - postgresql + +addons: + postgresql: 9.4 + +after_success: + - ../queries-ci-tools/handle-event.sh diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..8c9e2af55 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,517 @@ +# Changelog + +All notable, unreleased changes to this project will be documented in this file. For the released changes, please visit the [Releases](https://github.com/mirumee/saleor/releases) page. + +## [Unreleased Changeset: Attributes] + +- The mutations `attributeCreate` and `attributeUpdate`: + - They no longer crash if no values were passed. - #4260 by @NyanKiyoshi + - They no longer accept the `productType` parameter and no longer return the attribute's `productType` in the root of the response; instead, you should query the attribute's `productType` manually. - #4260 by @NyanKiyoshi + - They now accept an optional `slug` input parameter for setting the internal representation of the attribute instead of always generating it. This allows users to have multiple attributes with the same name but that are different things or set of values. - #4260 by @NyanKiyoshi +- The `Attribute` model: + - They now always unique, instead of being unique only into a given product type. - #4260 by @NyanKiyoshi +- Attributes can now be associated to multiple product types. - #4266 by @NyanKiyoshi +- The `Attribute` model's `product_type` field was renamed to `product_types` (M2M related manager). - #4266 by @NyanKiyoshi +- Added `attributeAssign(...)` and `attributeUnassign(...)` mutations in the GraphQL API. - #4266 by @NyanKiyoshi + +## [Unreleased] + +- Fixed internal error when creating a checkout with a voucher code - #4292 by @NyanKiyoshi +- Add filter tab name as required - #4269 by @benekex2 +- A few unused panels are now disabled by default from the debug toolbar; this should improve loading time when debugging - #4301 by @NyanKiyoshi + +## 2.7.0 + +### API + +- Create order only when payment is successful - #4154 by @NyanKiyoshi +- Order Events containing order lines or fulfillment lines now return the line object in the GraphQL API - #4114 by @NyanKiyoshi +- GraphQL now prints exceptions to stderr as well as returning them or not - #4148 by @NyanKiyoshi +- Refactored API resolvers to static methods with root typing - #4155 by @NyanKiyoshi +- Add phone validation in the GraphQL API to handle the library upgrade - #4156 by @NyanKiyoshi + +### Core + +- Add basic Gift Cards support in the backend - #4025 by @fowczarek +- Add the ability to sort products within a collection - #4123 by @NyanKiyoshi +- Implement customer events - #4094 by @NyanKiyoshi +- Merge "authorize" and "capture" operations - #4098 by @korycins, @NyanKiyoshi +- Separate the Django middlewares from the GraphQL API middlewares - #4102 by @NyanKiyoshi, #4186 by @cmiacz + +### Dashboard 2.0 + +- Add navigation section - #4012 by @dominik-zeglen +- Add filtering on product list - #4193 by @dominik-zeglen +- Add filtering on orders list - #4237 by @dominik-zeglen +- Change input style and improve Storybook stories - #4115 by @dominik-zeglen +- Migrate deprecated fields in Dashboard 2.0 - #4121 by @benekex2 +- Add multiple select checkbox - #4133, #4146 by @benekex2 +- Rename menu items in Dashboard 2.0 - #4172 by @benekex2 +- Category delete modal improvements - #4171 by @benekex2 +- Close modals on click outside - #4236 - by @benekex2 +- Use date localize hook in translations - #4202 by @dominik-zeglen +- Unify search API - #4200 by @dominik-zeglen +- Default default PAGINATE_BY - #4238 by @dominik-zeglen +- Create generic filtering interface - #4221 by @dominik-zeglen +- Add default state to rich text editor = #4281 by @dominik-zeglen +- Fix translation discard button - #4109 by @benekex2 +- Fix draftail options and icons - #4132 by @benekex2 +- Fix typos and messages in Dashboard 2.0 - #4168 by @benekex2 +- Fix view all orders button - #4173 by @benekex2 +- Fix visibility card view - #4198 by @benekex2 +- Fix query refetch after selecting an object in list - #4272 by @dominik-zeglen +- Fix image selection in variants - #4270 by @benekex2 +- Fix collection search - #4267 by @dominik-zeglen +- Fix quantity height in draft order edit - #4273 by @benekex2 +- Fix checkbox clickable area size - #4280 by @dominik-zeglen +- Fix breaking object selection in menu section - #4282 by @dominik-zeglen +- Reset selected items when tab switch - #4268 by @benekex2 +- Add attribute section - #4305 by @dominik-zeglen + +### Other notable changes + +- Add support for Google Cloud Storage - #4127 by @chetabahana +- Adding a nonexistent variant to checkout no longer crashes - #4166 by @NyanKiyoshi +- Disable storage of Celery results - #4169 by @NyanKiyoshi +- Disable polling in Playground - #4188 by @maarcingebala +- Cleanup code for updated function names and unused argument - #4090 by @jxltom +- Users can now add multiple "Add to Cart" forms in a single page - #4165 by @NyanKiyoshi +- Fix incorrect argument in `get_client_token` in Braintree integration - #4182 by @maarcingebala +- Fix resolving attribute values when transforming them to HStore - #4161 by @maarcingebala +- Fix wrong calculation of subtotal in cart page - #4145 by @korycins +- Fix margin calculations when product/variant price is set to zero - #4170 by @MahmoudRizk +- Fix applying discounts in checkout's subtotal calculation in API - #4192 by @maarcingebala +- Fix GATEWAYS_ENUM to always contain all implemented payment gateways - #4108 by @koradon + + +## 2.6.0 + +### API + +- Add unified filtering interface in resolvers - #3952, #4078 by @korycins +- Add mutations for bulk actions - #3935, #3954, #3967, #3969, #3970 by @akjanik +- Add mutation for reordering menu items - #3958 by @NyanKiyoshi +- Optimize queries for single nodes - #3968 @NyanKiyoshi +- Refactor error handling in mutations #3891 by @maarcingebala & @akjanik +- Specify mutation permissions through Meta classes - #3980 by @NyanKiyoshi +- Unify pricing access in products and variants - #3948 by @NyanKiyoshi +- Use only_fields instead of exclude_fields in type definitions - #3940 by @michaljelonek +- Prefetch collections when getting sales of a bunch of products - #3961 by @NyanKiyoshi +- Remove unnecessary dedents from GraphQL schema so new Playground can work - #4045 by @salwator +- Restrict resolving payment by ID - #4009 @NyanKiyoshi +- Require `checkoutId` for updating checkout's shipping and billing address - #4074 by @jxltom +- Handle errors in `TokenVerify` mutation - #3981 by @fowczarek +- Unify argument names in types and resolvers - #3942 by @NyanKiyoshi + +### Core + +- Use Black as the default code formatting tool - #3852 by @krzysztofwolski and @NyanKiyoshi +- Dropped Python 3.5 support - #4028 by @korycins +- Rename Cart to Checkout - #3963 by @michaljelonek +- Use data classes to exchange data with payment gateways - #4028 by @korycins +- Refactor order events - #4018 by @NyanKiyoshi + +### Dashboard 2.0 + +- Add bulk actions - #3955 by @dominik-zeglen +- Add user avatar management - #4030 by @benekex2 +- Add navigation drawer support on mobile devices - #3839 by @benekex2 +- Fix rendering validation errors in product form - #4024 by @benekex2 +- Move dialog windows to query string rather than router paths - #3953 by @dominik-zeglen +- Update order events types - #4089 by @jxltom +- Code cleanup by replacing render props with react hooks - #4010 by @dominik-zeglen + +### Other notable changes + +- Add setting to enable Django Debug Toolbar - #3983 by @koradon +- Use newest GraphQL Playground - #3971 by @salwator +- Ensure adding to quantities in the checkout is respecting the limits - #4005 by @NyanKiyoshi +- Fix country area choices - #4008 by @fowczarek +- Fix price_range_as_dict function - #3999 by @zodiacfireworks +- Fix the product listing not showing in the voucher when there were products selected - #4062 by @NyanKiyoshi +- Fix crash in Dashboard 1.0 when updating an order address's phone number - #4061 by @NyanKiyoshi +- Reduce the time of tests execution by using dummy password hasher - #4083 by @korycins +- Set up explicit **hash** function - #3979 by @akjanik +- Unit tests use none as media root - #3975 by @korycins +- Update file field styles with materializecss template filter - #3998 by @zodiacfireworks +- New translations: + - Albanian + - Colombian Spanish + - Lithuanian + +## 2.5.0 + +### API + +- Add query to fetch draft orders - #3809 by @michaljelonek +- Add bulk delete mutations - #3838 by @michaljelonek +- Add `languageCode` enum to API - #3819 by @michaljelonek, #3854 by @jxltom +- Duplicate address instances in checkout mutations - #3866 by @pawelzar +- Restrict access to `orders` query for unauthorized users - #3861 by @pawelzar +- Support setting address as default in address mutations - #3787 by @jxltom +- Fix phone number validation in GraphQL when country prefix not given - #3905 by @patrys +- Report pretty stack traces in DEBUG mode - #3918 by @patrys + +### Core + +- Drop support for Django 2.1 and Django 1.11 (previous LTS) - #3929 by @patrys +- Fulfillment of digital products - #3868 by @korycins +- Introduce avatars for staff accounts - #3878 by @pawelzar +- Refactor the account avatars path from a relative to absolute - #3938 by @NyanKiyoshi + +### Dashboard 2.0 + +- Add translations section - #3884 by @dominik-zeglen +- Add light/dark theme - #3856 by @dominik-zeglen +- Add customer's address book view - #3826 by @dominik-zeglen +- Add "Add variant" button on the variant details page = #3914 by @dominik-zeglen +- Add back arrows in "Configure" subsections - #3917 by @dominik-zeglen +- Display avatars in staff views - #3922 by @dominik-zeglen +- Prevent user from changing his own status and permissions - #3922 by @dominik-zeglen +- Fix crashing product create view - #3837, #3910 by @dominik-zeglen +- Fix layout in staff members details page - #3857 by @dominik-zeglen +- Fix unfocusing rich text editor - #3902 by @dominik-zeglen +- Improve accessibility - #3856 by @dominik-zeglen + +### Other notable changes + +- Improve user and staff management in dashboard 1.0 - #3781 by @jxltom +- Fix default product tax rate in Dashboard 1.0 - #3880 by @pawelzar +- Fix logo in docs - #3928 by @michaljelonek +- Fix name of logo file - #3867 by @jxltom +- Fix variants for juices in example data - #3926 by @michaljelonek +- Fix alignment of the cart dropdown on new bootstrap version - #3937 by @NyanKiyoshi +- Refactor the account avatars path from a relative to absolute - #3938 by @NyanKiyoshi +- New translations: + - Armenian + - Portuguese + - Swahili + - Thai + +## 2.4.0 + +### API + +- Add model translations support in GraphQL API - #3789 by @michaljelonek +- Add mutations to manage addresses for authenticated customers - #3772 by @Kwaidan00, @maarcingebala +- Add mutation to apply vouchers in checkout - #3739 by @Kwaidan00 +- Add thumbnail field to `OrderLine` type - #3737 by @michaljelonek +- Add a query to fetch order by token - #3740 by @michaljelonek +- Add city choices and city area type to address validator API - #3788 by @jxltom +- Fix access to unpublished objects in API - #3724 by @Kwaidan00 +- Fix bug where errors are not returned when creating fulfillment with a non-existent order line - #3777 by @jxltom +- Fix `productCreate` mutation when no product type was provided - #3804 by @michaljelonek +- Enable database search in products query - #3736 by @michaljelonek +- Use authenticated user's email as default email in creating checkout - #3726 by @jxltom +- Generate voucher code if it wasn't provided in mutation - #3717 by @Kwaidan00 +- Improve limitation of vouchers by country - #3707 by @michaljelonek +- Only include canceled fulfillments for staff in fulfillment API - #3778 by @jxltom +- Support setting address as when creating customer address #3782 by @jxltom +- Fix generating slug from title - #3816 by @maarcingebala +- Add `variant` field to `OrderLine` type - #3820 by @maarcingebala + +### Core + +- Add JSON fields to store rich-text content - #3756 by @michaljelonek +- Add function to recalculate total order weight - #3755 by @Kwaidan00, @maarcingebala +- Unify cart creation logic in API and Django views - #3761, #3790 by @maarcingebala +- Unify payment creation logic in API and Django views - #3715 by @maarcingebala +- Support partially charged and refunded payments - #3735 by @jxltom +- Support partial fulfillment of ordered items - #3754 by @jxltom +- Fix applying discounts when a sale has no end date - #3595 by @cprinos + +### Dashboard 2.0 + +- Add "Discounts" section - #3654 by @dominik-zeglen +- Add "Pages" section; introduce Draftail WYSIWYG editor - #3751 by @dominik-zeglen +- Add "Shipping Methods" section - #3770 by @dominik-zeglen +- Add support for date and datetime components - #3708 by @dominik-zeglen +- Restyle app layout - #3811 by @dominik-zeglen + +### Other notable changes + +- Unify model field names related to models' public access - `publication_date` and `is_published` - #3706 by @michaljelonek +- Improve filter orders by payment status - #3749 @jxltom +- Refactor translations in emails - #3701 by @Kwaidan00 +- Use exact image versions in docker-compose - #3742 by @ashishnitinpatil +- Sort order payment and history in descending order - #3747 by @jxltom +- Disable style-loader in dev mode - #3720 by @jxltom +- Add ordering to shipping method - #3806 by @michaljelonek +- Add missing type definition for dashboard 2.0 - #3776 by @jxltom +- Add header and footer for checkout success pages #3752 by @jxltom +- Add instructions for using local assets in Docker - #3723 by @michaljelonek +- Update S3 deployment documentation to include CORS configuration note - #3743 by @NyanKiyoshi +- Fix missing migrations for is_published field of product and page model - #3757 by @jxltom +- Fix problem with l10n in Braintree payment gateway template - #3691 by @Kwaidan00 +- Fix bug where payment is not filtered from active ones when creating payment - #3732 by @jxltom +- Fix incorrect cart badge location - #3786 by @jxltom +- Fix storefront styles after bootstrap is updated to 4.3.1 - #3753 by @jxltom +- Fix logo size in different browser and devices with different sizes - #3722 by @jxltom +- Rename dumpdata file `db.json` to `populatedb_data.json` - #3810 by @maarcingebala +- Prefetch collections for product availability - #3813 by @michaljelonek +- Bump django-graphql-jwt - #3814 by @michaljelonek +- Fix generating slug from title - #3816 by @maarcingebala +- New translations: + - Estonian + - Indonesian + +## 2.3.1 + +- Fix access to private variant fields in API - #3773 by maarcingebala +- Limit access of quantity and allocated quantity to staff in GraphQL API #3780 by @jxltom + +## 2.3.0 + +### API + +- Return user's last checkout in the `User` type - #3578 by @fowczarek +- Automatically assign checkout to the logged in user - #3587 by @fowczarek +- Expose `chargeTaxesOnShipping` field in the `Shop` type - #3603 by @fowczarek +- Expose list of enabled payment gateways - #3639 by @fowczarek +- Validate uploaded files in a unified way - #3633 by @fowczarek +- Add mutation to trigger fetching tax rates - #3622 by @fowczarek +- Use USERNAME_FIELD instead of hard-code email field when resolving user - #3577 by @jxltom +- Require variant and quantity fields in `CheckoutLineInput` type - #3592 by @jxltom +- Preserve order of nodes in `get_nodes_or_error` function - #3632 by @jxltom +- Add list mutations for `Voucher` and `Sale` models - #3669 by @michaljelonek +- Use proper type for countries in `Voucher` type - #3664 by @michaljelonek +- Require email in when creating checkout in API - #3667 by @michaljelonek +- Unify returning errors in the `tokenCreate` mutation - #3666 by @michaljelonek +- Use `Date` field in Sale/Voucher inputs - #3672 by @michaljelonek +- Refactor checkout mutations - #3610 by @fowczarek +- Refactor `clean_instance`, so it does not returns errors anymore - #3597 by @akjanik +- Handle GraphqQL syntax errors - #3576 by @jxltom + +### Core + +- Refactor payments architecture - #3519 by @michaljelonek +- Improve Docker and `docker-compose` configuration - #3657 by @michaljelonek +- Allow setting payment status manually for dummy gateway in Storefront 1.0 - #3648 by @jxltom +- Infer default transaction kind from operation type - #3646 by @jxltom +- Get correct payment status for order without any payments - #3605 by @jxltom +- Add default ordering by `id` for `CartLine` model - #3593 by @jxltom +- Fix "set password" email sent to customer created in the dashboard - #3688 by @Kwaidan00 + +### Dashboard 2.0 + +- ️Add taxes section - #3622 by @dominik-zeglen +- Add drag'n'drop image upload - #3611 by @dominik-zeglen +- Unify grid handling - #3520 by @dominik-zeglen +- Add component generator - #3670 by @dominik-zeglen +- Throw Typescript errors while snapshotting - #3611 by @dominik-zeglen +- Simplify mutation's error checking - #3589 by @dominik-zeglen +- Fix order cancelling - #3624 by @dominik-zeglen +- Fix logo placement - #3602 by @dominik-zeglen + +### Other notable changes + +- Register Celery task for updating exchange rates - #3599 by @jxltom +- Fix handling different attributes with the same slug - #3626 by @jxltom +- Add missing migrations for tax rate choices - #3629 by @jxltom +- Fix `TypeError` on calling `get_client_token` - #3660 by @michaljelonek +- Make shipping required as default when creating product types - #3655 by @jxltom +- Display payment status on customer's account page in Storefront 1.0 - #3637 by @jxltom +- Make order fields sequence in Dashboard 1.0 same as in Dashboard 2.0 - #3606 by @jxltom +- Fix returning products for homepage for the currently viewing user - #3598 by @jxltom +- Allow filtering payments by status in Dashboard 1.0 - #3608 by @jxltom +- Fix typo in the definition of order status - #3649 by @jxltom +- Add margin for order notes section - #3650 by @jxltom +- Fix logo position - #3609, #3616 by @jxltom +- Storefront visual improvements - #3696 by @piotrgrundas +- Fix product list price filter - #3697 by @Kwaidan00 +- Redirect to success page after successful payment - #3693 by @Kwaidan00 + +## 2.2.0 + +### API + +- Use `PermissionEnum` as input parameter type for `permissions` field - #3434 by @maarcingebala +- Add "authorize" and "charge" mutations for payments - #3426 by @jxltom +- Add alt text to product thumbnails and background images of collections and categories - #3429 by @fowczarek +- Fix passing decimal arguments = #3457 by @fowczarek +- Allow sorting products by the update date - #3470 by @jxltom +- Validate and clear the shipping method in draft order mutations - #3472 by @fowczarek +- Change tax rate field to choice field - #3478 by @fowczarek +- Allow filtering attributes by collections - #3508 by @maarcingebala +- Resolve to `None` when empty object ID was passed as mutation argument - #3497 by @maarcingebala +- Change `errors` field type from [Error] to [Error!] - #3489 by @fowczarek +- Support creating default variant for product types that don't use multiple variants - #3505 by @fowczarek +- Validate SKU when creating a default variant - #3555 by @fowczarek +- Extract enums to separate files - #3523 by @maarcingebala + +### Core + +- Add Stripe payment gateway - #3408 by @jxltom +- Add `first_name` and `last_name` fields to the `User` model - #3101 by @fowczarek +- Improve several payment validations - #3418 by @jxltom +- Optimize payments related database queries - #3455 by @jxltom +- Add publication date to collections - #3369 by @k-brk +- Fix hard-coded site name in order PDFs - #3526 by @NyanKiyoshi +- Update favicons to the new style - #3483 by @dominik-zeglen +- Fix migrations for default currency - #3235 by @bykof +- Remove Elasticsearch from `docker-compose.yml` - #3482 by @maarcingebala +- Resort imports in tests - #3471 by @jxltom +- Fix the no shipping orders payment crash on Stripe - #3550 by @NyanKiyoshi +- Bump backend dependencies - #3557 by @maarcingebala. This PR removes security issue CVE-2019-3498 which was present in Django 2.1.4. Saleor however wasn't vulnerable to this issue as it doesn't use the affected `django.views.defaults.page_not_found()` view. +- Generate random data using the default currency - #3512 by @stephenmoloney +- New translations: + - Catalan + - Serbian + +### Dashboard 2.0 + +- Restyle product selection dialogs - #3499 by @dominik-zeglen, @maarcingebala +- Fix minor visual bugs in Dashboard 2.0 - #3433 by @dominik-zeglen +- Display warning if order draft has missing data - #3431 by @dominik-zeglen +- Add description field to collections - #3435 by @dominik-zeglen +- Add query batching - #3443 by @dominik-zeglen +- Use autocomplete fields in country selection - #3443 by @dominik-zeglen +- Add alt text to categories and collections - #3461 by @dominik-zeglen +- Use first and last name of a customer or staff member in UI - #3247 by @Bonifacy1, @dominik-zeglen +- Show error page if an object was not found - #3463 by @dominik-zeglen +- Fix simple product's inventory data saving bug - #3474 by @dominik-zeglen +- Replace `thumbnailUrl` with `thumbnail { url }` - #3484 by @dominik-zeglen +- Change "Feature on Homepage" switch behavior - #3481 by @dominik-zeglen +- Expand payment section in order view - #3502 by @dominik-zeglen +- Change TypeScript loader to speed up the build process - #3545 by @patrys + +### Bugfixes + +- Do not show `Pay For Order` if order is partly paid since partial payment is not supported - #3398 by @jxltom +- Fix attribute filters in the products category view - #3535 by @fowczarek +- Fix storybook dependencies conflict - #3544 by @dominik-zeglen + +## 2.1.0 + +### API + +- Change selected connection fields to lists - #3307 by @fowczarek +- Require pagination in connections - #3352 by @maarcingebala +- Replace Graphene view with a custom one - #3263 by @patrys +- Change `sortBy` parameter to use enum type - #3345 by @fowczarek +- Add `me` query to fetch data of a logged-in user - #3202, #3316 by @fowczarek +- Add `canFinalize` field to the Order type - #3356 by @fowczarek +- Extract resolvers and mutations to separate files - #3248 by @fowczarek +- Add VAT tax rates field to country - #3392 by @michaljelonek +- Allow creating orders without users - #3396 by @fowczarek + +### Core + +- Add Razorpay payment gatway - #3205 by @NyanKiyoshi +- Use standard tax rate as a default tax rate value - #3340 by @fowczarek +- Add description field to the Collection model - #3275 by @fowczarek +- Enforce the POST method on VAT rates fetching - #3337 by @NyanKiyoshi +- Generate thumbnails for category/collection background images - #3270 by @NyanKiyoshi +- Add warm-up support in product image creation mutation - #3276 by @NyanKiyoshi +- Fix error in the `populatedb` script when running it not from the project root - #3272 by @NyanKiyoshi +- Make Webpack rebuilds fast - #3290 by @patrys +- Skip installing Chromium to make deployment faster - #3227 by @jxltom +- Add default test runner - #3258 by @jxltom +- Add Transifex client to Pipfile - #3321 by @jxltom +- Remove additional pytest arguments in tox - #3338 by @jxltom +- Remove test warnings - #3339 by @jxltom +- Remove runtime warning when product has discount - #3310 by @jxltom +- Remove `django-graphene-jwt` warnings - #3228 by @jxltom +- Disable deprecated warnings - #3229 by @jxltom +- Add `AWS_S3_ENDPOINT_URL` setting to support DigitalOcean spaces. - #3281 by @hairychris +- Add `.gitattributes` file to hide diffs for generated files on Github - #3055 by @NyanKiyoshi +- Add database sequence reset to `populatedb` - #3406 by @michaljelonek +- Get authorized amount from succeeded auth transactions - #3417 by @jxltom +- Resort imports by `isort` - #3412 by @jxltom + +### Dashboard 2.0 + +- Add confirmation modal when leaving view with unsaved changes - #3375 by @dominik-zeglen +- Add dialog loading and error states - #3359 by @dominik-zeglen +- Split paths and urls - #3350 by @dominik-zeglen +- Derive state from props in forms - #3360 by @dominik-zeglen +- Apply debounce to autocomplete fields - #3351 by @dominik-zeglen +- Use Apollo signatures - #3353 by @dominik-zeglen +- Add order note field in the order details view - #3346 by @dominik-zeglen +- Add app-wide progress bar - #3312 by @dominik-zeglen +- Ensure that all queries are built on top of TypedQuery - #3309 by @dominik-zeglen +- Close modal windows automatically - #3296 by @dominik-zeglen +- Move URLs to separate files - #3295 by @dominik-zeglen +- Add basic filters for products and orders list - #3237 by @Bonifacy1 +- Fetch default currency from API - #3280 by @dominik-zeglen +- Add `displayName` property to components - #3238 by @Bonifacy1 +- Add window titles - #3279 by @dominik-zeglen +- Add paginator component - #3265 by @dominik-zeglen +- Update Material UI to 3.6 - #3387 by @patrys +- Upgrade React, Apollo, Webpack and Babel - #3393 by @patrys +- Add pagination for required connections - #3411 by @dominik-zeglen + +### Bugfixes + +- Fix language codes - #3311 by @jxltom +- Fix resolving empty attributes list - #3293 by @maarcingebala +- Fix range filters not being applied - #3385 by @michaljelonek +- Remove timeout for updating image height - #3344 by @jxltom +- Return error if checkout was not found - #3289 by @maarcingebala +- Solve an auto-resize conflict between Materialize and medium-editor - #3367 by @adonig +- Fix calls to `ngettext_lazy` - #3380 by @patrys +- Filter preauthorized order from succeeded transactions - #3399 by @jxltom +- Fix incorrect country code in fixtures - #3349 by @bingimar +- Fix updating background image of a collection - #3362 by @fowczarek & @dominik-zeglen + +### Docs + +- Document settings related to generating thumbnails on demand - #3329 by @NyanKiyoshi +- Improve documentation for Heroku deployment - #3170 by @raybesiga +- Update documentation on Docker deployment - #3326 by @jxltom +- Document payment gateway configuration - #3376 by @NyanKiyoshi + +## 2.0.0 + +### API + +- Add mutation to delete a customer; add `isActive` field in `customerUpdate` mutation - #3177 by @maarcingebala +- Add mutations to manage authorization keys - #3082 by @maarcingebala +- Add queries for dashboard homepage - #3146 by @maarcingebala +- Allows user to unset homepage collection - #3140 by @oldPadavan +- Use enums as permission codes - #3095 by @the-bionic +- Return absolute image URLs - #3182 by @maarcingebala +- Add `backgroundImage` field to `CategoryInput` - #3153 by @oldPadavan +- Add `dateJoined` and `lastLogin` fields in `User` type - #3169 by @maarcingebala +- Separate `parent` input field from `CategoryInput` - #3150 by @akjanik +- Remove duplicated field in Order type - #3180 by @maarcingebala +- Handle empty `backgroundImage` field in API - #3159 by @maarcingebala +- Generate name-based slug in collection mutations - #3145 by @akjanik +- Remove products field from `collectionUpdate` mutation - #3141 by @oldPadavan +- Change `items` field in `Menu` type from connection to list - #3032 by @oldPadavan +- Make `Meta.description` required in `BaseMutation` - #3034 by @oldPadavan +- Apply `textwrap.dedent` to GraphQL descriptions - #3167 by @fowczarek + +### Dashboard 2.0 + +- Add collection management - #3135 by @dominik-zeglen +- Add customer management - #3176 by @dominik-zeglen +- Add homepage view - #3155, #3178 by @Bonifacy1 and @dominik-zeglen +- Add product type management - #3052 by @dominik-zeglen +- Add site settings management - #3071 by @dominik-zeglen +- Escape node IDs in URLs - #3115 by @dominik-zeglen +- Restyle categories section - #3072 by @Bonifacy1 + +### Other + +- Change relation between `ProductType` and `Attribute` models - #3097 by @maarcingebala +- Remove `quantity-allocated` generation in `populatedb` script - #3084 by @MartinSeibert +- Handle `Money` serialization - #3131 by @Pacu2 +- Do not collect unnecessary static files - #3050 by @jxltom +- Remove host mounted volume in `docker-compose` - #3091 by @tiangolo +- Remove custom services names in `docker-compose` - #3092 by @tiangolo +- Replace COUNTRIES with countries.countries - #3079 by @neeraj1909 +- Installing dev packages in docker since tests are needed - #3078 by @jxltom +- Remove comparing string in address-form-panel template - #3074 by @tomcio1205 +- Move updating variant names to a Celery task - #3189 by @fowczarek + +### Bugfixes + +- Fix typo in `clean_input` method - #3100 by @the-bionic +- Fix typo in `ShippingMethod` model - #3099 by @the-bionic +- Remove duplicated variable declaration - #3094 by @the-bionic + +### Docs + +- Add createdb note to getting started for Windows - #3106 by @ajostergaard +- Update docs on pipenv - #3045 by @jxltom diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..4dc14a810 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2010-2018, Mirumee Software +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 000000000..c7e0e30a6 --- /dev/null +++ b/README.md @@ -0,0 +1,143 @@ +![github_saleor_readmew_header_01](https://user-images.githubusercontent.com/5421321/47800694-19bec680-dd2d-11e8-8625-2ed7c690bc13.jpg) + +
+

Saleor

+
+ +
+ E-commerce for the PWA era +
+ +
+ A modular, high performance e-commerce storefront built with GraphQL, Django, and ReactJS. +
+ +
+ +
+ Join our active, engaged community:
+ Website + | + Blog + | + Twitter + | + Gitter + | + Spectrum +
+ +
+ +
+ + Build status + + + Codecov + + + Documentation Status + + + Code style: black + +
+ + +## Table of Contents +- [What makes Saleor special?](#what-makes-saleor-special) +- [Features](#features) +- [Installation](#installation) +- [Demo](#demo) +- [Contributing](#contributing) +- [Translations](#translations) +- [Your feedback](#your-feedback) +- [License](#license) + + +## What makes Saleor special? + +Saleor is a rapidly-growing open source e-commerce platform that has served high-volume companies from branches like publishing and apparel since 2012. Based on Python and Django, the latest major update introduces a modular front end powered by a GraphQL API and written with React and TypeScript. + +## Features +- __PWA__: End users can shop offline for better sales and shopping experiences +- __GraphQL API__: Access all data from any web or mobile client using the latest technology +- __Headless commerce__: Build mobile apps, customize storefronts and externalize processes +- __UX and UI__: Designed for a user experience that rivals even the top commercial platforms +- __Dashboard__: Administrators have total control of users, processes and products +- __Orders__: A comprehensive system for orders, dispatch and refunds +- __Cart__: Advanced payment and tax options, with full control over discounts and promotions +- __Payments__: Flexible API architecture allows integration of any payment method. Comes with Braintree support out of the box. +- __Geo-adaptive__: Automatic localized pricing. Over 20 local languages. Localized checkout experience by country. +- __SEO__: Packed with features that get stores to a wider audience +- __Cloud__: Optimized for deployments using Docker +- __Analytics__: Server-side Google Analytics to report e-commerce metrics without affecting privacy + +Saleor is free and always will be. +Help us out… If you love free stuff and great software, give us a star! 🌟 + +![1 copy 2x](https://user-images.githubusercontent.com/5421321/47798207-30aeea00-dd28-11e8-9398-3d8426836a83.png) +![group 2 2x](https://user-images.githubusercontent.com/5421321/47799917-8afd7a00-dd2b-11e8-88c7-63588e25bcea.png) + + +## Installation + +Saleor requires Python 3.6+, Node.js 10.0+, PostgreSQL and OS-specific dependency tools. + +[See the Saleor docs](https://saleor.readthedocs.io) for step-by-step installation and deployment instructions. + + +## Demo + +Want to see Saleor in action? + +[View Storefront](http://demo.getsaleor.com/) | [View Dashboard (admin area)](http://demo.getsaleor.com/dashboard/) + +Or launch the demo on a free Heroku instance. + +[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy) + +Login credentials: `admin@example.com`/`admin` + + +## PWA Storefront +The PWA, single-page storefront lives in a [separate repository](https://github.com/mirumee/saleor-storefront). + +[View PWA Storefront](https://pwa.getsaleor.com/) + + +## Contributing +We love your contributions and do our best to provide you with mentorship and support. If you are looking for an issue to tackle, take a look at issues labelled [`Help Wanted`](https://github.com/mirumee/saleor/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22). + +If nothing grabs your attention, check [our roadmap](https://github.com/mirumee/saleor/projects/6) or come up with your own feature. Just drop us a line or [open an issue](https://github.com/mirumee/saleor/issues/new) and we’ll work out how to handle it. + +Get more details in our [Contributing Guide](https://saleor.readthedocs.io/en/latest/contributing.html). + + +## Translations + +Did you know that Saleor is available in almost 30 languages, translated entirely by our community? + +If you'd like to help us, you can join one of our translation teams on [the localization platform Transifex](https://www.transifex.com/mirumee/saleor-1/languages/). + +The repository gets synchronized weekly with the latest contributions. + + +## Your feedback + +Do you use Saleor as an e-commerce platform? +Fill out this short survey and help us grow. It will take just a minute, but mean a lot! + +[Take a survey](https://mirumee.typeform.com/to/sOIJbJ) + + +## License + +Disclaimer: Everything you see here is open and free to use as long as you comply with the [license](https://github.com/mirumee/saleor/blob/master/LICENSE). There are no hidden charges. We promise to do our best to fix bugs and improve the code. + +Some situations do call for extra code; we can cover exotic use cases or build you a custom e-commerce appliance. + + +#### Crafted with ❤️ by [Mirumee Software](http://mirumee.com) +hello@mirumee.com diff --git a/apollo.config.js b/apollo.config.js new file mode 100644 index 000000000..ecc2a94d7 --- /dev/null +++ b/apollo.config.js @@ -0,0 +1,14 @@ +module.exports = { + client: { + addTypename: true, + includes: [ + 'saleor/static/dashboard-next/**/*.ts', + 'saleor/static/dashboard-next/**/*.tsx' + ], + name: 'storefront', + service: { + localSchemaFile: 'saleor/graphql/schema.graphql', + name: 'saleor' + } + } +}; diff --git a/assets/images/arrow-down-icon.svg b/assets/images/arrow-down-icon.svg new file mode 100644 index 000000000..373987c07 --- /dev/null +++ b/assets/images/arrow-down-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/images/arrow-down.svg b/assets/images/arrow-down.svg new file mode 100644 index 000000000..58cc54b36 --- /dev/null +++ b/assets/images/arrow-down.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/assets/images/arrow-left.svg b/assets/images/arrow-left.svg new file mode 100644 index 000000000..214309d65 --- /dev/null +++ b/assets/images/arrow-left.svg @@ -0,0 +1 @@ + diff --git a/assets/images/arrow-select.svg b/assets/images/arrow-select.svg new file mode 100644 index 000000000..cc3e09f51 --- /dev/null +++ b/assets/images/arrow-select.svg @@ -0,0 +1,7 @@ + + + + + Svg Vector Icons : http://www.onlinewebfonts.com/icon + + diff --git a/assets/images/arrow-up-icon.svg b/assets/images/arrow-up-icon.svg new file mode 100644 index 000000000..f9c576d4a --- /dev/null +++ b/assets/images/arrow-up-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/images/arrow-up.svg b/assets/images/arrow-up.svg new file mode 100644 index 000000000..9d5a9dad0 --- /dev/null +++ b/assets/images/arrow-up.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/assets/images/avatars/avatar1.png b/assets/images/avatars/avatar1.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd5af7b30cf868025991aa936b811f895505c3a GIT binary patch literal 112798 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 LTdz#VKH~oXKz+vi literal 0 HcmV?d00001 diff --git a/assets/images/avatars/avatar10.png b/assets/images/avatars/avatar10.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4b8466ca3a2c74eb98946090322ce0ba69553a GIT binary patch literal 132035 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 literal 0 HcmV?d00001 diff --git a/assets/images/avatars/avatar11.png b/assets/images/avatars/avatar11.png new file mode 100644 index 0000000000000000000000000000000000000000..d512fcf7d1fb2a3a702e37f2ad6125a45a361b0c GIT binary patch literal 108675 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

0dGT{&>jcE}0X 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 XD^4Fe&qdpO00000NkvXXu0mjfy-BIt literal 0 HcmV?d00001 diff --git a/assets/images/avatars/avatar2.png b/assets/images/avatars/avatar2.png new file mode 100644 index 0000000000000000000000000000000000000000..8a09b3b7b3147b525446ed31fc10e1f164517579 GIT binary patch literal 112856 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 U_|KEl4FLPeORGp#NEikDACyp62LJ#7 literal 0 HcmV?d00001 diff --git a/assets/images/avatars/avatar3.png b/assets/images/avatars/avatar3.png new file mode 100644 index 0000000000000000000000000000000000000000..5c87d41fb6ebea5ac36f666b309027425403eabe GIT binary patch literal 94893 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
    Xa;1>xfP(*dmV8L-_x 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Ξ*Kf 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 literal 0 HcmV?d00001 diff --git a/assets/images/avatars/avatar5.png b/assets/images/avatars/avatar5.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a36542d451d7e684851faa2f923f0b73a5e907 GIT binary patch literal 68339 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 K^5<#v(gEqK29^ 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�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 z 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 literal 0 HcmV?d00001 diff --git a/assets/images/avatars/avatar9.png b/assets/images/avatars/avatar9.png new file mode 100644 index 0000000000000000000000000000000000000000..e4cde6c4e6df9e8649272b01755e8a346f42f333 GIT binary patch literal 64071 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%0DyoN&YfW+qM%lP0-i(sg((*o39Q#yN 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

    ?%ewVq%0A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

    Pu`t|C05&=?IA2rLC3uf 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

    -$zpmpH2sbFX#&W+j;y`uRfW+svBJkA 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

    ~(lo#~%o<0+`| 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 l_c~PC8n5y`8zI9 zI`&~rn|EDv!=MuvVA;QLW; zoc>@qrrypO#!z9s#SBUN8~iy=MKb6@v zOo})Fih3)ECpclThrK*uU_B%-pa6;^_Q9ky5+~Bx_@|jpPW8a}r7Dmzha={J*eMFj zi5F@3q?kw`#&bq9A^OG$tq8NqoR48hEEH}F>lB;@S}d*?1XFJaZ=~SRP&%VygU_`s zTL%&^?@G%jrG`a3n+oEU0MU(cm92=Esjc}=tV$gGQc_LitBesq4T4aTPIFsSjrqn8 zdLdO9zTfJo?QKsR>;a+MMLVAfj1%OD0$2V+av(cy;`whH(!kpA@OOm}H%NF$GW zb7%{<98zKuDI0L&iAhzMZW~XrrilbGE^t?;dfUQ&s9dS<^F&E*-eWXf54|>p(}x_> zp;)_inO#}eDmu|JUq-he$HYgm?MaH@s}7Bk(9`h2ZE&PG2uSVkO(8L>tEgm*Z5vNq zj`gT@CXWQUR35^apGuxIX(Bs?1dLFHm|%Njr78~?Cam=aHwBr77o+2?5p|_St`?cx zD3W@XF#YK|Sh9%);bu zU9ZzV^xe#BYbJiBCbMOsHt0(z0|fs7dVc2EdBLU0IN)ZTk&VPF<&BP~IiaMIRv}mx z$5T>RXff?mvvD63`SQd?wtA0hO@v1o#uW7?wKo|-AjmoCNrA0B73Xg>l>?wOol58M z@&r-2iR(lo0KTjeeW|$Z_p$RvM`}o>63j$sHyzFKM_NVZM8hX?^`N7XT4i0i1Ky7^ z`Avn!4|)QICQZbs>(YjvIiX#HmG+`!A~)P0tus8t4a@5$lO2Mc`!ccM(Q%gYKx_kw zTuRbK$pD_zi7lJTE4!KyF=+zGtAYcL^liHBgok3oI1~lGV^E_cjw(XiIl&arnCQ3# zHlpJcmXxVckyz@Zab67yi-+}-p2n$y$X3}TZ?B3XFc4u*TfGFk@OeLaTn)YPyQf-_ zy#^{PdYiAcYT*fCv9LX<(4%S3Uer02m5Ii2RLCEIm{gYfy3;RqTP25j*=IQ!Kk{F8;DxFlng0AzQi z$?Hrp85Dv_G2mz1RxBi)-1A6(CelY`+7C*7Igi)Lq{(g!V_`Y1Tg57jvEWllhA7FQ z^n$z}dg9;2Z4_zRfx5T<0P}f|I6q5w$ghesSD3)gVr<)eL^N%q~5MM9^XHD zr0L+F>E}r@GvA-jgT{4k3iKR)oldvANg53srIfYjC=H{T^m-o({9Apt?60g zFfBkI#0JT`WKd)Nqr~-N>9b#k1 zsqafD0dOmwN>Mkc$m6&E4b?61RwS4o{*!e6wHbGy>K5y|dsz@4jQ;?ocOe>cnn^>9 zfyGkimy&+UJpCn&!nY8~pZX0cY;HD!(MkUR=o;^GM1gWwCWI=?*uljg^$*Z}kCTa; zS&H!toPWw_S0!t{c}kFy2VTEwr zqLGmG%A8ciw~MtHc$Ly+CpmG=R~vHiif@wK){YUD(Gi=Dj)4b_M$pY=lkO$|0L2k& zxVN9~H|eqjr=QUjFlQT8F|zq>DIY1HDf@ivY;nSBg5BllMM70NH{ zC9}Db3xq2ok`K*mMb<9#+oh7)Lx6oqewO=+={FEqc&kWDgdSbM7!Epv>_>4@uZjEv z{{ZY**~%nfoK}!;=A`vqChJd}rQAhwPS(c^J}NP?nZ<6To=j=2n=Oh#8|k1(Y>}MN zDfINF6+p5nT6QJK8LhC~aA`<(oMM2nG61xcU`-}wW;g<|K?4SXiwD)xokO{XDWwFO zvUqR9*BYS`0p;6+hLDf+sd7d>Np&sd}WC&;$(s0D9w``?IPL>w$?AY2&RXNZnI8&S}CoNt2Q(Q#JqxrDkXZ zmf~J3?sTxW3?!LO`4s;EmYvVv+Kok2hB)HF z#)Aq4Z4OC7G?~vn7*1W9IcB}1Po`V|=X58en8trYFu%t2OTIKjqmi+kq=H-(n6yAQYCzJ6b8ot4W4UCxI9)w+>FzVeO)LG7!`c8 zpQ@TjmvJVX+%tno!96L^hUATR2G1VVkf<(5;8x|&NQ*!w@^-v1X_r1;_)BYH~DXIPcz&vMT)|m+F6~tx2Od zDkNhh{L{9?Fv$98i7nli4Nc8*w${g|6z+)^s_IeM#LUb90=(t?Vg4h{IG0YalLfeD z2cW4>;_r=~1(q9W2qa+O*PgCtdx_df7_%|XO>4u&-S&|al2}3*v$-UeC#f}L@Rf{G z-XXdKCVJFvi(+o>6b?pt71_K!qS^i#5@=K$b+1>7HTg4-mys+I_8N2xY@dcG>yCg_ zrGg&)tj+P>j+FX+tfxH>xS_QjGE;AhIYWQS!l@R%GHBga ze5v^rchWVOZlMjhZu?buGHIuhnXTwocNXpD+XZp@)~mMKhOePU+d|BpHj$1iw#9gk zg-BDMimv#F!w_nUN;j0}+lES5T@qleP95j20w zYQ5qQ;l814%`^m&@l~sPy=y_a$D1Gv*z~IJTQup9!T$iGrcbO~s)+SnIGlg(DeL{I zQAcfd16o~}iRWW`)o)7vA&GGotpYmq$rV14=vvzOma>Q@Kge;-Tw3s9DD>K|;V5Lh zh7T%OmT*VZ4gjE_v!3FA$(PGx)E-3y>#b)0xnY!=*@A_{!$eKO)x{J z))CPjNXrckS-zF2LS(X?t!F&}qhi0+bd?5NT);YFt9O1Co(O!%U6*e>R_wJsMkLv| z$g%YdGfgI2&+6>IY2F~T)Q}~>@{h5pUoP5s$c(8N?OgH=V#eSUyNAh_^%2K4DW~Ud z>l>oo@J%B=tN2Y^SV;>8h!82Ec=4UGjynTMgIc(QDRzK^-yJBcd2FveK>E+UI~6h5 zu40)&kE`0AXyB1H$-(%hn!-57_|EDMb8{K=DWb!vtB9J>{K#7%bOw?&TX~oy%eUlF zP-aNSoB$_|X>w@LPB~CX7|5qd?04*H+haCin{Yji8zvb7vVcA+7EKasW-V_sgY8Wv z_2r`xaD=GuiaOSU)6q26@g1ddrkr3rybv8~It^Cdafdrer_^p4hD_(?fEbc1aO8$4 z-qfJdM}n=D_oo?9WK6jErc8M`f%y5O1F*Hb4givzc#=Rox5HF^x%>iV|Q|k8D(wZ>8!079cV9s;VWGz}m_Yha6Dy>666! z?PhJguxixW*`M2v)(fxr9Ao^c&f3bX#i`yvf-|{@?~2N+LhCKB-eawLQ8Y_L`ji@Vbc;T_1r-lO{{YlT^EmJ=?|jp9cp~`_vW(ZI zX0WtO`c{Csv9x3$U>bD?;6LgldA>gg-xu1-1s=W!xd0bogYjL`4JzBr+Dm!!Q6hAR>g+JTqt)I~J`X;Yt!QQFpTWnO^;>6y@xv7^G1( z4G!HDg#$f>K-~CN8-s%$Nv?|~oF>aKsO5*soP)>)wNqwPc zg|#aeVHWIHq@Z}suo5T&o0m+px)~}BA8~m`v74;q@}=5dTd`S?f;-a@>I{QxZW#Ek z^Wy&i2*Wn!hylm7QRMJ5$m})_IpUvHC1|ekC~bO@r#(+x(=x|y#7GEM=rLBEW5Cl} zruba&dy1~jqus=IvTh#rFOB#uNj)%9lf*qFN{61bfXH~kjs9s8TU}eeRIonAl(#{> z7g7HJ_X>uek%SG~0AL$E2&6np-8eL;l}9%6?jOo&PQd+RX{ie%Z#3e^r$5Xow1V#0 za|7=l*{MLxKAuOht&NSq^q-1UQf!Kj`~$Y?GKaavD1ho-7RaLRVM#&r7e6AQ<$_3@ z`2>OONsSAV<<$D4Bnn)25x+yU(-GX5#wS94XvMXL;xO^B$?ZZLp=rDhaLQ{QAl#uK z`%?=H_U(?Mibhu)@YD!lvN(}=_pKy38Bz^CcK|~T%SZ|{=_Gtp1U5IJb$vryVJ)cA7TZGG%Dhg5GRw{I~b2CcxgxSe?jFSFxnT8Fqp(&w7#a z=Cvox{K(I>YX|3hTQ{Q&vXs|N9vLLvpVDdjDGbfN8N8`IsNWEHZcRCoNEu~~#z6L_JT;_Ed8sbtDyVXP zYAvmm__b-4?+R#>UdfyFQiG6v>!sOSrKDmg_>6qiC7^hb6+IXn)sD^l*ws!6?_6Bd zbAJZBQLM8rcVIH`+2DKD-JQ`vJt_N@RVqhsYT5*vJOhTsbF-lZSs~k($4b=89P(h} ziXB9;rrr7Y#VXnsGJ3Kz&ow0l$Ou*EZ4+jF1QjIv(^pccWI!@;Puoa}q`Bv?q(1`0 z*vP>2`%`HdmwTb+opbqHqruH+v5qZ?kjJ^H7~EqI>gJ1umvAgPcBX8O)NeD?)SH$e z)F%vRLmexbODOwO<}0!CGbxjsA1%6?KsKL?@dVRhthCQ^sPq= zCoRvlASanA5BmxRE*6u`$Qc8@ALedc9<(%gjN>#+cFy>3(s`gwjzWtZp_`=?yJVD= z#Uenf7zeEc7@2~rV?AlusFal>RO$;*?tz?QlPd*4xg`72?S=s)J)XhUPSGP;Z?$fluZRxIjq^Ghn|*lv{c&aD^&gFu9% zEUH4UG^obYhTsG5Nkvpm!}q3cBoZ(RaA*&LPBR!K`wBzctbpUS4uFK)@kvCeg<~g;bsS`p&XQgVLkj4q-o8Pval?VqE(HW)#k>%SoNnopr9xetu*54+WnC9?D6{DYe zZARX`Y2_P-Gzd-ydeJ`A+nue9)&odp6=K=#Sj=)UPAgWN04ag7CIu}f1CiE;=eXjO zxC4qq4z|6L85UTWtcY?5;|8yu9`V=F4yX3>fd2qcIj(7jEy3cQ4r9ecprx{-CbW0B zFJhi0mI+nR{-AS2!*%8YpmEZ;W}BOT=btD!Re0mJhtdvIUl&LS@5{! z9TDYB=&Dt?%{Z~B9jY5ny^8P&A(dHAJRY?qmjIo=?^$Tl$4nrwJ*p?fnoN3@oc7E> zW9mbXrG-pJNa}c|=R1kV6w|DOR&Z@r##76xurzqoO4kq_Ec0|J3GX-_WF&o$2==6Cj@R8{pzEy z_zg=Lbjb%y`7V0#&>#EMukil>Qv6<(<+;p|9lZBb)BWnwNM^1s(u1URB&M=)8~qCQ z$;#YYNSk>i41xQOC=(vl0M~xj%8&Vjxazc{i|-+vp%_^5iP^8 zJ^ui$NZNRNP`y8qX(ln9&FKVw_^!WUq}WeLa2q)w(NWh%9k{s0IKX1xQQ*Tn;IZ~r=y&DYMvCb*x;c-bWpl2M@MpAoVQv-Vy znDBE;jW#y#?MVflalUA#V@XEvaC!*D#RXmYOXka$M8g@L=TCziFKVyONkE|!itJj&0qzM8)v87 zPxMCE_pe4V@R5Ul#pzd4Sxz24x#?Xy!(KCw(;d9a@bD0r){hxE-l`rB-> zY?usl?_0yN!!YIO)w8PUTGS4zV3=U`%~>rkR^bZ18Eb~iqTgxc%WE+)FEu6M-xgfj z$+mJ>cN93LV;p8K&Z~K)TFT_bh?w`F78~6@QWx`MA2iL6iEVC|)KoS->RB$LY?$O$ zKGmCxMX9C<9#@!|VAM{x;p<&d zeMku-o+>N+PJ4ITa}xqOnwYTE<8{b!pPFK)9TYup_-E)ZXMlZ$R$=h%)|)X&)uS2u zvt80V^k6g1F?nfeeh775X{TBr-IY^0I%~H>~%1r{6fEEj6tpSU9{*j(d?(ekt%Q zb4Fg$LJ9pMs1kT~?!r>9laAz5?(7#FWUV}wy<@^=@-rrvd5nyO4OIJ$H(1eT4&m8B z&PRGO!hJ&0apX$DM`C)^%w8>5b%Rs41a!`5bjn@fkK6wMV0veXH7Rf)c2*rhJu9U6 zcUx0xt$g6P9<0@F+S5n78|_&Yk6Mb>w24EPigr}TMLblyM81-Auyk9S?LPkiaDr7* z++b26(;|f#@EA96I@c(H-pzp$VTa9Fv>y@O$vVd*gJAioPRA}jx+XPU4hx?#;vTcq zk&bG$E`xt$`|a7i{U*9%O=&bL(+~+AsmN{Ol}L(3b*oJxJ2bF!X!U!`P*(8^FM68O z?{xdL1WDyd?b56|hKX-3M2UlrqN-ZAhPDE2q(88y_`MXRWundHiZD@xk^CApFX14p z%Z9FJ9nP(!NwgMt!RTstPuJnP!re#ZvFgU5rc*_~%t!i2$HgUGmAD5Tvr#bwW4hK* z%lD}q0LdwZ~1fH|lwL&Nzj*6ojqThVrjFT^sb*ulrarAIt+0;~u>daR|j^_z7pK59=4hnK@Tjj7&&h#u8NS-jw0V;pR;x2vSsf-;t96`E z23A&5mNLWz89vnL1k;hk@-`F_ekylI@YT)hjp|hmbe|6RF(FkYGJVLcp~Bu-jQOJj zo#@^cy1m-WrBwV^M)3atfTNFTF_PZqx(<(^MG#U{aaM@nh8V`t`_}13I7cM;Q z*mzDDlzIk7#YjGrZ*B(V6*^qxkZLPcp9zw3Y4&D$dj_>=l2WRpikX7-Q8~Z@sp9x6 zob~soA5h!?Ui6+ru1kCBV;@k(4%&hDsLdwETbw(Cf_hb|%frnkGQ3neTP-H^K{fO4 z=uIW{2LON#Uah<=g>!&SHF@EDf;NFmyi5C1+0LcCl19Nj>sy*Z$;DW;FAh8dDk`;j z4WxiDz|C4|=!XVM*uX*pK>N^o#2|ym6_%QcfwfM3=~G;Z0plW%BrGzm98Vnnnzv~v zRyATO4oLAnSD~q`HJnGcG}z^m$7?d4*rxRo0{au~O)S0nKh4usNv9P4bY$@l$X|u|`EpRB0DuVGbx;iTtyXoYC^Wz-lJza}vsOJ*Zh6 zm~1kM6P~oi!!RC`Ok1%Ym*(Y2ul*9IX&o=hjV0(YBNq}b_}47)nd1c z(UaDtmkfZ;8De4p;8j+3X1N*khBbPY48qy(Rjchh`Jkx59MgkA$rnJA?#|X?6b_VK zl!iEZ@$*7Y1c6B)mo(ts(FG$1xvHZzgLhX;EW1bqbf@g%j2x8*H6E}rmmNVpYFY^P zfIX;qLs`imtXjb&Bm@IBR)<8knnud0=B-+@sfodEaoVXcU6?P*s}eI;3!-I>25KGx zx4Mrh7pRJ;YTv`Xq=iFWr%t(7v{FxM2KP~bP35*3j}(_Av|5u&(>&>^cq;1BLSo!8 z&lMK-mr#0cQ*!jqIj>BAhg)5#Vyn$SYaSK1a7Y19y;o?xmbqV)a2A1qJ2zsnV+BBN zwbXBXCZHCHar;yi*N1&xr6Bv_m)l+jxsgd|ik=T1)Sars)VQhZ-6BYVWauh2t(<*8 z)V?-antA|xGy;b z`_mb=Q@0@GR)Q-Gk+jpwpQfLD*zH@18Zn&i#SoH4$`!i% zQVSZlzK&p0Rl)Z(O4+1~n3xk;_;qN?s)L_u9^%$pU>@E6;;5W4=-T4iQXAH%+)-$@ z*9QX#{b+klK&er3m>%R&t7&a<^EaHPo> zwQ31qxRdi&%ah*}CMIQ_%(m_M>PjEnQL@-s>aiT4NqaKW6UQtulN$Mv_4%b*U&f#j z>0$ATt0tb}R<$#zSzW9u8dOf3x#FihF|0tBDznD1J9W>!Oj?zeUphb z(5@$LhD3DCn8EEzSkuhhK9N*CFUL05TSoECTWs|h?jzi+IUH9!lTRk{GQbeybsM7X6eWrRw8VStMX4zdP8pB0qt1xVnB?$ zhrKJZf~?SwNa@#_a%JIn5rasDbI(IhBwleSPea8342;OEP-h?BmWuO6Be*2Eo= z(?A(e;j3z@8h8S;gNw~*M$UM>*!^{S6lAvYIUTA_(GZN0NW7LfMg}rzP&Y})ks9RUhC)l8Fe@$rWB^kE^B`u(HMZv*Q1L`U!iu zKJwY2Vi*uX!3VLZ{kVF&5rc835sh!;QakZXLsKg=WKxvib54BH7!oKLuvCwlL$@Nb zIPfx0HLbkT0e)b{2&JngDF}ep7=Ss=F%A=fkx0m4&1s3~I#PZq0yN!trALnRl5y6s z9P%g`C#Px`HWCN4nWJxxpVOsYG(Q?33c7@R_mw#Q)y;PiS>}xe1nLF`Q>TY z$et(2&K1EmojAKKRFTScpAKE=WSQ4=B#@F0^VvR4pFhG)WQ+dH8ZW~mpW=QOXZk>061~U_#J<>L2V@U ztIHh*H;tm8acTYNbfpj(p*Ba zae@J(8dV(+?Nt8&1WYB+q8a8QP~`sgVpZRR+PSBPM)AmAH=Zd>8@S?{icO;({pg=D zO7cZPLqP%UNf}l&wr!-EXYp~$&WNOi7%n;k?M!5K;Qs&Scxq=AE{Lp0xT~lGp(K z>4}1n7lTYo3m!qnYG&I^xx0`@Zv(j}0D;H#=~mqr!7SK&)(SDoDeL>xxuT;6$_|~U zO?N1c7}?nVl^G_w7l(WvsL3XvH#(e%$4}m@_IhMC3L~|NQ|vi4HEC`T4}SHFn`Y`1 z4QXbupiqHTdMFqGQozIDXB73z5z~qcyCV+g+OurYA?Hju;+vShM#{iiN6GtQi4lbZ zbs?+_peGyhY2@_qMolXt85|FK-a`(by)+kQ(o7Bq6&J2wMQLpENZ0^oiN3jx-XcjO z1DfEU#qS(6US++!ykh_ldK6sWR6~^&f8xiDX1bbND_Jlbf=5s*lJZYH=9fILJgp?G zS=i)~YD+@07dHdU9-8#HxU2C;Jmpzo8U=#SIN#E`-i4)GC8`f8dSIMYLMUx)**4%c zSoGauIJU0ik9^m1k5x$F zdsNlr)lF%liFr4ao@J!DJ#(6OK-P6A?va?25hFD2t>KAa1&|gUFen>iK9 za4H*Su~BI278?D$>Wc0Is^B4CuB=+{#%f{UMikq#E3?5r(=lWl-wKW}+ z+cxE9$F*vE8Lf`!n3WZ@)R}!Vs{>7BRYP}4Z8#}$2qgEYTfGNzm$ZuTLR)D!nk>cO+)#A_g&^pjRv9g* z_(nHk&@UiyilFO06uq{*-pW{gs`m$q#BvDc3>&^hO2?_&-lyiKbKezxlh~JdcsVEF z9xNEyqkQrKqoS7iFs$X1=bFB1T0OPbsuCCN-lIo{rne!34Ya0&LSG!WRy2w7E2W3@FD$#Zbo&Tcg=LKr|v+zexy zFGSV#3s7WPS^e^A$*%Zj-r-ByNH=4Fo|R0vu(;Ev9%`{n@yl0d*S9=%spL&bHQn2d2h)I8m33%Bn3@r-abMMVP<}&?50-?q9_V2cM z&e7kk8k(iN$+d>w+|fd4B1t17)wh~rOGst)LU7)~wD#*N7L9>FdKNpDf>9iUoby(s zXG750+(zW!mG`1qys*Av(~Ec*;x^#+r=5eY*#>@SY%+k)Br-M+YSEdqiB}?>drqwz zVEa(bB$4`LT>YvUqA{Wq4?`3C(-I_>?dx2RdU<7x^Yr{vQ#&x^7g|(OvA;MwaByly z8FHSkYA~)g!z68qGwoea<54*|d9Mg-M$pj$ z?p$K67S`zs0H7RFEYRQv7&Rax3c2g?R@uv!mLN;FoMN%=OAH!A4CH~wwKDhv=8))H zNw=Jeh1KpsQ^@I0-`t4Qnx<(oYsKzl% zl@*6I3vYd%LuRBSx!gIZ$~IC!TBWRJHpm?-kND;#g`I~P;8$4I?^Y-rmh5YT`1e-x zhBw>m&mQV7|s`zb)@p; z0E0)_fUE#DQPH(8J8FZ@D$!`gg4G=E(Ppw`0+%$XIBJiDhyxVV#z$|8ipfcj%*g)$ zMGVk04CacpxAQw1K07j_rf9kfY@}*dtXvVn%^#v$NL&IA0qa%?bk&jaMM`PfYNCt^ zZfb+0Y;#Sw0TdC^rBwz8#cn871}V_JvsgE0Ok+q2c*~pt#SXf0Z0$d_OYH-&t?pGH zG+6qeD74V4lg%PsJ~G22iagyS3}jG^c%{2hY#NB|t&C`Lqlz>tsK69FQ?A~%scuwv zsbf^M64=HlSuK^DIO|#$N=6A3nJ$nHPCnGfXiHi|PXH54$zqHS1`TWRY8-Qlaj#Jq zB#L<_@nn3KW;34D+|DCL1Fk9QuLQgF;_y@Ksu)2;012;W+q{lay9i{qv3ehBp z>fXX`-Wdto+}4v$geWdDPrV5W7bGT26Z>L_xS8#hcVyzL!1JWYy<1B~ZNPAQR3!Rn zQOb^LeoM!h#_`{QQZ~9wmr8RV7^Tw97bA`tNQX|j+)O-=nozWqlC#Hxd)G)^E-PzA z3;=P#%|vQ`Ld&#cr!_7S8v2aY6ibU1P(qBf-%~(_VLJ{n1GX6 zxEn57D5|$Mney9m`x++OQ%MfXgu$yM`a0t=9Ey#fLlU2-pL&jr)4W*P0oF5`QpgFz zu0Ci9wAe=&bNgZg|)T8BEjEe7J8`N{gX;3FbJ*K-P68TrjfzvfMg3|Ib zV_~@aR!^r|YB3Pl414#eJIw;_!a&w?J1FNAsH{B`J1*@P3HgXP=9&}3A!MBj9_Qwv z?fgqEtNB-vl0m^WJq5*vtrr*$dSk5wwBxf@*7HUgp_?)F0-^P&e-P}lp~>SlF4}eF zpQ;uw9(V?bN#kH6yNeCnkxVV^9QN-)kOI*hkC9OG+Di$;sUJ1iWYZ#%0k&b!W5}o- zQ%_I|&k+0KmsHDKhdQ^pmfAq^F;*34(mZc}X(EY8bnlKREkj9N#KFkviiDa5jj+l^ zWhi?zw9ez<&*DrIkrbYm=rU^m0Bxy`C8=aNQb8TXO=;dH)NIOyn6j^9 zSWkgH6q{N-S7;25UwC1T#)&q(ZY|HvaDNN`01~B+WlN?B_Zbz`G=CV{>IgF;1YPnaE-iwt3=|41>Ly5-I$HfnCdv79wk_HFniH>CwjkN}fNHK$;$mPAL2_=6t znO8p^)N@@0Tn@B4M$<879G;Xhqeevsa8e1Si^csyv6lm3T$&n4iZ}y|)RY}=<>kp3 z&qMD-?kJ>Zirgp`1CoxK+Ic!i-e)3UpcaR z)6v8k@&LsyeX-zorX}zp6olKrr9udE(-e}#uL6}EfF=)Gl7cseIRgN7t*GBjsAnBG zqM!j2nzD2xx1fp)z8@5EkvYl7Y8~Q@j^JnnHy%r6deJKKDD_ey8yka9T;-C40t0!5 zoRLUDwwihDi&LcP^O18zSP2vxCWBkFBOH2XtrnpvRIl?;}oy} zrr#v<(vt)|8&Zs?prP}FP7X$B81!;5YAoG45LMYuF~NMDRalhm7q5qIkdy}L8A7^2 zngNC$I;4dmq*IUsi11 z9@1nW&NuKJ6i49AJ|q7WrKb32@(KE;oa4!&7xbpTMuR<|B9}Kxr;N>o+DC3Y z+*i)8AT$3-fg}*7CsPm1uZ+U8n1}}~!e)hX{|fz}OdZqnLv5Imsu)$b6-N9X$P%bT z{$WeE@Ew@YDDX85ky8r-#K4#B^t5UP-z9lED+xir^#>f0nV(!+g=MedHjissGw%Ah zyBuj{NU1v|3?Fx!+x>-ap<`Xve}OAD%N;QEmPOk`D^BkrzZWbT?DLjt26cSXEYqQj z@fPKZCa|%$o2NGub?+Sr_V~QDZvF#Y{F|TgT#BCxZhThqlgU$$=xcTzf-G=h`GsUK zGHF}pMZ3PZ&C=bj4tEA7SZ|$A9=02&Gr$zJb24{?|k>>drT8t4pgerRkP9^|XNk&>|f;s?;FQ ze#Ig;C)mece5NPA(ExA*TkjRfIO7`BuT0@7P}5qAl#Qr1SA`4eO)w5IIL;7jHxYFO zHilyy!nFqrR2q#q=_ze5VCc}siR4(CJKgr6hGP(4Kl{0GpxY`e&$+r1qMEqG&N8W{5T@0lUa$HAs%R)-9?_o?J@knh?}r=}}m$6-pLdW{ zXDneY22azV?sePeL}@TMU)5#U?AR0Z>Vr!KdmojMFUhM0J<|bxBp>=`G;@!ZhZY+x z5pHPFJ9cg@Wt%u&+#7aeP@w5zVu$&N!a=LvDact4a^X@O#5h<(`a<Z=^}r}Cdam_%q3im}fc4{+2kOCRTV9TovQ zx@=lJ8MgC7cs`hIZAH*~dR-#~dpAFeX?%2-nnpXK#Z`Ac|u8lelX3X1Ek*hL;24n!wS!THVBop`VB6 zdVWkUs%Pku#;dxfZ~+sAk|LtPYv(Y-tawu(ZkWw3-M_`rP>ynZ<|ibW3X& zKd|71h10HQwF0WSG~?WFm!fRc=;6sj)|r#Gpv;q8?K)a$V+0Ip`foJZjSVF^U$xJY=U6;pu zd}{WA6(f(jo55~gt<-1dB%6brx32TZcVQjSiE z-;5#kN3;~UrsWTD5ll#ngGMBJe0}*UyYaO4#cO`ybTAQ|K@&TKpXg*vO!DFj3%`YB zTv1-79xJU`cKF6-xVqBBjWjoB4~So?m9yFaSi!;mTZ!>ok~s4*S~TB#KR8@~)}as}xVh59`E5kl0WU{$l{EJhhELl@5hCPp50DzfwI%q?=T| z%>Qzz$Oi5>g+$CtxxHffe6>|sZ((ysKjhDqlOpq5TjOd{S}n$P1C_sA)XwQl+!j(@ zsFLLHj#IWpmfoB#Uy|=Va8iM)PD+~(RD}kODq4;R}NnI)vjamKqqGg1$v1cRsl4rvURN^nf&l77*rdc+C>P&Gu|R^FUc zj{c>4%WxN|>CR4tHL%qsmC&v)YWD1NzSxi=S6J>_Gq%uublgRb9?_5~2ZBjmDu*)2 zulpV;qGvKljv~m{8k2zkYo4~8ZZ6Z*Id52htXHf({0vSnB}>ZR{zBq+7iamah_!z%Ru zikvaSjF9IuE*C-4q-N{&p(YhXRLzDxH5f!zN!G6Het-8{9%?q*M zP{RVe5XUe5vtu8LUF&m~Abssk05P6DmP@;jdo^43Z!`Z#7-b%T!jyaQaW0I6u<3ii zkmdD6xquQrui`wUFP3abnx|cdfw1MP;IYCm;jo+`@XaJ8b3u`=NYLvhpn)p&SlOw^ zM9GMOTe&Gx?N`dEoiRJRV^UDnbz&1apZzyN3?PM zt=3+FV{>C=)r31<8W(v%{yw8^&UYdd)t9}_Pe+%_BfHNb5h#5qFYE7$r`t9*bf#dZ z>&|wg1*^OmvEpOZ73;p;?cT{8OxlA!0o^GN&n|}<4$$UNM(rg$O=Wh<+56b#OXFDF z2}>&S4g&6_-9Xgqs+431_NqLD8X74Ok(0*HIz!?&+{Gm7c3!~+n5k!HoT69=*%e{3 z+us&$&wqU@he{UK{`jyOd^2g;)(2bHEz?&e4sd-398?Ek_`i$yPDwLVqx^#H>>?~E zC#mkn{NGkXPP z_)+qD8dm9+voyn2F(EWwb);Ry{K^{JBxQ51IQ}uc+52Pes)2@0y;LYs^_|z3%3FkM z7<12DeE?rx8espX_Ua#X?>qkv-RNreu=&XED!&r4#cgs*6`H;$_Q|2LK3eiKzD+pu zucm}icFcI|S~YySnslMP1~t=s?D9W#P-v`Wz8J0DJ&XG#U_Ryy?3V!;*}ps2pQyC9 z>dbTGfnHe>u3Kw9(^a8*`lko#`7Ys1JWta0`%w6_#H*N>ND1>d-IDQt%6_JcFU;a8 z=Hemo+tbbDPis7_z`yUZ2_IWcC;G_d-<(QX2d$tC@I$uVJ~v8;zmk3!4{)bDMnzo*$kwaJHLB=(3ud|58o$1~KbybB%xHtfYJu?&I>%uyeO-G+Pbhp(VuyIY~yzxI&-F{$Gcj40+FN2f~~B z$`J;<5QSG&cksDiO1P2ReO7|iaOb}WtOv7H@lzw6oNMVOxre+H0NhMEY%NSekpe-w zZG6UX`vI>J8o8h9KwM$2*)(g7i3|-qtw2KZZyLZ+dn&4>AsNwf$&HZ8VImy2t*CW^ zY>gj*CDr#`$3|G>>wF;`fXfG@tJcm_7c*~#dt${o;ql;|umyFPIkq&-%go(RG;^hr z65~cBa?JkKPTQX>J-H_A&BOsI-o7#{#}FM-AGrUp4wa_ma#Bj9OQaNzr?s6++VS4R zB%j*d#-+Kk>NM|G6p2G~mDnVZ(^N^*(!oRsK(q78A<~szWt@{l6tTS`9Ns6jB)_>Ix{&aHE?e`#D8|W0C*LU?>_wTZFX*Rg}bW2o{ zK--Q1AheJE{36ER=QZ)#)YqcHIf_HpYs!sj@^;kh8iXK|VH7u9q%5UoX+$J9$kWJJAM=>lINMF2IUGuclITeU=r8Q7r-A z5Q)Wsp_iF5yPSYkSeQyvkoS-t=!Jf3NP(v{{O}8HYm!pwA_0b+NFVY_O8maeQ7J*A zMEE*z()#KyXe6FJWt*1P(~;8f5$3Sq+}5waUpX}`GAIe#R*iP-4(DBkh7T78xxQu3 zDF37YdINiMD$rFTBq5&lVK}6sVoCl9B8aP3TNWDEje%j4yLJgs4qzCWsq-G|ORtkM zLN^TN98X>ZxG}|KZ_{Gc9CZBtq{LW|YMCzDg1`}f6VwbAU6NsuH9DHr*5d|+k$jZ; zTV|o@;P#*pXk|(w&AB@NWorRg#>LEfjT2J+eI+}W{kA+zP)m44pHf+LLmI!*qa816 zJD3B(tIXWj^8__M9d5TFnuF6-^TzF`c}A3@1Eb-;G%2}~X0tD$`ko`jyBWteX4Rb=eWdSkxot**0j%srqV zs#Tjx6Xj@Ya)9b0O)#t74%P!wloMx&knzg&`UO#rsq0O*JiPwPM;~WNVY5>k5J7+k z^^ljj=PxFY*_cZ+jKIW-Z$Y-;#;e+AtHJX1d)jaHkKu<;F(U`1Q?Cu`6HrzMMiMQ1VO{9d6|LK!K56w=0fWE!%7B&ELr!aV4jAfz^o@;hI+(h+BQCyP0Lb z$a|(Y_^E^mm7>mRPw=M}dv8Ja59DIK!PXKSI9A+LPY3GXCRRWgEJ#AhhUUAZ4=)V& z%?c*okrGVWPR1&+i4d?H@tlF9-CpoTM!>SmycCrLC0rx19SEAsc6ux_MYJ+c$W)Hd zWZ&JgnEILx44Ec?ecDSbwGZvh;WZQ2LXr=I&Wiw4((69q?-5(IrvJE8056`%+$hvW z3|h8+#!M<7TkKjrVz!SdMx=1v@O5{`64k zL{|<^I*!q9#38pt_%aq$l#VC0t?sJafgRIKp8w|YZ#qA_9Y7qr4)ra6TCPf4M2;Qn z)U5QLd@;X^=3g3cL5J6BNb00{D^EgSka#Tg5Aq;aXsPZS_KJak)?qogCzlFB{;7Kd z6@#7<))zb#Tem6(1!Q zsL}S(QNYY=*yek3MKaqPm4MRX!9nj}te1~&-Q`6yuUvr|!?iN<5>jvdK14@#heEqd z-zWVQk<2xOlu&p6yE@7Fq2;vm1}clkzC8!i7~TW>blvN!&)S&Iw2G%?5K9vDQR3bF z?vf9xUI%+2NdxnV_r^+@$`$h~)8A?dJLG}iIAKHrup)cu2S$9lEa_n-3>-8aeoWvl z392zA=jhf46VPS@nM<=+$(+HbX_lt%X+PsM5r5#3-UirFs!!p%wJVjdigA)lH^zMQ zT1vBZj1&fG>UIS0j77^yqs2F{m6+~e@Eo_X=H~MsPI7c-T(@!Quq$5Ced&QwzY58(Z)^1d0 zW}lwPh*M@|Lg@Az+yit1ZP<&&_Bt5^Hpu&G>?a|IjA7Fp9dqi^!%G!&rq+KMSVxjS z_?_8I5BmL6iFVHpeyN=n5)m^LV1qrG4W;GyoL^JqzcxPW)1tH_jZjOn^HDJ$X~qvT zOy;Ql?VeXiscH z$bsFJ<>2#{>yX;WYKoCBu?T8S8e?pExsm0KhK%4Oj#b&xA>R8DmPt9!r+}M(xflJ*$UD%0{FZ`Z3pXey}K``cbfrL+`OoDpJKM&VV(Fvkx1=BZ#!P=6xNwO`rBwX zJxBYi5ZuF@eF=e%nj=O@K+$|nA^5JMW$fbu=muK74fSOHxpn~>o!<*Ow@MnD5x z;b?FX!BEhPM2wHACmGYzd}a*tg)&^aG}G?=MkU_HFA&<$((rL2%0M~V7?XT3u*FJ; z3j26*tMqxv@70zop2pAh>n7iui%U#oF9v%Yf5MIKKmws-xh_(km8+ny43Ecw9USTe z<&<;nK3+3g(S8@|*se~)<<%%4KmQq1C~^qvI%cc^JdfxX5~+s>9>A0YM}b1K-j2e z8m4tgDfh13qD?S#OP=d{N*Jp0;NAD_55kYC0~ujQ`Y`ZTGZ8} z!}`%`}cS z1``BJh<12Kzr8dI%7sEZ(i6-gqwI^>u>(G=pdo|Ew;V29)wrC$`F zOnxML?eULJ%fDhazBGs3%i*v(rS{2r)(wWR>!6m_2<;(!@x@vly-a0Soh>MZf6<2K zw5tR@X4i8KJK;AOpyE@dqa36qM!mea<~CWodOaCTj+Cqj?u(jUM->iqKxwn%Zvw@3N-c zr$)I#uE!m@D&_;zG*^{ig8N13xn2ziIjsli-_RZ3^zJw(q{g^buFflbA?Zr7T^QAb zagql4$-k@6pBhKu&=Y=+9oARI+MRYu8bDSUGr%<=o&Hsl5iqgHjsi!fLM^Cit4%VG zNI`7qMK(Pr{7G9}H@erq6yDl3t!g2^e~44bLHB%GriutJ;k++Sd}8&g8t25;Ema&0 z=7j?Sn3Axx)HxtUSv$%me)*bt$J^!wX0CXI>}`bFzL8Gyqg;KH*e2X3>zTRKb5k zJMeFwpuw&ArP77&%$35xZ5@$;CU)#+NI_(T>x{?7I`^DYOHXiK2n$75EvnY2r#SJ- z{H&pvSbiQC(WqI678e>nfTobUn}c%_pwh=yL0ccwPNiv9L?jU6F8!04=6}igVZjXw zI8X4rTEz=4C$U^AHvLr39DdRm?z$!SUVsUVORANmE1oOs@n1kx$ko|9#LUk!FTe_J zSWVya{jqe($@l|sRNs$Prneb!N;k;xM7rGKptIW;JwvxTcA|y=9@Whir$Y`I>U?aW z4h(i$4SsNTyEzu0xhPUcnhN=aj)K3&HF-nNQp)hzO{xcF8BjuoG@;V#n)ZgD6>}v} z2k9CXsTlly-R7FW;mv!hsIL3GcYYRA>Rjem6Xt>&;8Jy{awJGO`j0t1Ema&cDg8pz zO0;D&&OXo*>OPL%NdY>E*#%U`%BA=XJ&)bM)`A;6uI*h* zP6V2)WBRLX20ZK>a<*FoN+bVHYn2VBIdJ@W^VSmk6n-VmdIf7H!RVnx1`bbEsqi}k zF&*f@fv&ug8cx)DIs^A5TvY{}oxP3S&h9#;sUHf(nTUJSJSP6vE6Mx254xPuFh#8EN*v`Y+hgaPY7DOB1v7aU z>Kj{-YEv-(ML~lg^rRcJM8SH2MR?-6R0W`X=iUBetv0{sGNWZeZ)(Z}?rP8V@@T_+ z*%K>#0gWtwEiY>O-~UP6T{i1;;r6r`b!NXpoh`Z0 zbgNjw8K6_F@5i)2wa^IH+^M~rlR>#mRk_M=<3Dm_S%!(5((!s9tMrY(y-a|q_MNJZ zLES!I-EL7KA*UCfLZw@C2)hOirKV&a`<`O<4BA|iIycC%37rjTlrDLWJ2ZO2H~RP3 zCy^$~ywkAv!*+lsjDUhKHn2!olpa|9j54`?nc$~{%(LWo_4q@0es0W>e^!I@dn_0VA$rn-!FyEh@1-1}5!R*QIhPSdy%(qaoO8VMgxWG2P5zbmeBRq?D+omi ze(m*ex(^OrWC8SSYd6UwTkEmr_*JxX|L6;jvY(ld`m*ZRZ^K{l$_$yG$QzWJICF~s zy=l%IrDgFeSC*wpjF&Gk_J%y==q;PX@5CKD^rl!(?fhzngQ7rp7fxjdcqqqah|LwW zqP$LDdPH7aSSW&KYqJlIIMltAAM2QS(@k_(LKSMQ?Q1QOrtuDeUwPYA-z(*D3p9S% zPleB|)>nJfRC)mpq+5xDEaE&)eg98pBv*27+mM?7NEG3XQ+jormmM4@W^l;rfw2;$}gdxXy-ilke_C~FLH)7k7Pj_khIeWVw#5NfO8`&eUvBo zNq0K%`^TWN3xL;Ohk7l3tKuIjcoN})mEW>Ok}#6ZsIhzgeZ7tx-I;U!P8w}}9~bOr z0*awXBR8bRHyxKzmSovXFdVl(T49KYY=2Co`dG}H%LpGf@Y;uF16w0>K1kp7m9-PK zKDb5o$1C)hK zwstc3l?{>5{dqMKysVmj{Ezv=;P)P*2|w2r5pUD4ivE?Z)&Jqu-(Q@ z+@Ie=hv-#P!}lT7NgZOh^_5W(wu!m*<)6O=JVxA?zrbOlksq&#aa(={ab?+x!naVZEJeURL{}3(KgMDgn zt=&u+n9Fy|R|(e_Kg#z{6Z08{JwqWHC%4D|GCpm4HH-h4vza&b_<S-d4r@5Kqt+}}L6sQ-17mwhDgr$C1=7T9!6h|99ZzkZsy_y`BP4*e;i{M|Ea)0bIsu~tlm zDdI977|rz-cq{qQ5x$2Wc@HMX{qT5{T6fp}L6{<6mb+yxtIhufWpG_EyEJx9erf`t z03=)M>*8)+YCQ_NIL)I4W8<)tNG0=Vfhn>FjgpP5*L8+wWm0FnZNTEHL=?_vbu&pN zQL&0qqmUjuw-qieW#i>e3#}FwNw3bHWGt(Y6DveQjglwS1#G&g+H3HM7xXZ}K_0uI3MqAhB%^VA?0ZIq!+?x!_;<<6?sFR-69 z{6X6JSi3t%hHJb43zh%sucV0w=^S@w@ZFmYD3bL#zQD66JLv{1<;3P0RzEeX(Ncgs zGFOlu*clzV^}%Y!pwlStc|l;gz%zn^i&Iq#^{=?yoaoe!$U(_Du<4mDr{o1@g0tx< zUcX%hQ#<&1zS4w+gFrA5Il@)ga9PESQaE#@OuPvDha_h|er)r5NEMyE<$TgVpQ^OL z6|g5weP)8j>|doxo?gsiD2*M|8K^^lYYb zj1dp|mkvMMt&8Rb!z5Cl$NOm{v6jD(cuzl!wbzj8dZF!G3(cHVw{n9I0>5zP@K9O_rofp?6{!*ogxg~kR;L@t?6{-R%-DVk7D%t6~BJEm$V4ZhFzA=;6 z`tU#PJ%6!>eRz5Dj2&LqB@IX&r#{(2Xv2e?%s&~Ek7i!=Mn z_XXc=2%UH+{-O;UKpyybq#_uq(w&^bpLod1^_-*Pv~zV)b?*7I92&d+(zEFEfK_t0YhoQ{$`HexlEp8i7>q$`t-G5~azplunJZ4I zSRGEbqCen!wI}IGZy4KW1@2WD>8pREZEpGST367d(@&p=2){s1AC{HOB*liD^t8qw z;{HRNAb>?rhoM`Be=SCi0fPwlol(}U+NOL zHiBK0wsQ$d|61TkOU10zsO3EHvd>7~rt}|3%!f{@F^Iy)25a7$`MPFhA^?N;y(yK& zPknJjS7h8tkC}TU`ov4j{k5;aOW%#t&skGCfn^F6tc(HDZ74IGC@rKbfurSIEq1bu z?&p(#+fI}kL#mc*syaNbINCar^i}nSls3|Ub}q&4fhX12O&Vrbm+C3;20nH(Gtb2a+qyk#cHNSWnk3uH&D<); ztgcE+k7H19b+BL|SK6)=lG^5S$QvErMz_t`M_iFYe_zHO>z1CbH%W$TBI@7cZl#UH zuyjp|aIKJIP0A|~t0W;+em>7|O9=gm5?$TPl_nOJn@fMwb_I8i63mgA#DWdS{MM7M zvej@?bj^!29|O3=5%{IP4OPblibO&eD${KUr}*i2y$NXeq@{;lo4H+DM!qW4xuzDi zwOJPth+m+o2|k5p#GXP(Bd%&3CjfY))?WQ%)un0s%#TOu;@ax$aeBen-Ixt*wqc!W zG?-JGm_p{v$QHB^m)vZ#BrPNJN&GG48@2n&ZIui*pw<0Cuc2SaY}T$h|38j}Mv1V_ zj35D`QHGj;orM5#&$y4)l6av{Qe*AVzrlB*!~6)SmW{E-`Mm(lKHa_0(k(Zq%hm79 z)aJQOPm6T672vvY2?X`|eUsVM^2@QOSw;!WqRZyoAZ@^Hd}$~f1TQU=9H)Kf9e!lW z)6#2T25V-$7Pb9>I=)fseVViA9vz~1wLG`@W4-HktBkuTpYt=%bO-Rk>fr;S1OW64YS&1ET$-QcmB4rBO|*f-vn`PgSVNDM!ZpZQhCBB-5 z=oFN~$-V*okD(N?6W6cbw4SZe0T~yfd~iQ*uDS|}-rtXV3vmj@M2c7nX`1t%bY_hu zaCFByBl-0->j_=Vm&0FR^4Fl3s>wY>%t;1wu1~ag3-;0ZyEiU(kFi$uPcQI^vFvsJ z0}wy?-7pugBiU?cszT#WD@ghc+V53PTjq8!Zu&KrZ138;ZW1;-$}XDzfLd-g_57iH zYUwVmyxF8HY^2H|y$q06IFkG|CBw#~xn5D#;;n!w3(-W%ruF(T6cU8w@Dg{ngLpw_ z-p2N{?-H>G)$y#IE_%xB{<4+=fxeb5H#{*#|2WU!IyJhnME8(3(X6c(lGYtUs12TC z={`oY7)$8e8h_MZdFd8qDt(06^?tN@_)jir$1e9Ne! z>l-ab-{6}XIRzJUr)74oH>ja62+{*7I|+SLlMN$nio=21hF_coE(L!(WmNce=|>1s zVd7jTEWh+ZH^L0*hC(~VBNHgtjatO|hxwezMKM7wywU&?!bT3c{=;b+U&$G{xgrw< zr6CU2y?hM9+VDvWX(O!Gf3k%Rx0G$YM`AwTM#EdCb^)<@YXCO#JJqnLa8}pR>B?D- zBzrs>BS`qJZff?goq#7-UW|Hb^=b&VuX9O#$hW?QkR2pa*UI^M!Q}pZz|QYfSGP)4 z(h^9>foQ02dr@XV&lxO6q6dpEc@rsZ)EUZ<2&D#6;TSPYh&Hk zguSNJ*uR`Y8Vh62P9n(_Y-zAKqh3s5&ozGSV+r9F0H&eSw?{mQjvvN4l8`&xBK&Fywg6lOJTs;6&h0+FNbSreP& zO=+j}+1$-y{&Z7UkrY!cE}vOKP*Q6|5@$-V6M4Br7pq7i z>O^rTU8UnZ+KH+dUD@!4_X%qS+gyXEIGcaf%V6o*Fc zm8t+-Jo?hT3tW+;cMLZ*WX9i*xs>Tj_3dYa?MoFs$5AXT z?t@+zKNasL)YWkxtB~eeo|X9YG`&k8=6;^q{KCRv=}mE;(Q65dYR4Sun*FR!ul4$ol2_F%{NwQK#}1KjXqulz(aA5&?m&jEedBd?osPme`7NKY^b2o5+ss71 zP~g8efm=TTosapsJBZg{Rs)>^#iwdcm}56{zrd8NHk{2WHEmUv#~7++Mcl?m=TR(< zgTMQ)5o>J5RFNj5_UO`Au^#mFlMY-tzv30I@y0>g?^}D#4(QZ(j7pKz!R&8s=Ly{W zFCz6qZtEl(21JBpi>|Jmvucu20^0)PPmw=qu_QD3;|alrNQnr#gl+E~y6LUzp_J1^JYIj^fbO20_L2JRfkR5u)!A@UE}W?2xc_aR+e zVVAlvQ@f!AroFNNg1=(Vk~SWUZ*tFgcUi+0yg2pXd)3v`U9CJ~Gw{S5-gnOiIM+YF z-Z1qi|BeI4e$a;dbGqV2l&)uj(efz2yTF~KQ-xMNak+4vtQS8(5w}VKHsd|-x@t&D zeO}E=|EckoG%}jm3DT$k9uxY2yl4}p&|>q-!j&={i#&34{Mjz#gs1iLKY$iYZ0&MAqn`)sRb7Y^_OK+a#Ope)9f1<&TUvtf zO73q@JKjE^tW9s}d`Vj=`e;5(R4(MXhp<(9>0j5LuE+SeS~L_(@8h>gRL3cC&R?i6 zyHkjf4f;M%YZx?SuapL#?v7FRA72`oT3YLS5dx%-hb+r-#tr|Jy9Z8s>F{-AQj>=x zZdG98Z_vh08CaOc@T^w>7lZCSeF5v$@i-vYP}j89@b$y=)h2;l=-D6b`Xo9}1fNWr zHhNUVjep))bj`9`Trg#2V@O7|l#{Gd5*L|aS z)_%X-2^ch8;BGk%e`r#w^4g1}7;qVZggn_farKT&31yrsEqNfHD67;U2$GtvKXag= z3~Q_*YD(YI!X9oXxi38=d3?H%jkv51*g z=rVe1ZRf*Y5m$?s^HyWW6#EtHYv+jYsJ!H8#$+A+%;8~}X2{FULKzLxP`6#Kulybp z_)DgSB$Z;ti(Nx6JikHUhlZ}G!z&r_2RvE^c^QxGgwe-?!1FfEgHg7HMnNVzPTZ}6 z6oII8c=!iHbwz5G;Iv|NQR+9tTfaxpfrBBsNR56ILj#Ay@up+H-s=$z(D43CO>aI{ zesr&CDC;8VlU&%;Vu@2cf%*~2KNB`iZh#Z(lh{x^7XRXJpf{5zo@p~Xj?&eQV-9>v zwpO-3#ub5LyCWO^W&ifjrqPNo%NOghCitX0P+D7Yo0d6Hm)zh>%?Aq186#_K3jIsB zY9zIS%2lq9ib%7TT_09C%A&`(AS9M<-jSS?J{0i2m`LR`%b|B?$0f4sytP!$0{kxv zHKZvKO#jB%g|6-)*f!9yuy`Ruo?na^@O7cspT>~0!{r3C*ryX<3ww0mBuZiqdD>XDvz?sRr<|7B?2}ll%atp#shp^+hRQ! zSk$?qnyieE_G#)8`#1b_as&(Uh?)x@<4j`}yEu6pxSM>V1A}*mv)d|Nt+(saLjNwDdWyoT|_2W zPQ2>tMw5r&#`2j7KOo{Y&|^x4M{MFNaPrasJ6z=95Z6$Ku>&H4KAE1(MV?$-X)LqU zQ1gU+TTtkzXsA(W4 zlJLU07_{Uq=A%GdI3xd}Ks@Hbq~!&<%K4@h@2O4t_HkzZo7rIY6Nx%&yjsJX3Mrn6Q6ew)#a-CfxwozCh3eDX6d(K$%odd)4Ppqu^8 zY%}Z!q65l4lWX7j^O-NOgVG42%Y6&JFtjF09BGztZC$88;~YH2oo7UFegoZyQoRM#gG65~8^}7@r za9^ug5%My7&qk84S&e(3%08ToyRDZsgC>9Va|q=g2f0F>6eCbiluMG+w_yqh>e_%> z%3nya&*t2!DmELl)G8MqA3Y2cNy%~gsq7bFp*SA;^gPc6Q30~4A6B5=CZr!Q0LTNWK@l($0;!BxYUk5=8hbz z-TnCv%|N2z&9DAkX%3c8@f6v_9c+B5Jn~jPbF+2e6r#hG)0{SLg1XEC5li)d;|E#KQm@M>(gw+u9*9eL6L2zQDSY%X%h=i*Ap-ituydzPe!)db9*PXV z3*COM5rm$)X~{hI+MoJ}dHdFR4kv?g`i|5=Px$^mt}wc}Q-@mD<9nQk7BK*@&x5RBITsgdY7-{EL#T{*dTW-HHd*ZoEb{W5{hTHqnhLU0cb#TO;~b8PbZydADPmIO`i z$`Fa$YJCI#)RpJx$CeuhU`);Qp7t?pv7I0qkg0CCCS0|Dl=%2QF)$Cou4VpfBj3fH zR{2BXbZBOh+CHd1UoEYP*B!c|PTP~Lu{HG7&@v7AMwPjrNR+~3*3498GqB@DrJ5q# zWI{uU6@}_ct$%sdqUoJU8eg5Rbr4)b;wr>G96}4k+b~ST2hN@Aw6S%4!rjX_Ew0%5 z@K;58JU!nM&>v8#YDC&8{qh01yIAfE5-F&A;uodI^^nT~(u@iUOtS{!0_Ms5%D!k> zGeZ%XRUy@!9|`gWLM%aIZkGgdX;Bxt68Yp@shzZ8tXBK{V-=It1G147QV#}EtsiU; zg-40>wf@wc^-p^YmGR;%EvlpZIf4@$N?t;W7!vHjbdhT;SfMz9f#F@w4kYK7~@r`|o&n-Xa>3?Ie6V%oiq}#wyw2246tW z&u;@KkGZ0>#!9SxB6R8}$!0bpVNWq7-g0Qz40Gn1*mXtLd!!x-o&bZ`R7AzGSQeXQ+3eOQBv(-|_!FNn~^i1DSt*RDqY(4VVZy_Ao z+{hfR(cb3!*pc$yr}nv{%71`FoT(Eth2oc-*Nl|CswqK+%d|HiWu5XHpUTA%-XE3j z#`)#-s&{)c#$;NMO&u|(>--l^{)pwx8=3$VL09(~L?e=opm++*waz~KY%-cK_pZ`6E!x0oox zHp!tIKkKNkmm$Z_rr+5zM?wj2&2_$-dcQj(Exi6w!`_3kVTt-}0nU7V37dAdd8;+P zMVi3+GQV>YMxBuZn}*kocZ($Nwqoa8Nn~y8@N6I;vuagg$6Ha3sQ}$C?>r#2(z9@r z17Sg$jumCI60XX5DMB?Z3dx`IaF#+cq8duBc1~aWBz?I5UW`uV6OB|~eNvjX?rZ3) z=b3q*`WtWo`*BrC2!El-_K^#f^_!kT33>6#3cxV`x>aD@>Vv$h2hCbg7n-{bc(0ou zNDSPjK{X^eBz1@yjN^#IDZl{^Rrw?~W|>IF@}2v>HCG9QjjU*M1AOwl8RqT*4JrZ- zWPm#VT+RQNwfX-HKx$~CLZvN&7SW@+(qQpq!{BEP%V5PH$lkV#$S41{Ox0UR%`1DM zd^ss?JgA_Bt|qm5wc|eaR7B@E5L>P{)=9$qB10$ts|tJs58p3y-GW;DDS0ukMx7kJ z!1N|06TyEm?%p%OX%B1pMosf~-)ztQtpx^c!N_BC`S8t7&eCVnwpzORV+;x0 z>UW@iDME=Hx~2=yL00YYFK91Fr-+86Xv}%c`{l`t{K03ZNl}`vJ4+)t$)&B1I-?@7 zHsda(fiTnd+~d0|)!2B*dblmW+3(j(Pw!IT^_QhyU7&GKuId^~py<&yBV0gjci`=x zeK43o{H1$_i>Gs-$UPmkOs1z>YbmL+j7^SlO2R)HJ~2bX$D#Ws$5UvXr}(lSI2U}S z?MRI}>Ee5N`rRA8D#v;rT7DgO#W8vj7P1KXFIycjh6o2KkLYX!-LH0k!mo?w5qVX1{TV z*UF(Pb7*{P?80w!bL$T0>(wv+ydn{#c-d`}1c(E3@IOt>#|oRHQp)|;k z*E$`QQzpC|Sh3@%4xIiqtBa>SRsWhF(a-Ujr8;)tYELqUWO4R(SC-MwfWF!ef%XnV zTpZ_6q@6LZctDH8?PC>z)Vs?MXr`GES8#T}N^K#5+oMWEH8#hmVlE#wQbGpxQ_GfI zvp$7{oV0R0uU5Y++Cq#>fo53%kg^99`>AL#qQXySmi_{!J0-ObCEOpYx@})zeBmtBKAw@BaA~~)M*R$?8scv zu#+YFM5Mp+N8{B;GAU-$#RbK;#dkD?N8PVnb1G=Y8W%{XKOQ7vzuk%b5A*_6Ntyvz zTw(VEIptH+=kog@(+$=TCeF;uP7QagWc}U3bwz6iGDxBg~H;O1#P)y z=6Xv{$RF{>!Q9{apCEIS?*6Ry8`iT1C0SHDc~bMJMi$PX{XfGrVuX8Hl`lqzZP}?bH=-) ze5ZDqGfLyMM-6_(?nEl5$HvvO-wZV)-k5D<`7Axh-=NV+dNv1C_zE|Z6m<3t({7fM zrs$BG;gaZk@kihb-4kSl)BtgYRa95(gD$^gvs`N8LW^K%yOD_Xl!z@T)O_Dvy6{N_ zJ;fu`@UX$N3s7vb-!S-mh_CN(EvCTy z>x4%|M-F+Y@epQBiv}2wND2O7RaJpC@eh;4anLe_P(lHda1I}s#LG!%U!7E2?{wF# z2xAZ-oe~05eIdF2&9L<~$(de5X}yii<=$@Lx4sRPzgd#(=HRjR`daW2mO3xvZJLl) zu46C4S>L}q*2$0;I=Y3|)d^iPHdza)Wx0yb0aFfPq_pdzfksnv3$%?^xJ-A3_$>ZK z+3fLHedw!)4rf5@;5y$*o(vWEM8|T1>icbcrf%pj-on6e+E2fDUy>ClNp#1jHrkBs zgfOu&D^kyu^tX|Yu{64ivm0gTGDSs+;=asJHK3YH%`q3j9fx8&yE_N94DvQAb(Jb| zwH>VVXulFiwLzym8b)FYl)2qVeFP3WZz!GYk~y4L5s7i~5>UvDDuv%M{^;U^_))9M z+q4Y|KNR>f&5N%I)=>;g5At6stDLTCb8ezf4gGRv+`{zm;t(qJ5>NEAautt#X|U~f zbv2>JDpm1TsH1f!4HWEy{ldINDqZUyv4ZLj+Ta~HF$!}kc_LAJd~0HULA{W{9r1)< zX3NQbs`bF#+-7U+x;t8}ESu{?hE(aZx|Y!|^LZi<)@rbzK^M(AHr*eyB|v6|hQ@bYD7WCOE+z>Pd$RT(IhDb%0W<{Nu@? zfYw404YwDofuj5(9Ic_a(uax68_0+>+2V_AXP!F#nL>f-vze#r3dRebV_P(&=Ia%)W3C!`}Eq8tH(? zKEWk9+I*F$Ds`_ToT?%S1agC+4(Auz7DVF!6Kfx5s`I$c zwZv!dP52O#_H$(cPK;z-e%LwKh5s0>ycm^>WiXes=|bQHJ}nr$TGb+xJV7_8uO31+ z3pPHcdbk&PON_X}qq;ra~u`1wu&>FDgZ$=tn zbopohF?9qjG5}^)EfL{RX*?SE@}+^!g8^gQya_w05HmiYy7u zi2~HH{ZCEHF{?|)Hw8(FberZ`AGs6})!WaX8RYT7>6K$%j?wxXpM=rY#w@RD%T??!mwFsdpmo;xDhB@{0B0$ zi*@Y%QTMiN(YJXX(WF=6B#}fF(sA|lEH_x0mjV?0{ zRuw(Tg*H8190>SAs`Qrar}N6WyTUGVlT55q4{aEnKM)xT#C&!dYnv)&p;v#f|Ak1X z;?%_CN1UsIn;Bq#qhw%E){dE(l|q?1NNF4lxSZK&=*k5NV#css=#1+=x-`Q(zeCzK z;_rpxy_GK;u#>N4za)IRtV(mPB)yK#>}N|EcS8m`lt=#u;u3VWl|BD8g}}QdI^&r6 zx0Bbf-VY6izs$9#w5_tw&FRM^Elq;2tTkp<&!9ya(Xa;tjFth-GAdNM!`VU-N>ZpD0@ zcS~b$z`M28S)UnDS08)vcly4<>+G|kSLD8_9^U6*S4%;VXbdaQ;T*%Hb9psx7i}Qi zK%JAv=2vTU!4V>bbeJBb2Us#y5>&hR@U}q>3%pAg(!87LNOdHs(@#@jnc999SAE2%A4^2#Ie#CW)m`*DLShe z{EA!YcV}kQPc;(;3NY)m7uO#vBWs`?yd^22xKY3INgpwzy942e{IlYX?15yegZKCf zO_8A^S~O-ZvtPL+lIatPh*)YAPHEoNZmMKOe1R9b+IyvVs2*Dq2aa-Px7(~dyOvO_J*t>D{odtrg*#EZzZS`j8Lvt< ze{GqaofR<#ynr^@{|pX5D(4CkVzV954n;L5f;vt(tQ|J1VXHPT3#Afnw>@6ij zMsFqrhX~%QL2Db@qp8zag;}S#D4wH{#OEL!lGCI@b!#4Y4=!;T!}+Up1cnwyhV?Qt zMym{n%%4~WPJftLJwAy>OP<~jXS+6Ki;NJyZ_5D5p};WBepSCYgKvcjU;}NAPZ%5% zv>#q}7fA}Jw-*v*ib7L*Wyp-}>;aYvW=OBagH^yH;3XBVcT*A246^+X6f4l?)EoLt zbm|3P-Yu2A9xc?8LC_708s6A@)Jsc>BU6BVoQ*CBz%^biOp_5?{#dDM{LBBfeOERo zf43%R3EU*PXmjJ(_+^&mkSYVpgXKalJ-mwz&0z>NsQp!MsdYVbAOnqKIT5O-I!=$t zBOiY1K-lKuDxZ&A^VV50c9HXB6$y8 zX;ufKV`Ei6#YZ(*L;!K`O)|=9qz z6q4cIhRIlGWaL(*8p@V_HKUZv)3nB0d>JiCvY8TXAx3Op>NqQq=t!tQv5}&+R3B8; zUNaWl2_DW@9rtr8M=o0Ah6i{jL^YGppWX zY;r?+#FsAP)T&quJ-W;K)A-+E-NqTB#79Mt)193O?8~v zSxS3yR!2(&J&e&$sYZYmCIO0ZQ`sn$q+lyg!VnFDJtY6w`XoAX9_K9iQn@bVD(0$e zC*Q&~6^1Cn{Q%R(j%>-Dh*B2`OAc9Q8sF$8!4T!Mj!bx%>47gsDkEwnPt{i>PE>g# z)IOFr(%G(v={v<3Tx^|Ugo!j+OFi%4xxZxy^V)w!{H)sbYmXjRfO_vI3{A8UP{yVs z0HGNAZ9d6TLB(=6jYPNis%lFxkiwQ%KhQCA0bWxsvht@kq6&SN%;7f7+H;R{PEB$- zFz5+*nah|sGh+p7&Sk75#HJoXf*1Wb(u)HP6!nN|-q?f1G34=qH@RVoBE$QTU(-}s z>r(=X5rRs{+C@%6K6L3#P}S3q->aP}IEcW|>5OMW8N*5*_VhWhh9{C-r4DE$wT!GS z-wZ8wko+cJ%7gw(#H5}3Ro%4M~#T34ZMaAS-w6S*isvYr^jNj~TH&aEN5o2IJg6u~^ z=Zc8cvN<#~4pjnfmuzB|%=~4sQ~I)xwc=-ABSvGjd0!7$DOUW^Kh?Y7dqS z(zRbS$JI6K`g`%Lbw`{&@O~V(b0b}Qt<3vENN~mZ@Ca2QyDiMbuF%ID+9SA|P=w!o z|J4WqGyEGjR((F9av<{d+Kb>FC{2HaI+jvi3gzdS;mNw4`~oIEaNo*oS4NCXWFoA< zq+Ih}4@6?dMBjmtz!qL3TvpG4c7MTe_G>QFXn`*cWQ3{~^V8d#q42~6QgK&2F;cC4 za>ZdfRn~>EWVzUDMFnz|HEWv9Y;G=sbh%C2mL{GxVB$$(+ty`;DeOHWx=hy?+WBi? z5H!-b#mU(0Ez**%*&#P@V?z6)$}w{D!;@jX&@FWPGhtI5o4_{ByG)SoSGy_5QBSXv z+%#z&lbfvD=0%`kl+yub{?$g__Qb?9NlUxbn_VM%+mr{y=F^?H*IE>{7MP$gGKBVx zoneEV5o$&Q_`b2e%k~!2tdAH^r-2uV@|-Q<4eY*H;-r&E+ONPrFYIg-Kcep|)j5sr ztoxWw04)IjWd;@qhI04HI)PN`w^go|_w7fXm$54(Y*@Rz$1#t4(5uQnM$}$%UOHg@ zlv^GSk1G$EZI(~NGxUt!BT9E(Wk{zlm2)p}jgu(SqP%CVQ@o*lbw|cpaRfOKy}k&3 z&QQ0kJx4LB69=QbtICCH9FXGO9TjA^L3P*tc#_oOT-+LTem1pPkglbqpROq&H$E)1 zfcl#Rc;6;OtdfvF@V9e%>rVUXq97u3v6MHz&4yp7ctaWX*o{F<=nH9kpg=|pM zgota5tZ>IIe;e}`?v1@eyhJeLA9)EqS_N~SD=vd2zbqeKvFCV2re4&UKU1&vEWh-s zSLYr&V$>3=*@`}ZYt24cPLB#=oX1&tBw8uFjx@@gx^68W<#yelKvEtAJ4TTJx7&8_T-LjWL7(mN6vEsd-_!tu>ybw(_smfIE?bwDEPSZEPBadHX zuH^H-qmF6$SjZfaf5Zde#cVMh(`hoMpo;nJC?eR`LRs>9QbPK}oW=fZ5f!kg9j-S@ z?q|Jv`55hqJL1TqRx-&P$1VcMAxTt|U|)WAKVOzSPvBw-DsoBkTdsvoB^l&qo^x7*?|Ba36x`1zXufo^FvH%9PEWyOl3X?XsGk zz`g}%eq-fEvIJFuB?*#c7iiQ^W`yeTMJIhJ6HW-ndiR9^ck4JtJR`yjsIY@Kt9G@5TM7yXEX zS(Z>FJt`2{L1-@qvi5sJd}&|(zE?edb02aGc|}GEZS-F7wvR%+3;ng24bSNGjw$IO z6TLM@gVi*F9cj`|rW@%I6k{AVU%S;zI~r!%;&#&p*`}aY2{^2ZGIU(rrSDK}H;XNg z0@p7Gb73SILP3<|n$y>cGBynrxMq;c9-U5#E(FCOXix=jzBSqxmB~}y@6&K$B?y=H z3gx#?Pq(-j^4HY%Jqs8AWhu>k1%(0Fj( z-`>le9o*pvoiw+hJxXGOSFcIou-jMI54h;ewnjFs`nR{1>)p?7CY3oWQ^zmeH2aR+ zM?U3Gm8}QVEPKS3WLOaJugg+d_SWZfoIY@-hHp2Ky_g(-bWyOKuVu$~YVW3>o18Fd z6ji0Dgx3d0Ahwh*8RK0ehrf;~fSaJxdnuY0@DBoJALF^%(q>y@o{(WPYmFfh>wEAd zZ?SnZGb@YZJt|?d4!)&oaS5&ImNa)hux841^nCK`*FH7Wc+?UgtT9?(vkhWE3oj5N z6|A?gtj+<6e3)25etH5;w2e^JcsDGOIg{yqaa`%;Bbt8Sm{`!v1=XYp?LhQe!%uC~ zNn4J=6p3^6&o@F$FF?;WOD}y$aIaoB1V7(pTB2!r%pIY5GsHpiXE1NdVD+8HShyGY zo)L8GqtV|>W{xeM<&LChx%&?Qv7Bk=4mI1mhW>xj#T zEAp8M;ZgI^T;#n4hgL|b_ftVX#wImic|X(hPY?EgcQx@<&|dJm4izUpWs5;OND4jE zWXk44kcMF@`fJ-Z_Jp3T_@b<+va{$!oRWXzRXHGmHXHpA+AJ4<36#`47dmsIlSdW1 z^)uG^lRd7NjQh74u^Q_Zw~q<#*Uav#lnq@ilT{B7Qhy;9)|qcrpHgsc>`92IW_T{*DT~$u>U~if78qdJpusP$5%BTr!=)@U(c+l z{_tAoW$hiSFF(}xh{;Fy&?2*a`VnijmAa(yA75;}CNh<_mHQ(7Yr*Xk@>${W=&>nV zd~8|TYr73YV~Y=|vai!eZ(Q-6sw)Q9uhnjhmQ#q9q=~!^sn(~05ThV$(=9If)K)E; z;1AJpEU;Oj8X>pl9IG@9QcXngB4d`eMiQ*Kx16OQyL_B_0*OpGQQE%K=%7{5W;uuX4&zW$K% zn7?8^XJOj@S!pm{uQWr`?+$hFXDN}}Bfl2RX5clAn~$s;L;Cu*=cNrwC{Q2@+uLqV z%jVcXVas?5Set5!h#@`OdJWNp9js#+a1_$0sV+ndg~wpkn__ZnDDc9#_YNipG7Q2t zAjk|6!|iW!2z;y{LeXq<2rX%(-_8Z@dtshJ=9TvZp01slZj@&X2E};G{k_Ns%c_ne zUbO=R)@$_%e=PFGO>_5A$n^Z4T;HH9)EeGIoYDf)_neR(m)a`ioGV=kn>Emd-3T}L z+o}|ADlMF$kLVqjl|EU20**szt%RN#-i96n?rwhaPp#-Xn<&6^>ZDvLp_IdNEJH$z zTc!km8z?A6OQ^I--#O<;`J%+^)n>l+h~krK3u^zF$i?0lueKe`$1qWaP^b8y(cTKR z#jBl%n$V(QEX!+$fJ!aH+c)gigLcz9ilcH?E}1YLrOxTJyIH*?C80BAo{uZgcdtmQSIx)t3c>CxZOuUQk5%O9f)LSc}M)Ow4ZqPyAX_`&rBE`v(6=J^yhpCi)qy|w8B&fU@Mn;Yu3O3uKIGF( z(Xat=-!cldj34~|b=giTu8$8N@_P7s3wCbze*4w+3;0v}@K0I0Coi6}c|1z(l6?Ou zS$CA<0AGmp6%JHn3$|6DK8Al8f;BnOR%1n$9>?};Ey8A(M~Wv zs#=NJpMz;!aPyi|J;P2alW7tdR2w8< zWe|RV6dRb1S{xpgIceX-ofBu=y8xB#~ZyZz#?-NmtydJumn(NAyy^O$(K zV__!d>0L(xz2%oXX2y*Pj2zwBO=SAXH2Tot92`S+=9&7qx4H|haJ_yfB%(hel#s9! zer7U_(g-DgRO4q<4@h~3Y(cp$N{eMEQd(h1zyUiY&oSL#w7Q??TIEj-EQn?jB_Ude z1u2a4*q|fA>#7^}%RwKRDUR=77U>?Upb|I;MwR3`hkA?CA1aE}IPcMKXO&M)vR!0`gG%|*C z1TajYf;mzUCdH@b(F#TfvC-y|Y3z7i)u$Qj(}V|$S}PKv7t=3;oPrUVhqq*k zAT@+D8e##ItS#kFOaNpnX8N2lO!u3O?Et9yR?JhgI$F%!Sf%jl%G zXQIVQgfp21_0-Un`;F`(&z&tgmGVDC9894S1Vcs7B3?pvJKq-6-goqfqi(e}?!_lYaN!_p2ydCx)MZ$Q|c@t#Y3ZvyM?ru1s*FP^$;P{&k?!!df z{86tElND<17L!4)o;gy6doSgoDe^!*Ol$QfA1A@ExYN&5?X54J?W>PWk<^l=L2OUa zNn3nMel{PHrOOrHo%6T+L5nurRQN?GZEr1%0@e98x!Xw=5@~(1pJYV)TYrdaaj#}B zKYUDT%Cl5j(kdD5k}2U!qY+}K>VC~(fxyZQxM`6CB#fP*As%M$5~yh6XDgp(tj8G^O`X>_h^ozRnZNlMK#ts< zrA-nFv+EP;Tc7dv?-s?#N2M8&pj%2C>L;XC`W3XoEzDMiwy+itQpAUb`@jbN72ivX zmHN@^Q%9_Ht)h<8QkGk~a@=OmiDP_)|ae{!VW&z3OZ#HHEy8_$k z*fFc25Ofn@V{gsjc4*UpHzBSUwag-ldkwD}1FfQfupS7~|9^%yfUyDUx5dvprLi^O zH`~bW!pMBUO`?V>6iC02OrfEW`nN@X{29^oBC7iq$x4_e?#=2l0xc-Bv_7#yxLzXN zW7qyB!GFFa&2F{28aauoPV87D#{WUm)qp7)!~5!ww2d|6wlrh2U#OOZHlSqgP{%vS zUBQ5g+~{>8U5|Kx&|?SJb%4k)mR$bMm*eIL_pezs8|F*P3`gpS^?J9mm*NDO`$l##;vlsre^NEO@b5Im!a33gu8EyEDxK3^Y#X9Mt2s5Tmq z53Cf)+E7Zio0B1R0UP&$5%JK>l8jb3b*+%8Mjs*FcZ_WV1rq-B)$5&Wg+tFw{p_=q z+y}a>9-=b&%iShTKtzJJ87ccR+joCiy2%1AR+JZY1}QZqZn|2M7zQsH1QCy_KwK0W z?2qO5?mWaG7n@r&jH`Z{xoRzWO30<7Mc&Wg>JJ{R<=>`UiIP@VeKxjzm99J1NTWUJ zG7=22EZ^;SoaDYLt&E**L(1g>h%Oh`17W!QS6m@|w3?ywf~&e_mDarZjLJR%Vy?k? z5eMAS<}~2E|Cd=~_b*$6SPkkTmkO2&18fuUyI8NAxGQ^4MXj2384%p1W#N_=Pao4* zzf*~RKG;E$scy%^O=`nf+fE*9@RQ;fA-3p!drd&2I@ukoJ>XxL+ixDq7lzx?E%BepbeQi z9;|11$@T496^L%0C0!0$oY1 zwd-1JlYF!MV{9F37CYK+mK=#WZ_ED|x96~&2 zEl)y<*^_=6#$CZ+?tHlfnfAWA43v}*XV2CeCi;E=A42p5mBCY$n6V;7RAT!Z(0*up zqrOj+thRhWuM(smAd4bPC(Un~|5 zOfQY8Mp^ltN9uZZ^Tou%;fwD$AiYud@MIxX%MWUMiE5BaSZ%ESmE4C4(OdoCsL}=X zxu;T#;>WWS>p<=3LHyTRVZRPn!@^4sWXfi>?;?oV&&upfhfyQM^p$U1tL%MB4 zDMTD9A1&vD zIlrB_DVltbQuhf(l}GgtkD;&QO+fJgQsHO+?fSVSTVduz%5l#Ncw(_X;3+*YJptDH zZJF*Qtz*T9)sxWpvi*>)XjENhh=kBj4__k*^hRBzaUljGPC7JI-i-oHM zB(%n*wjKWLcS4sI;pM+_D@kN`sX6B=ojyt$bV5_)&A&!Sc4LTRb%J*b)Qjo#Le)By zzC2V9s1*uNxqCa89de8O8M0ETdz!Msr@co~(yn)XHuC%pmeTCQlv^u%yPqZ|Iz_2T zIQMC|B4%)oh%P9Rb){@l+*kA>1L74L?-m|RdOeBq53=MzT;$c4t0}! z;U0lTL{&CAUyvS2k!xwB739#P6b8`jfCMJl&3Q zyQ!-Y6rnfe_KiaFIFMyJPruC<@Ch!pKuKvs8obLR)TVXz?VM9|tNNYVTiR_w>TgvM ze`?dle}$P((jk_l zUvdFuRWM=SQzi)wH{Y^W$V&8Gq&ENn5MPMYQSNy z$BkgqwTmzIqkTruV3w#LO|m>3P$ta~2y9oAwCEmZJD)v_ZBih}!7E((xet{Log7s8 zK4Y8r|BBFW*ctM+IFbf!(DYG|sJ~P&Pv= z9H9R$9?tfDHU+S35*8C7;R=sx=PFu-#`>YAVvF{WXp2AWgH!@@S!t+GKH+4&kUev?h_fiarQHBm+;AM-p9K%R${w0%rMaD7t%KWQDQgr{m+%`@ z>NN58HuN});pk+k!qd4Zwpp9EI7~_YY#PrjX|;`pMpFwXG~712PmVYKBu>P?;wC0T zG_1#_>*TpdT72xMCXG^ZPcOnWQ%inm)fkY?5V`p``?frH03D6SbVkh$ zxDnxv{PZg!I=~88mPJW&Ev_Su70s&h%Uo}$Y7?Dkhv0pxbJO(H$^)!QQI=xtY(<3^ zksc%ZH6`vj{Z_{BL}acsD{I7Kqy)MRfM=|}n`y1;z+K}O#z~oQqm@Dvy~=Ya3(Y&+ zfkD4sNcd_REkE!vy5VTz z=b~&(k)|W?g5&}%>t3(7cvP$rg!p9zw3*DW?B867sC~nx zcC~*~C9jU+vkgWpFKNVUDpE|{gS-x{~e=n`-bT2?2nj52ER}l@~xKdNI z2DzI%9ft5G9qknhd+_;9!jQApv~*0h`1f^DJ@Rw40)kv>cmdCVYOKSvGPOZY_9*1A z!AskjOx`8u>EpmHjGZt=Z5iWKa3y;)5d}7$m@t^(Khuo;t@jHvhPm@2Q?Lx#5y^J`Qt%iB%FyR^SUEl!Se zhELx8k-wLbpWA;Be7^su>DP-rGP+hrGX=}vKb|mNU>LruoNo%c3Jy^sv#?_le;50N zNlmhgO#ct@`u}KM9ZIUOHB=JWU_kSt4rWm^QB%aAO0vpWfRe~NV6HdljO5%h3ZZG2 z+c&p;Sm>Hb7F-*aEN*t2-Pdov)jnA2SAKcM3Z>_C?pcVr)YP-NObb*zFZvxSJ<8HS zdbAABN3Er$sl?y($l@`@QjDO%GaImr{~r%iNhNl^#VILo^SElhJPF~&gZSOFI}d5- zcAFFnf6wovKRPvpaP^3iMw#tIj0hBZyzie=acb3!B@d}1d|1DzqO$TSA4i}f6Z~$b9T?Q`9Ul*PU|Q`*7~ChN$I7#( zw_`D2{5GYSMZzm|^{GB1S7@y6i|U!D0kET-guD|!!ZiKb_E$fXguC9tgITmas0JhG zwS5lfTTS5{;b+A(>Y9G(qvaI^B;4N&b#i(rJ6ndrS$~#d1 I;^5w|Mw;R?2nx?R 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%0D!zpi16-YFd2lBK3^f)M{{V+x^vil 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 z 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"wrDh({4pe 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

    |csMMP@GB@Vhs?b?Y2 z&Cg0ZZMo}33rCvGhbR15$CX0Y!YRLRN>@pUAC#+dgdRm`=A5Vaw~d7e1@J=t{*hDiW+T>DDj;Hsm z0N+rM=sbf+t&U4J#O^9U)6|pJl^MHxbTq=(BI48%!Xz@4;^N;b%rt&XLNH4Kz0WlX zWjA5!6#`#b0Q1s-8f-x%R$9OV#S6GmxgWg;*An zYn|>7PSjAF6|eIY0e|+Z(5m@H=dB<`rG>X9xgYT>#;f6M0KsM9C(ftYWB&l@jrTuK zy%*J3mT+pn#V;Jil;beDZUijYw3S{^0XkGLzW)HRuJb0%u$k6V4lgc~TxD0x2V$*l z$Mau0Cv5?uc&qJRbzH$FD-*yiwZzpRl534-Ay7>vW-L~_XDjGJF4yh z9fb**RE=wPCcs+upb+68)1_B`;)7coj?^rrZbNO}p$amFYwbW8rqME?C640#=y0nu zATt21+O0;Yo1MYpjz-vA6Y}Xm0ux8--lqMBy+e{XvA24imKJwqMNz5Qj>@h|~)KLiZrS$`POG@b=Q5K{;oAE%9 zBg~NMMg<1?hw)M7M(jN%_ol&R8cOI(@Vp8+(()t4rqlodLb=i{wJt%gntZGJ_SJ4F zT7lSnLYRf(XEpb z9crl{0jak<4)n3h^Hpc&dLHW=jSDJQ+j`R^X6l zvE=(~I(4X7{mF z15%-dU}qP*ABnrwGzpSU<$&9@1ak>DQVNZ>rzAwFEwT;oOGu)PbjKJ(z4q#94$wGx z5@v5Dwg${BMObz^w2y>xXc9Y?2#UAduoW@7fuXKgZO1gk5}o!Iy$QXV;^c8dD!#QU zO@}nW>eFs`Gyp1E-m&WT=~5UGYkca%4K@IedP^0(*N(Ksc1ciur~&{DsN=I-n}JGl zb?@n<2vafn+KEE9sBnJtiC@=XDeE9u?7#-;eW@4V2?<_zps;1W{{SxZEjE%YE=l^< zVsQ{dhHOmptT8Xd&TIgr#uheMuvvB^5iEgXhB8jB=Wq9}U;GF0aK@%LA;x-VX&QVn z?g-p{7Pv1O_^w|PV-6E9c_Yb^-AFRGbM41Ym95KOe5)6S$6%btih;E$U9a42?Qu@) zEX}U(8a}Q<$i-it^h6S*b9&~y58}K(i?VSlvd5W1pihUs_ute$b|$(A<#>SGZ{nSi zRK}B_3-3!+m|`wm7*FY=z4trRt*=gk#)i1H1F$}ug>LnX00PFs`}@>7#{U2s>~^FC z+QQ`RQu`{{ZA2^=ew+$hKTc0UMTn3)pW286wL*=r^{KtZs2L6F<6eZRcBy3ptpRN$UWm2#rXUyM^=(bq-DxChdz;>+i2$fRt8?0bVTA|?2lk|9 zc&Kn0W+M@bm12k?yEn?D$e3I^O^caQ6dImKHUNJ0r*LK3XE*)Kf)aOvz(_DgPq5pg^`Mm3nj;YcCO{nG5of*zV+g`7%?6n%p%OP z`>c^{RBRk}HvaanSn&3LgYgaz@iPC?1Zps+~yWfMwsM$gIN&VAAh@6JG3Y*E}ATB|&e@u?O^?lz@=H0(x|$;sZ!l zHGKqbO-Yaj(%=u33K1d#ZZG<})36%aQqA!(>UvfkL~KEesH&)mB)V9!QNZt3$EX{P z3O2WTdlrSS<=;RH0Q%He-qs`$wHl|ZQ*JsXCmoAS1{zFM&G3zZ>U$5ZJqFExinE9^ z44P@AI@QJI-QtIx6Yh@PX9w=f4Cyif4 z^)RMKFPJVY2trHJO(fyQwa~mPZR?!YAYwIvS#0YdQyyv%spyX zxIEJyF)o|2(m1sME;vkaXjW%D+|dBaF5J^W5qfwX=}#m^K$^z0xEG`b0!orVBc&!q zU_&EpIUVX8gp*ThC!k%$IU8U{2Yu)mX{l|nH|B;!EX}3J2Z|!Zow=ZQ3+u24wL1_o z-6aA>y8-o~kVxf^0G){HDSC;0Y;OMmz^5@JT?H$#f)$6Q6j%%Ds(GGc23LY?UM!y} ze*XX}xYEZIO(f2#5{tVNVP12a<7M$4FVv-Q5g*G>>i0idAJI{b;cwaT25gWmnvi>$Bq&4hi z8}IYm?_Ou9;Bd*^#mJ?DsaJMHA~o0V(wQJEZEKFAk%oIOB#z|oR+dmw+g1tM8&tp} zM(ejqi4^H18xz)=z!7qH?MjzWJBtdIs1TV-5TUMC{QJ`Y+=47RR#;y4{i<(cayO|c zz;@$m#<3O#qHRY@BLF{D>H`A$LYonNQ~*t~3k#mrgn&1_s9Y8WRmyvgYDhW=Q+Ks7 zg{a!#T=b(B)2X=|no7t5$EXnP_NLsavkUvxA{b0BW>c}=l;neQE^0~Ba0w%~Y7)hO z=qi{YOa-nsrI)hX>F-TGyN20CBT5B#k-&vFEOr1^bjz|P#=(~1{{R<{e=aN9_P_D+ zt{cIgAj4sEtZr3`W>_&2`M6owa%?s~L(o;6?=@WY{{RUDfBYz(`pEdtAMR^knB;Nd zaKT+H!*yURMS4D;icwvTZds@8JsgcKr2JiIO5c0lxvvQ4Z;G~GnXpWJV#vh*0IIg< ze!Cj!!wpP_X6s#v+0NA%HD8^rV@^UefyF6M4qIxIvl373Oh$RiS(eO5`_wo#E)Lzh zQF)tfw`zt3(#$l2+JSb{o=lO&jWCaoUPTWwowB;?y9rN=~9d93BM)42&eh)-?mv(`*pw zV|BHc+LNJKPa}KS8X)M*6q9qopqeF^g&=k7+JP<(mbU$AktUZr>ffysfvn$d)C`L< zEtFkHN)~lYJ7Okn2^yDwUH^}Hn$<=NyiV)D=nKyFJTUycsn7fQ}i?5Nv|lcRQe`Y3g}idHTSV{y3P z)#OD2%4}%e1-Rb2kDj4fc3`Bg9}+aoHd238J+R0cLd&Y==T`p!O4s9HHuDqxMcf*G zUyJ-)MH|sFd`f!z)hT#p{Byhy+jB|;wjlBr)nQ|?yMt;7^jyE{8&GbB#~9k@_NJ8@ z3b7u-g?9B^2Ikd*(lKy1_o9G+FS3#iF@Xa7p41*I{IV6a@qskErw7rBi#6 zzwubBX%x8{Xqbd;w+wdnrioz58oB_(gL)=V#cjZ-AC^gDdNe8|FCH7gCJ!%RCUJ^ZSk}P#dk;~+{{XZP2Z|i20*$gi#9ti8 z;aC?9feDDtr9POh50))^u;04$>t0WQ%dz>MX(nTu%Giut+p`hJu&Ws^O+G6S_}tE4 z#A7BmcR$~2S7n!B1WjSc>sixo*?3BkM+tyv0rW9*#?@*F7z3^{tadfH(r%=XFSgX( z2zG7s@@l$*l^X1m8rd#B;jM(1X$Nn5?~n-{B!)$NGmG6#aWi3}^2;LJ9;DTe4(C7R zPB6H##|Z7|YYU;Qq^RiQmF(^nwDi5{jli(Dp(-5uIJLp_9lR$`7I*%rV zDL%rX8s)WEC*F*zg}M?)N(LA`&eVpDM5LRGo6|hNSAB@-M1-)rTHMkC16)`s1EKFx zux{p-$$UEOvENQ76=7|T>b&+H2Q*$D%2Nf0jZ}0WGxMol=Uxi^a?2SuRUQfijszW@ zbwHEv+rLraC$%KPo)GSmYTHY|t!YvHUN?VR=zcULMziJY0S5i}GC8tgFYYWp} zb;7I=DI!Pfskt?nG$36;pAEK-uQ0t5Q%~W3zAK0grM(PFFai#=@gLC9dp#>7Se}^f z)m1sZr@_yj>@F8!e6$lD5Ws;U|Z=4Qg) z&;${JnO~c?%g4CEIB&3!!2@XuuXqv|^h$ZI*#|ZL0~AYzi?5R@fA@Ims^&8h7V~xX z0tOFI9w?|eciVX3XeA2|Uho08Hfxy-sb8^9JB}!0l|6IEuCrtYcLk?cgyZTQJ0y5C zXs-?4A@1ACHS25~ZcyEK$Up&NPLoCsoNvyiD1T-(*jIEDMlU+8!mo(bZV-}l?kfVt ziN3fU59r`JNe(k~%B#CN*Di?Y4OPFAP1KC^fF#0|oXtFQ z?17f~Hh~{X24d55@_tRh@f`*g8cUI&h_Aa0F+$g$NgwOk3?th&-wG)c-Qr02;aW=Y z!D!|~9?iNS3H)jjn7(sTQngtPE~j^E%*f}m$|=RO0|A6yK1s1Ypc9q`GIyMN72jh8}d(_hhf zk$vOK-^ITwf~HI}PZYL>3rGNTuH5|c{xCPMVwM#Z-*wW~S%9T6Yxci;{4r}50~TFe zY}A}s9aJ0q32v4IZQWHw4hw2xR$4MHzbvckq}jSD!(T)9Q3fl|B7+!>Vz(lLkM-23 zl57WH%*3A;^Kq&-BlE2{o9c6> z%V~iqD04+$8m_`W=2=sgC|UzO^TUI}7jYR$A?*Vq2C*WY%lt24I25Z|DN9 zOm(~**E&&T&H=Pv4RQPF)*_LWd!LkgPIR@a?ZD7 zqXe|eHv`VSe%@#(tB4gHgOrwa`Sls5m~Ki$^dyNyb4aTqz5dQme`bifyl6gGby^9e zC5as+L1pSQlA$Mp)Z`i!U;E+n^oe6?d1DXBHW6h10l+I$`br!MW4~K%MHAl(Q$Chn zREq!ww^_#%I5%GHe;Cm+ZmEx!=n@3aHQF&cq{89H@uU$u2#Nh zNktwOS2!g|jUrYiT=%m8tAA)@+!t5ygL=m#6St?|aCEVtf@B!YAY0;4M-SuT2wbo2 zc4VAo`6}7^xyw;IJpU}wG+|gqbo)wW^0`1-j_MuN+WX^e@<0>i=KV6Ovj7TGgB5GR ziM?xgyio^+5f81cx^u8r$AL$K8ZjmWnP~2Alre64Yz15}AxiFx4dgnky(P|= zH!K8GWB&ub+j(b*sn)bsOD9$SR1i63bpY^k-I%Eo=l3X_#7 z;-IVQ4R#gDPZcIynwk@$O>&>b?6hy?mZbg1MnoLugTNrnGU;4|F8^>@E;NixRx0V# z)TKSJ|1ZITf__n$;(ve{-|x@kaF(>6Yz38`>VCjLJW8`g3gclcc(Vm>UxmJ3R($U< zXF23RAxiBobgq``K*MQfO-Qg2A3M_IV3wi3`s|HXgOd?WyKE!&CpNKQ$8Vo0VJ31J z{b`FmzTtKmocvphAEgD87N|xu!o8G+#RoWMvizthwZm1pvKvJ zWHhc?#C{@eN#m}aW`8AL5mVOIX#FcngE#TyMO_Y5_DGm&d~-4hLLEn+(0GiQvE*aN zWFkh;CUEplX`%gEy4B28zb@zw0KBa%Fv1MlsE0#6gX>_i#hJ5`Uz%X!q;*6u-nLscid86NJ(yk8B65>#@FZ?Ba$Lp9dIj9BV|7dn--vzUb#g%= zCzx-z^%V%s8esB?!3)oww$6R*HMbiQbeM#?=> zVSXXZDCijIxY2dC2`Z8b9Cmm|M+HSpzhBwj(f@e+O6JqJqP55jJ{gv)6X^EsK#Osn z^D&hQwflgC?RII@lh#OH27XUqip zy;%ic)VK@KeUDqtB#!_0A7HyPjNwzBWW0(z-ZfshMM{UbbuNqAZAAvrf_37O<5iv| zC2ib0I(TZ8!_Id3cxwt}pF~$Ov2}5r8e|4u%o7&b{*mcZ9tb=#Tca>eerh@rn%246 zkx8vV3#B{vQ4NfT6_cv7TE_S5PmF~1yTaBm@^%$r+QiL&mH-Kd#PuxZ5y$7NWn_3O zYKY>v5oLD$o2^tif{~w{&x}quVYU|=35^RyMbawD1W*;sJws(z;viovV_s)Dr*|Hc z9JMICgs8ap;XYc99Bx3$5MPX{W5C;E1B8>>uSDMz7Mh#UDdOPux132>7bc1O- z24@qgFzSSCWXgGH37`qh#3O&}$}Lnq)oQ_pf%zsJ_?NWPlMf`*z%#+JPgD@~VPGV! zmefr*5qJNN=BeklQ35}lkFJea(=W`mAP|E+o)8=B+?p=KGBO(U-9pFA*s}Q>cKpg; za3?VLH?nT^{)Z;@e5NiRE076ZjNz6ee^Wy!qv%5=kW~D~R0KV0To&o5=Quv~+3si? zQkGfq7I+C_L`1$u^PSavtfg9Zjix(~`+>wxo-AZtUD#>J1lG^D*vD#3*vxO->h$RRKXvSFQjh?G_#0eqS%u{{Y>_4ES0F|QfUpWQ$ZTfbJ&hM zagS|dI&adI8Sk6q$JM{{8A&$F+jWM~f6|#@w$2CLVbaTQy0M_3D@>v}mDS>SEBU{A z7c}<5y%vM1L~0aYAfM{Q#{FTO>&5lNga%UShKjraty>y6jqL-{GdUdgqXTx4$tM<| zmK{H3iq>OQt!MY=dVWZnr;ruzy#N7Tf;VWF7lGZZM!K9)x&pvtTKjvF`8y>`%s)+c z4Of=^;H}G$s-G1axK2jep1F+kEBNyCc-QFk%HM^%Z$0*1CFozWPg*S`5gD+e+3k1( zb0H>g)%Uxv`Cd&w%2ZPoQ#xYbGm`baAE0_eqEAEeOx>DUTOsShJIztdkQ_1 z($C4B@`?D_);e$iy3JtcPFQu96%fCr76NMqru<{4rl5Bef|JNEjBx1UNi?R06M)V0 zx#e)=JVc0UGr(M6LHK*vvwsBZb$YKgkUFw=R3GS5KEZFL{uDCWh~rzGsFvuIz?NB6 z27G^|(ajKC}(UmU{#kb^H z+YgDF&C_-QDKIa`kwafNFVo_h_n+*JQWR2A%uF#_MKn8mv015aZ`w6Dw5TL^B_J|1 zgg9_YZ&@Ti42-TfkwahdPkjrRHrj9nAAH(**t{^=P)lt2 zD0><8YH43QIsW}6Ayp}b3ibp#X4`ME-suZuWH@772o`9bJrWgRX{z^Hj^KyrJPV&Y z;NyPV%qu-;MdXkg2h>S6w_|X4)y$?c* zX3`vg;$T0n+@~3*r5xK6T5!uN#D5J5mIBogF2VhBL*%P>fc#ljhyK z%XI2z0M4Hr;>a%@>2y2BPa7LG@EU{J;r9oXMT~_4A&&X4Mj#= z^Ao2mm}=N(@X$G3l6#UBxyBBs?_g!Iz)$IZv9$cKYbzwccW zGvZ(3XB;=Q$v=Y7(S`yl5i^f*DI6x1NgHX$!r!8eha3p<=lRI%fU5_F8E*`$NCaT{ zhEs0Gcom18R%Q@OdhHxS*01WXcwCy}Y*=5CH>zJfDC*Pj5fB@bA2n}onbj~=jvnVu zXYyKp90?@CYqfk z0D#rtnOndf;~ztOmtnPf_YRMvc&478N?+x`89DYNSt$yY+h{k`gtx|OEeOeq{>N%| z_4pa<|NE6|fiYeNPj{707C96Uhq>IUvLJH}=P{8s!70OXiXj-YtRq~PI7ZqL`W$AD zZ>J?+g00+zwuRi(K|RspSLg69Yq6f9*i$VWp}CvlF$eNoLF}En@)%WQ%rc2#NP*Up z|9YqqRzS0A**dc;q=14*;e5D=g7sb?gcPwZu1KHGm_ZoKYiC#7F*Z7v~e^1h9G7a4>*rE%( zjDc0(x;RHhd(8OJs3JcA_!*0S>M~cBEkC{~vV(~)1}AEgClRJW{8X2mr;i~01TW(2 zsAkjWe;vi^e01v$u+{}K-&*RqbBazja(D<;ZQ0c%wx+VFNxZB>dXGWH6oH*5)t7fQ;*( zp7+-wK647Qujkwp(isUa0@pW2P>Pn0ZmbxFG)N*#0~-I}OqFt6uVvUqTkI>xUhj&8 zaEDNzF+AS}sG?>Xj8`z$ZKl>>)MkBI4ucL)Cr7SnqfKKX?2T07b}?Unw`8pH*Z%-j zCCaCIF3b21p4oN8{koq~&#n+bz4hrL-5cp6V{!;id2DrBmotHsG5PP1As{cEjP;V& z+RyhN+bv6+ez)($3}uSezXz%O`P|w0xH=*-^2UdM900IJab4h^54qvTkqgBwc4!k6 zMS_kpqZZyp)Re#HOK_8NHFLU>?7ABJXvT}n{wD>TL=zKlulv%+8k=DAgofi-&k&o> z`=e8`E?Hboy~zY-8oNZOS0&Pe+a3-fOb@;=uS(_M3s9#hF|;aF(-hVF%?$PFGX3HA zd*R06Da*D4i=O5=KI20WQS{5NhK^S5c2ov2beQOoQT3282ixo@{BXC*O(!l~9u03G zIC$i1oH_gXQzxD81*izaPj6(BOZi8o%2&e>p?jR6-c|T$<2Ofr6F$ysb-Lw}yyi}- zapT%$j4JrzpL_^Y46B-HxQD}qsxpt3bTt{*GYXHeo8^}x_MRbVcHdM-&VezU5dPEu ze2g8suN;BE+fGIQXsgn?dg(hGL=_9 zDZLS&?Q7bL>6^;F3VlyyOCr{q`~CyeFX(MAL4;@qs$lK*;y*xIzs8fb?yYG}pxkVp%Wh#I^~q7xbPv738!pFf5EskTfXtxc<$uFyj-Or}-VOgiX*S0O zDy~@7FVaNk`D!U^n=T33n%yE3BSN<}x)j_czCp6mhGaE?lclS2Y2A&Td~>XGtv@ay zj_}Pj`fsF;_e~r{372gh;%6zSDZso|4=IotMaWf211yxXA8e8;p=%d@I-$E<%>N;a zlZ&@y_jGLTUNyCdvx+dSD%ONefXx}SxZC!P8_~dF4osUQ50l+!56SoNmkw%d3%;bQ z_0fqG9KFOm+AQ_mFUegr84a*7cL$%Z`us`j+(3N)GE`7CxXXN|U!Bere#T#8nOCKS zQ`}Iw_$Ty!vc%46m{4d)P^%t<6=5B3ftIc15!o4GWo#FF-gDm`S8Fn@+t<+m&FY$O zk_suJT{|Ux`kT(pv?#{l+kY3i+`gz@w={4ogBS}flU97+oa;<$iWNC8HuCx8Yb+$h zpP;9^upitcQ2W5r(8gWT}WMvtRbJwQ9@}Niy2+q15HHJy`ufdg?JTg82 zR2kNO>Pjn5l3j<C{#Cl4IJ5*^qL!vh=U!^3AbLu5~Vv92U#ib{a-FfmB3j zNPo4ZG-sd2e&GX*vw+%ptRwTPX-{2Z`GHQlKDR0-yQuE(bfATiDH5fLNtP7!CG=#nr zZpQA0KxS;8kBXNclo+G;#4o>pr^JMpVR9(W{c|kePcl}s;L!-ao`Ae09^=Nsc}`h0 z*?|}LB%ic(eSX^{K7}^V_@zwreopW^$<%H6ZL{R-p6d=4YWb2yf0@N(@crSBRj-~B z8Hb?pG2z;FIrr6cFnPpK{Iad*mX9?;(!udd@DF~4isWjci;y-tRD05WgVqbp9|5gz ztxJYKED1Ul%OSg{Ny;D*Lx(rjlX1K8EMlF)TUK!Wv{z6y{wrY>Gy~kST;y9THB?Z& zNv~%J^Xo11fE@KL4HQ5mToX+sy-;iP@}Da-K;{}ixSi5A6CUx{Mf8r zSkRDp5u8qHLK$Ljggk@kptI4Q&UBwBFwMuB#w^R~crjRhUeW*^hB?@Lcn9|p(n+$! z3B1;SVDwoMPtxRINw(0EJYLlA`D;;nAnJaX0YSh$=`2+C&VE7Hes%S?=>F*uML5+J zixyXwEeb1I`@Nv*9Cq*bTCEt->T0>r(!`A0H;R2EmPZZxiIc$z;0Df15-L0MgD6#fu$kSW9q{8 znejTIfAw&W@;TVi8DQ;a#r2|%3@~W(wr(U~oshI2D+avc@E$g~c~@gF4Deg5^7HkS z153p>BLG&z`G{f_m5#HOq%O?z?sZ5&9j-?NRsO7)WiMK#onsc|a4mUm*BDe5@D#&V z17n#RHt5P1rt_`zQ0)<91_=f-YU8#2t5&E(>MhXp`X8H9*UWHV?_y3Ipm8N?4RRhN z!$Sc9+!e3$s3Jtl^SnLAM6eQV!f0nL7JS@D%$E1cbLroMl&6+c+wsOzDw1j3T28k! zIHs?n^|J$h!2WTo4zh=X4j1*@O-_WiO4`TSoymyRwLC|V&#@EL1PciSUw8VBS_U63 zDvTxAetT9y*w#rPF!lD;ex2W=+BZuqB^Chk_cb9FXfr%W@m*Ink6N;ODZ@h(^*+MU z-go{uN5fw>d1sCzbj$zX*l@~sC6Yy$H^Yq3o$n2|B@HtdhClp=K)D`E5tau23pbl4 zsbb6d9CrJWrt}4B91u-SMSKR-$i0uUU)J7?Abgz{GuD4}yH}Cyw z9}e|AhMNr;Zb)rfveKZfp-zFol<_$3p4cxJW6ocCKL#P=B&XNgNWRy`D!y}bpJ9iY z+TzI;`^`ypKv&AH#sQJhp@Q8t^0?DUg(j4l?ZK3|c`4>&Y(6a%%kH4x{8cs$g~!Hi zSm=+Nv)%J^vr9_uoYed5;yHLGqiqaXafP+$rk@|orJ97KU*`?r+DM^}cFJV1#0t$X z&!Ia3LGD=iF=vS5Q;a7u)Vme2-#kz0d#U8CP~f7;!Ku9Au3G$Q6VCB{r&?m-qfi#L z{5N{RXztVae2gpBcYncI{4>LvEV-4CuL)={`(uK@Fd^IEad2g_>#}=*pDm6sS$KU- zfzi5D2X`$#O~Kny42Zjk{`fc-hLe}=_(5I2ZXm1@qP$0*3zF&8c4$yX(5(czI9#I$biB(4aGXKKqKV4QAbQDGc<(Z}9`UMPYHrq9CP(_riBktz*yz>Ie( z=A!jljY{&6P?K$qW|Q%9?Ug|}gH8VmvQpmWE}j9a){M598gHpA`w+0$E!}x1Z4E#F z*snXq6xlsuO0h*V62AGGPPv#f5Y?D&Wu&5D@VQn%ui+?fv zHupLAaC`L3qx)ja6<6~)r-)`Frlr*&`RbEv_}4(1YVjV~E@op|Rk`K3mewMaYug7H zrrCw(;W9?G@LXp|Wc396EEMdD;oo>7Kc7y9VAyNw#O+sW_a42{8FEmmEAAi=U|Qwf z(Ej3>qW&fAf17XUsOrzu`i0)XZcs@6xG8&0?WC?Ba8v?l|w@PA2uUPTz;nZx(Ch&x>- zIBA{mn7S>6jBR&-b@A5%-tq}{fBp1tG?}!ApbD#GmS~?U2v1Az1cl_njFCO+vpeInc$Yd zpb@}g%OhrM!Oj2dcza&e%j=VYNo8R_f_jMj$EVHj$SmwmA@NqH;DVxy~Bh->A^4s}#w+OlJ!|^!nv%}ga zSE}288D5*G>iaeiA31l$yXm?6YYGQr?pQpt-)Ovicx}YD!ebIr_*o)gw`t{FR_-nZ zCq5nF_Haik4X>^%C-3$OhBTXc!eL_mZcYI9S3|Yc4xQvpdIHV(c$xI{5Ueq2U93-E zh0H2O3~@MY+@HMzHx`hr(%?i;TZj;%qX?08Dd!uFtPVA+92?2asPq13LUjdd*gWMm zGzx+t!g3|;$zVn|lJHo08&mE1(7&d-e9AIPH!+o|Lq`-J!o&sL-e^dJpze~9K@E{w zZP+<9T2;yG0+_^q7yB%7Yotjfz2F7z^cCw7@6mo5l1M$IHHqkv4g1IJd@(`n&(i+^ z=JbOl`z+_3=_{SrBO)eP{>i_u764)^4iuiS=1MP%c=xqXPrIx?o8bBoW_cXS0$Jf8}f0BW_QQhj?Fz=B>d1!S?|jkO1DIHqUZpeL|YXj zUYb*b$ufGc0or;asFgNXd;)dFb4ud)hS`y&kNe@V+z0w;D7KuvGz4P| zlh7js)=Wc<_Q?D2kk@lX1M+%19X1dtL#%#-rK>P5a*U8m^zuhOh8m5=O;!vNH<|M!x8|r-57Z;ygxP=tm$$$2nbeeZ zxM6(mm(JkPXrhi;i}g?coi<;%uvaxvzRftd-w7Vmh)7ZzM0i{tSba8UA9X&n~h&rX^ zHqqkdglymKM`{EZX~MI{bQ%C&5c2qrwPPL7M1_e(_lag$&RlSoth2B@*`+~%_@wU^VEJ=<8|l&j%T7pLj)MZ6PUb7g`P}LJ?yld=LLBFxAF~5O5He;% zt~BnBg>Vp-XO4`sHkJ5KnT?_{fn&!3otw-mUukzv%vF!$LKWJ6K|-mH3I_)$8ieBE z;|Q^6{0r6yqCI^vgqA`*Q$2R@1yr}K7vC|0Nl5!0%(@s0)o8ppEMp?hbxK%t1qkmz z4Fb$XcW{>h!;M7xi6aR8)g#P>-jQmI`%r{LF6u9(ZH?LohwDE297Q_#Amzxrm7afV zIHsx-a_=<4E4Xr!o)H){ zcI;Pb{88pCHDS;>rwf#ey==BXp(C!1w=7jMoxD(U?*qvOOAA+L@Ei3s@p(s zUoRBESxjfe7A7orem>{j9mp8#DrQw(&?zp~?Nw0qt-t|tI~BF~gCc}amF8arnChbW_oB&U)z$0eQsINb_TYFv z+Ih_oK}lT-OHZ?legaBoVU+(u1w(3r*7X$|8mZRb$-xy?nC`&()kQZ7cl0QsJpSs#kI=6%=N?F%Q`Vx? zlw|>6ZGN;IXg85=1U9g4!SL%yhS5cZAh%dc)sy`U)yvDeWaLHdFlt`3t|{Gcy#|Z)t(Vt*)w5^8pbA=6x!%u zwi?ePG-k+A=^q5KBh>JDkdna#~{s*JwLCy#QHXY*%&UZTiYzz3$6m z|6`B~#aC1pV-+)=Vwcpy4)5k^>fA1jI2gjVS0nF-K!zh62VRCG@o{;&OV_H}?`3eL zsOYQ5@l>mhV^Mia+TAjIkjH!{$(a?(Vtl$0?%v{-MD9dwss5Rh07G8X9@+JMJO31E z7AY*c{tPM020( z*7cBEALCYPOYH*sNem6Wi={NgSor8sA5u}6K1d(fif zp?9?PI|XAcM|ymoy9OuW%k`Ic$5wY)ikAkAA9)zo-(qD2v-j+jqYXMrIX%<9!M+dX zZ1MbQuumTbVyCJrI&`zt!(&XOZW4d6>+)_4mzyp*{90P^-}KVAGShWY?sW5SV9AXR zAt~49GV^oXF7@{C>o+P8=%4yC&r`3-7Kk$(-!b~m!{`%)7bt|OvUOH@FGcKwx_C!%u-bfS>{xxjbXi3Udu)sy|GhLryTNBEk&fSiMoGcedh{bMqwNYzi%i8m{ zF1UqGL8a)K|I2;TU!9-I>qT6y^hR@C#<;Urs{L2CG&o43MiMS55k9Ufej96z^1yvY zt>ma2L{|*X@W1ruy=%p@5=|5boLS80%w!*PMl{~B+SRt`(0IMI-cQy{^g&C84U(%F z7PYXG`-KJ!lgbb?;>k)3)R2k(`fWn~B;2?}nI+Z6Rg|ZwH{p)@+aAEa8MU29bPA$(9!_ci;=mkn=SdnB@2fy(tS>F3 zb%tSBP1IkNhN4j0~8DE=Vx@(xYguiGa_ z!El#0`z7~HHJ^8e&}3`@K#FzZ89Ko^2h2sy$5ytG50#8QbgGgqeJwjsfhzA4Ma|-l zdV$tm4~i4tQVogsOz^>V-2T^00TwHLy-J>Go`cCT?6bCB^$ zR7$Z-xXdNRjk|6W6rAz&kJP+0MD1mnXZvSp(D8ClW3R7$c=$VpKI zex>4-#pCvjVv#Q|9gQ@cc{F6fAebOF@XTU$cC5oXUX*4prDMoj?=O}Gv6X}M^V)%) zbg3Bo`PIYn5hc`p(8%Kpziznv0K^{tLb+S z^?I?Xy^ji)ox64lc?zL>>!mzo>eHpiAarg9_q7H?V=xHBgc=85n^&Rixj=&H9sgr{-ie#m z4)eosBQ@{!ubyE*ICV3G1oa!SU0KNhQldN@!d_Qo_{aPygxBLSnXQ=Ri9R}Vrn5Vs zATnDS>M_6+jKZ}p#n;PJT}H&QXRa#kdJ2foi#HrX8Dl@?#jfc`X8^J zlVo=sY$Fc5591$e*k4HFR@aR$0@gY<6V2o+OD2>#iLj%RwowI2j!D0MihhnWeUPg$5xF<0WEd_O9&ZS~8P}KVqO6p9Vam53}wrjBPjzI9;wzhi_w->4*r&fcsqB zHtIFQK|4GaJCUq%ua+H!fS@Z1v^}@1j*u@h$Ah&AL~0ReuI4G^B{zc+{*SaI2Em zA8drPN)FKB zA)jO&i>b@)CkMqdY>wn{TDMA<1=V3}rPO=BbsdI^h{n&!kFVffjW?!g9!#Iof!;!o zt2nqmzt-gAE@REv;p3C*Zw!z5^*^q>l((T_L2tKNRjdE>l8^}SLc z!G0L9{yVOUnJnmESkCmf2TNv)Q7B2>pH9x-m0-uPyb9XQSCTfov+eR~YC5w@T6pk{4i;gFXUOV?prnp)M1;adDqf>BYeY*+EwUUyfuUg6 zF9|>J9MsC?k^>lpn9-Os4wNjxF^~ zm7RB0Nsfs}l3G>9zi{|gWVcCj+v=9(Ef})MEGaG^PHg?9*M#8}n;i6t(al8`Li-<} zfqY;6+;-J8fA9JOyMDAcK68~kwN(AsAZP!XX2_Ax7lr1$QlUaU$=Z6LU8^gS!J#Cs zX4cGaHJJuW3(L>J&N1b(S$Ip!%;O|;SJuH*hvo(z1NaWh9L$#q%_DipBBaA z`~>z$5%Iuzj6cSD|DYV@*jhb*6Gf%mRPD452*^WxUF~4qy|$Wa+bz={2Z5zay4n1e z`8LH!6HrL~6|ro#06<16C#N=QSS5y_h(Pa5gL)k(b?#$nssEz|ZkSDckHSxu;FBH* zT?HF)u)vSaYs@*k1q67Z&L)+69pl~Zzo~-L_&e5~0Rz4?2=Kkp=#!TgXD|2?PYbZ# zi2vj0+e=N0)7sjR&=>8jHwu_ApW^;|i;T*28UXqu5aq<@sR>}nNEbt1l!`Aso_ton zv-5LI_3AGH0SE%jE#f(6XGvW?D5rBiuROV*8rK&yn-psbSp=dC3$JCoT)hF4m@5ct zqqQ}n%m{n@Hw>V!K+?C85N>{x1O^+CLjMEQhQU7asYLwVOq`xpd}Ljsp|KEo~u@0?v-R2(nK$;nArZYMMLl?ThLqgQVF%Pj3@*`_U`93Gh`ws*T|u7wQ6{e2!BnXJ=MrmgGcd zbX2Z09?{F_k}|O7iL$}HR8ICNxiZ~~jWUrI2W)y;@3pB4OP)y8Tb_r;SDfZAdg>$b zJ63XXC^n>H3%pt6X(E;Jwl+STnJ(9i0>NOj!mNL}#Q-l2L)!)cUV6@dc8w?#Ln~@~ zym#>kM3p4Ni}Z>SvL(7*l5CSQz{bHn0#T#G_I!Z{>BK6&eqm{;hn2QWS7?1EWNE1d z)zkWf&uF^jH~7B-W%glB+uWDCkpR%2A+i&u%Go2SSndCa9`{_6lKr}wn6W;=N^`Wd zR1rKBogeQ}MRpv6In|xq(&Esc9y&YyB|%i4NFhz_MRay8-m>mbjb3V!*z5$}u`}=r z9fDwGGh!n6YL6pidb*W1L%d?#(#RD9mxUiUQ%^Bkc&09>1%aq@E^F~^b2#8$1N!JU zr!c5vS*0YPE3bx^6ngty(?G zK)cmi2T^Z*$?7HVn3#?obd}p*u_y1ocJM%&SxG`nrbWWg*NZrNFH&M(uZsNA0BuCw zLY>G2XGp~up$lUbtif`e$EG|zdULKx-@V=1nx7=&ga;v9-?~t%QWzC|Mtp`oK@_(U zwPzV=4i&`!-0lEwT;OFMv1E; z>+iez?;G;b@Bq%oF5@s|FxW&F8z|#wZtMW-ikv||25yIQKcp1p%$QelvPCs8su@;3 z@G5#(S}G5#d237YYq>?CUjP7!sE#$@;`liFpamirB^-IzNhRIVj9yBtqyWV`v67lx zdSqK4>qm|zt(>Icv{iHdoL%OSi99dv(1M`2TOcS#uGZ)8r#w=oKX)2W4?iZ$%KpN}JrP7y(ZZ__6yKP$W23dJG zRuKqvh|PlTEoc&8R2gL<853{S+S;z+P625*@-5Qe|fi5Js)%*+wL&QczZ1Dsu zx`2ABV9Bu)8&v`11AB3N0);5N3}dVZ{jxw(u>xxCMclTowLtRe_==|jyrj7QefdB1 CRH*&{ literal 0 HcmV?d00001 diff --git a/assets/images/block3.jpg b/assets/images/block3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0726d4c5006deda616d8618e4fcd9754a9c419a GIT binary patch literal 133761 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 literal 0 HcmV?d00001 diff --git a/assets/images/checkout-bg.png b/assets/images/checkout-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..e99bfb6877c42ecea372e65932aaa4d62645668d GIT binary patch literal 34322 zcmeFa1yr5OvZy<83GQyeLU4E2;O_43?vUU?LvVL@Cou64JV1cp9vp%OeKSi~*=w(T zUd}uB-8=3WVFYHS|ElWludA!;pE72+f}8{*JRUp%06>(I6jcH}u7G~iVWB~P%|?o} zK@V^alA6u{z!UWEzhHpWbQ}NxUfxnfL_xvA-o@V8!rp;IN<@Uj!O7mt(#8}3@c5je zY_6ibgT;5bbS5kv7Vt*eUI`PHL`gU@03(i)h7=CvMHp$$9HwFys+brg{`>4Oi0J5m zC`?6Kgb4Uqm<`h0=-|Athz~cb-g(xa+Ap_8?i*(Kx64m6>c(Jzun2D@Srpj<5K4rJ zP*;Kndiz&5=mi7e$sGVFuyrP+&Ua7209SszywAyiFdYCekI5&n0HACdkdYwt0eM$A zMF%Y4B^b~pj#C;o00SWC6)ju{5EKUs$VjGC24q7542F!2)&UB100S!jtw}&Y##M?p z7(n|CDJEEU9DoGfG)xp=!2>8CQ;QG-XfOgW%%pp{0JC%eMk#eONkDZI062>Bq!s{+ z0AN%Md-V(e=?yS=|MaN`;AIK`L;R~c@5%E@lx-RisgzpY7IH4JKy6q$M;LW=dLrsk zDeUJM?1tcmse<&~o+-G@fvm_Yr^5h1b{r;Xwx@R!R zn`31Tf&jp(i{HdOEkhk%01tG4?R_rAA*6-glWf<^NV8gG!3IF~&S&*ghwp5}a$;NN z<~BDrW?%FQYa4!0_q{jo)(5KJ*?jZky}dkN=~yEVWY!IofV^7i9zK&PAQ+2>dug<= z6(e!m^yJ}|aFVQ7%BV$y24h_j%`sXuHR_bPfGk`%{#hTz#|M+OW!f7E{$(~mwG}^@ zcN|@@t}(=gG!=@53vlfc0QlNw-!(-I3lU%uygKIoa3pXikxc;zFq4XR1OW6z$>~)- z)Cmm00sx}ffi%@Z_-9=>v_NQrE~tgBC$|RdFNMi_yMYGm6l78V!q`^6HAT zOA-<-lAL5P3`3DjI*v_}Nhv~wL{*aTE1wfMSE!D7YaGve0CUi7NV^2no4{H{zA1zT zk(Oc(yqDs+PsUALm{Mb~veU+$>hbuZ*mJhW%Pf#T$MA~`Fap2ez_9e%Fw*z;2-k4Z z!X+3F)sU4Vl=b6PtCd5vg`XRb)wn~V1&RUT*dg78NeqdEBsF9-mgM>SR~s1{JsT_=_#32Owc#_21Re9Ql-H=0 zK3KiL-9*`B-GnwxW)@P-OI2Dd&QU>Si_sFU$Z1rnQVcCdXLU{G8VSadk}jyoO`OED zz_z%wtoq{8in^FcB$qU<{&8qW;!DyOh%5&)7SIn-_UvKXxd18!P z=Rr$qjaU}q8pzg5Su--{<3`h#d`H+8$yZvE!zIGGX}60L*%_<5jwg9Nac_ zQPQbj#1h8Qv$bdVg{(3yOr|>4rEinoYLrQqDV9m>y<@LDD9R{&C)TEU6Nn@<@PbN* zO2Ry56e?p|c}{t;2)+nQmXG_qlD^cs06(Wq)VdUy63EsSE@z>(W zQI`EW>*VXU{kHvil+cui?xobx^g{vPzO%PG4CWeRC}XoM>y79`&w4F0l+z|9%(2Z|oP$rpBEzMFhUk;{ z>C^E07vI0zc;RyHsJrU*@jN4~F0K2Zc)se8{m}9-bRlb)HS1ZXCX4fU&wG&-#mxzU zCs~P%*30F7@*?tq<_+6V8H^d?)GKDHn+n`ZFAa~d`7ijLvex<6c{!Gtmo)W@)RWEsOX+eK2|OdYAwd1yF#QLxcwk1!{xeTzUDBc18RRbmSJR%9|F~@&{ygq0?`g(8h8^- zNo?*D3nI?TqSvBtMVHddndG^u=w7hV@R!nC@qXrLWo;Gcr#I6ap4Q0Fkg|~`;G(Cg zWVf^FSiU_t4PDDvd$R70oy_oF*TFMqwEOH;5mpI38ZGx*L76Z)&Ns(GC^W@bQ50X% z-6^8sJ-Z3J&B+)h*eAkfMRaJ0>NhcA%bA>GzJ(OV&D2uj@llR|A;!-V;^$%~!sA z3o{40@)``9%MFItAsP7mnBftX81vXknEtcW3m%*Jq4pm-Qx@LTmz4Fkn2ecyG~3x) zqRZ4qdRv;bm4sx6IQO|8aapbY;QT^to*`+3dcG~VQKTiWlef9uv}ka2ghxOnU*$~Y zT7~`a<6?v1%$425A-;F}1?&FwymtHL9sgj*yegQg?6ldm>5bG)-K9WfcSce~cX_^ywdm(WbvHWHHs?-tSkW%uu74(YAT%ek7&;ZiG81YKU9g0 z#o%`}y*D#Dkvx%;^ff7=)7GcpZWp+RTQ%R`-A~jp=)uCIccyl8(B;11PI#2Jj4Z$5 zL*h^UVDYWyTzS0cCIL4g;QD`I5J<38(Qwg_mEktFx1~2Uu{ScM_po&U z6`}wDuYiYxp|Q283yG1bxuqQ+*-=|38HuF{ADKFvETgQ0h^d98q?ePavX`8Sv6r8TiLGt%z1~QW0R9vk2$b`OkNTMODKq6xA zWJv9WMoYrX$i&9L$i=|KNXN*;&BVyf%t-Rb4;eo^NaA%e zG2>Pe75}3<(Es?zEL>b1xEUDS-QDTkS?KMZ%o&)txVRV?nHiXw=|CEE&YpHIh8}cw z&QE`L@~0nBQ)go*O9vNAdpnZvehrQ6U0wLd$i8><`18lSY#kmuvUC1}9f%@>hoJ)l z6FnotKN*=AKiW9BI@$a-G!tV6QyWuTQ#%)DkR8)M+JTVD%08O@V|TW;|7hv#BIX8~ z!5>8a(b8GP)4`NM$<*22)yddY%ndY>r~fo~XBQ>Yzu^9aE0Fp>I&%2)R_33_^?3O| zVsx=I`ws*8e&s)!nR;0M2ea>2emDCqrhZ>)UJ!L|5hqha7keiadwU!H-^2B<8!^y* z*!S=xp;ouFGqHDfe#Xo2cay&Y=Pz%jqJ}P}{2)sXP)O4;bEq&ebF*-AGqXPjMK~kl z4^Dp9{F@J1&?Yi5bTRxVFI=D<@}rl3(fzw0dlO4D&!6)0m*x*XOpLkB?44{4UHC0+ z4b4p%9PG?_8UAYgLG!oh<(9H@b}_UwHkA_P2Q|=JTAFYhnzD15vTzvE85$dL(U~!_ zGSYFG7#q?tv$L?VvoJC;Gcua}hC^2NNArJkEoyJ<`h5d|T>qYHOze$8?jHk*o7s$s zlZnlUmClrvlZ}pv$&{Uri`~eW&Ww$Tk&TtZh>MfO@XwBZaQ1H<$vatsQlX*E4?5rH zVgl-nlbzAn%*=?Bj+LFwgwBkWm4(j8n8S#Ui;11hh~0$M)QHjK&o2JK&A)XeY3U4# zJI^2D5fqibB|BwP$A4}8^MZ}#Z%NC+(8<~K`<~__`*Tx2X1T{C_TA>U+`w&U{5{?A z8-EXUQ_v9qrS-32JzD-@X8G^S`Ev+<_y2?Wf9}KG!qo1++9}-L%09gGME`Nu^MxL;*X0B6znEUtR{3^ z94st!W-P{r#)e#GhAbvVe=hU?=VkaY)BK-XhQFfN*uv1x+|-1h;m?`<+3>${<&5p^ z+)SPRJDUi!RSiK!k*Sk2znPQ0Es3FngN>!J;r9*6;AUs?M^*8d$4Ff4Nq$JSzjOb= z$N$E;nwUCS{&(W^hfzLaBKf~;&i~_``E%#p@5}mYXa0WT{GMt5_00S89R2q*@_Us9 zDi%b4k52LLd+K|l{(nCbL8lt1T;=|O`kzJ0&!*GAng7dP{KGq_Ecvre`R|ntzYp#Q z^MCSg|358Ge(&WU-2BzspX7f4{KFB*`6T5A4f$;8I~qva1*{;>Rg zlm2k`{991`-U_-m2R$vo@c6vI5ApI?Q~s|P{+iPNdf$&8e|7SR;%9_kxPFGxqs}i} zk0^dd_=W3dC_U=@!u5#aXM|t4eumPc&M#b#D1Juxh3jW1J?i|z^@!qUgkQLRhSHt`rE>ioj>h~j62U$}mT(xc8VT#qPzM)-y6XDB`D{KEB!;%9_kxPFGx zqs}i}k0^dd_=W3dC_U=@!u5#aXM|t4eumPc&M#b#D1Juxh3jW1J?i|z^@!qUgkQLR zhSHt`rE>ioj>h~j62U$}mT(xc8VT#qPzM)-y6XDB`D{KEB!;%9_k zxPFGxqs}i}k0^dd_=W3dC_U=@!u5#aXM|t4eumPc&M#b#D1JuxFLA;D^+|hEJJ84L z-9ewD=d5Gg0euFa#8^^E769;~0007l0f280phr-+E5puk9BA<;Kd>$ogT2b2y(`cj{v-ikhum}ofVn-s%*7L<;)`d($5%~(uPB)H62 zxgbh?@Yc6!O(p;m0&t;U#tVz_363eC0?s9xC>0hwG*H-pry6s%xr1aGJy@m_j0)#y z6A!{e*=w#BYXxcr-QY5qiv^Wi89x57KqgYZZN?@ zlcfZjLjhRpw*cGX#r5+Wd-xFWQdcJ{L^*F*gHlhwbB-RwfWmcJy9nSN@PS~P{{^(( z=!o{MIYd|vI*Q9WV$D}AkzrQE=`LEBo~h3)d+C9>j;?yz=zuD4B3!#WzXi_k%fxcb z8_UsqZSvG%GdvrAsmXFc1;Swl2Rbq5S$7G|ssRpHzCB=YSLgwg4Ox4Qplj@7|EJ|A zHq2vHZ;i<;OjghXumkr(zwr2DHyim1b?|lrsIuE&E7=g9Q9(?ps3pX{38O~LXhu*~ zOcg46Io}@g4p;`%GMF!Y#U;Z3#+o`J8(9>>hdwE|Zj|%YGfm5=7cT@AF)+k7C3l$M zJGpw*+b(iSt@KknAT{7_T_6MGz(+X*-RWXK-6wx8#oM*sP3Ck}Dzf!C-@%qi;l~Ue z;>x}(eGl)%D9VW;o|yQlZ8yL?a9f>jc#bQcvQKC`pv5zift^z(i-8;#JW1CFX@<5L zrEL1+rXyw|8}I4N%$1qHqdtS{x9gzWrclx^HvQyIhz@M65B2kb4_)*4Enhw?$X(8; zs>E4xkiI6AXb`~B9e-uo-G$=BxG-m;3B!xPTVrK7T7ABVgo`@mz_wqQ^=UNCzBwq8 zfwykNe$@eoi`LkEcD}x2Vz4gVZ47YpN{|VtQtr_RvH{QM0vvu;BYmr=QzahL{i;x4Nk?&VQeN z_1w0tncEy`E^mQ0IsJpc6XZ)Pz=s^h+MLPrYVZN%Ta)ST^ldIMi}Cuyh4wx;V8)%T z`KTq8`&C6wWnj<1ZgJ1>&5@rVXSwzV{yUH7G53d-tcts16i3WPa-nF)^zT5K2RV>= z#d4)~DFAr|nCa_*ubtmozCY-5@r_>Xi1%eDrh8f{#()^EaSEp^JcIo`d_amZdUaas zk+SSGEL70dE+4Df%&Pq{8d8WCcoxiiK1Co$F#yuPc`pYSa^=@Gh(%^ zz?^>mcHUJyFJa*8@$zynS-1|5D|icf0xpLi!9es|MU|OPONJ~`ut9o+H{UUsD+N*kgm;If9nQHQj(!gW#B!Wn!OH!+8~ zPg&6<#4xzE5O3qrW1*h}C`P({`;u@lHSHFa)|lc_t?PC&x6pjdOw{pUe*3j@KAD?~ zra8vkLM)>EwfIxbxdhL>yfIiBnp~3D3}(E}nV3l%;c3=Jf{Ly6r>Z{fP04G%Fj7*u z10S&O#pY`8XsqxQFdJUy6kG{1wKX1*@8wI$q;j`#G}V5O(Nr7&OmtA8pQ_wC_+Gz0k|#az!5Ie}zi_Dex~W1M``0l)=Yesz?u{pNbU+_Nx1sC8|a1Bq_ieZe970T;N)R%*rBiHkl#A>$j&&eQgF@Ms12Ll zDf)Colcq;jwnh2EASt_ik@Tncy;ktFMBW;v{k~n~Z-x?0#rjRy6_1c>+G+!9cezWW zRUMam{LQ*I!es_CgBA^oI&$LZvJUdw+u>DJOG+=5RGpGrOLy7PSJO{N_YdfJVQ#6Y z7!gA}@478Gs5NbiDOtuU^oCCTeFBx`_)ON7H2me|;rdDQ_~ey-qlT4;$h`9WH^DcN#k^`#vZ{zV2A8B3=IP#)X3{ZTNcvz5 z5dNACj78}HC9nq7Mnic<0pG> z$$UUcR8Z9G+D>aC9g3ra=Gr{N9p>~kE0V#!!tp)teh!Kcj6M>MFaT>jjckNjTG2@Q zhZuY9us$QorGvE`{l%_m-J98qz8RldSD5d^+#ld@J{~S{YjL6oDceUI>hUmgUW^(fhauK)E@RNYpOSA{*tCQR&W;n3 zs}4FlOTxPLuN;BJyRzYMc7E4+Vz%J@6p9=5Dat8q>*S5THEH{UmgE$zJn3!clf~pC z9|&GB$SY4%O{iCKJo9`{n&Kd-uRD%$vFXNDYz4)iF!*xBPDGil6q%UvX#K1~fuP}+K?)93&Yjb+wIw{NdI*T5AKa;yM}hQny}aas zT8?ILKiM(oVQRU_khkbo@bW|+6F4pKUcO;2ejm|b+2CPr@F6*Ua8-mt!^L4+u0Q%va4LEvG@wyoa<#R)e0r=gYoS z(7?)PJf#(IWbzL+0en19G;f2`92+8^$fm_EtiHKiz6+XTOapuzvht(? znD`0FA>-9DoFGEL;`rc%-8d8btC-H&9;&8$>{EKKtjV!-F)uUj6F55+)q1;EPFUzgGA1%#XFs*M;RkrTf?$u`z*b%uys$s_<@FuAOC>@VYAY&%m?-Yc2-u2P zUzDBqI30OS-6dFeBFLJ8B5Njt1oO7pLuY+5*K_CO9p?oP@F*YXPuumPPftb*u4qbQ)U&U1B-A^29E*`t*Bi+0^HDA8ne(c4 zIWfR4t(`ifSP-xv=t9IHfpwz-Z9CQgk0%~|uEiwM2s7po9J%InUl6zBAr%p7>2*`-z%sb*+mhDmcqTDTxgg~~W7tYtg^ypFNu`nUJctC{Rz4QJ`>9atVc zC=APb4U7Z!VF|>!495p)I22L?tg5mxSk0`ebtQQ0veUGwg;M<{D_c%bvR?2+!ogUDF@qNp+SbqJ`&gL?pBu*XSn;!9-P zaRwHuK5^#OCY`S$(VQS>D_(V&0%GDi!F1@yP{E{|hCKyrZ*S3cIQa_s*)q&$@(F`^ zh}bQy=~ptmSLaS?J_NI~vVXwIzquy#^1AR?!H00D0?!hUZEws+o_Ugky;LrNv5Tp> zSW#Rmty<41JDpyNRNWEyoOyHyZxCQ}(3$qcCpN9gLoXkS!TA(x9zl)??HPJA@|A1Z zwydc9hPO1;Knz|~npOj&`OKL9(i^1SDy?Ma=Av~Q7 zSYoNS^H0Xhro}UKPT+c}qPsD(0;V_n_Z9hV3q>jBZy)gBLfmt;;kPGTYZPt_-VK9r;stb+f6_1q*r|Fuh~+~>C^a=g3ZX>p zlibx+H$jv;%*0El$5i^v@SuUsra;-iS95XLpRj>et?7LHkZz)xOS_wzQYIzD*oC>4 zFOa)SP7wV#k18fAIljyEB_wA9iIOiA8^z5D0apOtm(v@bDuIy598u(@x9v|`<*bdbbFU?GwjF|rtUP{&4T5&$DU zdh#w>1HkU)91Z1xaAgOI3QS-t=r))wWb;gTrRrUV7*yoz{2g^cOTI&$4eIaWUL>-I5oWNs95)(8n%KPkUPyGoN@1MY|-(9HzPptIju-h zt`%m4+kV}7A2h{N!~7v%L$`TrSYnVfrQh}_8#+&osM;wRteSxwKK{!L#xxOx0RvBE zg0&Z7a$%(gEqd)@kY`FLDWj_{rBM?mJm>9G_~? zV|C~Xp0n0rUbd(!H{ILcIqF`8;sS06P@kse109=}>rvr=Ac|d};`x=RCtnr?ACK^{ z<&^!r;E2S7Frv#;pNu11)Q3Cv%Kas%c}S$Ar#ka3qMUAB6}=-i-u6K(U^j#2>+|P| z`ox~v=5N>HV84%CqT~x|8AMR#2#puEQ*$`a-C7t>y~d7Bbx&Uu@d`y0ZvKjvAVIDx zy;y>6@U?3)x;HU=F?1XIsid6yHi7pC%P@8ced3#GLw2HT(x8Zep2f8e>p=>~r;3nJ ze1oHxd9I|}QK#c%9uii-7@eXb+^951q&)f#qQRxy=O50euaFM9xGOK${I|x4#Sozs z+s~=_kt3>VzO|XkY!9}v3H82ZB3xdwefKUsq(jDHc0Bm9yrdZv%t2?Q5mG471Gvjj z*b6LZU{_dP8VPNk*l{{=$piA?QOchQ@|RqwI&v2|YYW}mSFaSwhq;lH@=>Wunkf*A z@(rNQYgutduUhmzqW-LP{Tte<$@ zUJZ8uj;BFuK+)qMLjX;Ai5HOT(C!ns^As)Mdu|1#jVuViCHqB&3ip&}kdVxE@|1mO zX7!q;Z!}HorHtQbQgr37?aM9Vq|{&2F`% zr{so)V zX3_$a?PEDSx-Gn=+AEB*7qwzt3&=NnP4s-kO+$k{{`cNTCgNPfJoX(UYmsu>8;Wov zoj2koQ&Zt4W68swlXV*B*DyBEc&Bug{dM(YJ6&-gs^zV+Ny7DH6*HIs;sdb3q{8R+ zbDf2OeV=aa)AJq0b&~N1u3H#-dXA_#j+ZU9Q@n|Zc zdF72%IhRg97dmbF+8bPZ)!ZYU{g-Y>42P#JH<3KiLjKhh`IA=cj?#gsOUIL+tLTeoxY_=Fz&EKu z-_|bQJ_*m;swxF7#lCNK<_-h0GX~7(1g%)G7ktpIOOq3q#U-}qqm#AVGVMYTK54j1 zQ^e*z$D9jC)zKm0)afRmGmzA)H8^aoU@R?j8i7Ax%-wg=-0?V&>U7RIJNa6i!M?ro zm464irl(8MyQ958T_o+$LtU5O*LPW1a>BaGhBBEIc?N@0+*!3f=C?haap);iIyvo#BB4%U~WU1 zm|o*}9cQv7`nvW%MM`Dq=uW0iW#4%T$Oh~71#JX*7(X~#h|ksJO+BBw-mf{$UVS;$ zC7`b&r}K2E9n_>VvupoqlkXc%p$PZ2|aNIoS3mm%N?^TSuPQGm-EJupw1T=yh;U1rY z67eP248)8lM9!1vySx`Q6;T-Up-cK{jedO%E!#}KFU+QhMH717gE44vhM8@+p~_+r zwXd5I-RxNt`gmvH#h8r&CtgLjoTiZ#%8pumjO$2bb=KR2g*MPX1H!L_kwk>DiScpQ z@L!>ql^d$6&_>)p+Z}Wn7^k;%_FY|Np2L^K4cOKIzxC?{uf{~d4=@if2c6>D!L_$A zE1?x!2Izbjx6-`64`{=MUm(ZIR!IUQ&`kViTn!Fe{fJte&Fd~QkmqWe!m1Ueq);H` zGT)4*u+)0`_E5E7ZHc$v0|efE!xOFP`{MM)f-4J)$maF}6PpftNiLO(0rJy} z1p@7X46P3+5NtU|te=eC!!h9z02(2T8Exk(9$sfYcdoU2X$fW^WeMefKfvu5@9wHn zsjlq@>0E7n{H(NJe|h$OW~~=!`YYZ~s(=ShD6p?2aarIaHIIT8oXwrb^88m{zs^$7 zUVhIf@S(?Q;A5G{47KssaKHgb0LMX1Uowh>MH$ z&b~YUeH5m@XU)jH{yk?*`u z1AR-jtV2HGilT~}uM2ZU4mYpWne0^NwJ2Zf5ntZjb9F5FhwUV=c&=XL`QwDWd}TH5XAR?G;K1tKwk-6Xm@ zjk%itT2P}8UE#H3o}%K+dyA&K=z-Bd zrQXUbU^+}~*K(n>mEo(EcItk_VAk`N;ajPL0EKB{G4yx>+QQV-j;l;L7E4lwKDcdWcF%=Q6g! zpAllYqB3XwcBG(!=}!_iXR`LK!T$7Xr+~$$8$JK38!?0++JqXDlroP^r!lyQE{~O6 zyWVeAfm;M*6c>)V>~9Ecw0#6o`>s|OnAqziJzrPJ!Zip=-aqvc%CobqX4VvI?=Nq! z4GHppH?!%dI(c>Inp8)!U9RVBt*SbAJ|YCaGz-jx=zEtTDmZrUn+xthVyO{%Sz78A z1~`T4L51Q+h6h}h`%3ZOmDjNeAzf;}oMe5iTJ|vb*`0qQh{eq5V=r73eqyo2JS+4qmPr8XD-!Sma*OTLp&l`x^;Frqbc-IVgPXcZSoNvg+9{uSoOhs#Tl zK=gPFF(!9&>Qk6tGk=oWLAqkAr-k|^Vg;==rw)^Xk{yINcz`#$b}@sK$*eX!pEvE$ zghF}WH6Ghg9XAoZ#<+=Qe~Isd$_4bb=f(HmxUS3_>VJ(lZBZxM81$^BQfZ8sQMg6_ zR1{s!O9q0;0)X%uPuJ?X0JjYojvN77I%jqZPq5VUotFt8m4Q1!NN1=iTyE z$&U1kCMno3$N|RE7@^J@ZuM3*C@*C2*a;ZL2eNJ&z;_rzAz>hQ+Y<`cmcI2>?^!&& zlzAuEQb<^}QD?H?m8NogTZd|ji!|+7VO6}nZ;}~+M*NA4MKA=$zLJOtEpCDD(t09e zS~&zBuqP6pcP#%N=$G#?>r%fT(Ic=V*^YU9$L)JUmjsptm=73}{;H0R__2a^r1`vY zFMukLt#3?VzM!usekDq>$BFG~SELL0B@BV8m}#mZHv+af3v8-JBm@H7gGx?FLDi-p zG}MQxOzk=1q}k4bym~763a>E)3CMi|a2qIRfbEqL#7FV1Y%llyo#@JdAoMZ8u|QAISV6TOu%$?Y4d&29!;6u7vjFvm;@Pgdu zYS~s)U}X@d!fxQwP&xQGmqAV=$wG`4I3S{&qSJtFrkcKp&l=Kzp<8FjK*K z1{YbcWwZ2ViIeK{7_opWO$x_SfNwg{#F{!Q+HR|ddOSudubWT&05+$N_R(`Fln+R* zsWn;&!Gn46>GA1PMmIIw1KAe$`)tC8sqWdH59$a6dH$=g10U${4~wx)_NwR+TEDFyj+1fcj!X);vMW0)gBdM zK2DRCWd#TW(JvFCs9f|!T$Ooa^Bd;|&*{3n%FCBqjb}3g+&`*pH0zlNqZEXIf?|CV zdzl$786rI}Gus0XB9ZJJdZqW|EHs9!LHF4cm_yTpMd{`oFm*HN)I!ow({4j3&9{ms z1?X6G+K@uP^^@qM*6G8p&65i|hk07GO&B-i&w#@xm+0QHsUeUsQ91(7t0~MCnkEg2 zM2D^~L#!HBGdN$Z%<^MKhQm+~>iYs2tII75###_bamv5 zDEc812^pMjvCY*1b4L9(zmA zmi9vxLZNDaIg&MYA=G>!&^E$$tA{M{B7##%M|3U+0z#`M|G8j@u;H{>T|`7~HuVdb z3DxpvA=wPf(o5P1oXCj97L`w99O23#%woFWHJy29@i++ot zs61WUy+96|KL^cV(|}3RFp-BouK~am6MCzPA=cI8PHbgsY4S1JrbmDIG*)U~%x_Ly zYzG~1lXsIMyVgMp23$)V^2L>YI|$(@n?+Nj?HW9U$imE&V|31rMr^YZaspOKux=dG z5}(%7u;5J+p2yEv#*9T_1E7s+nRbr^DkEbRk<~(bJK}s11^MX;o++<|?oS(p{!GBe!|wC)Q1}VhG5|kdCc$iUk69Y{5o!)S5)WBLI#mm` z>Z-qgNDmUIk9-qSL$sO6m-RVDPdwpifT4mY(|oKcl&0eO$kmc~Ll_D!Wu2e`fzF{h zlk|sm`vb34(ASd$pz{`xrV-c-xSC|_)o+Pg;Utu)Nkt4$Tx0eywedl8>%F!k9;mi<1=3!@~SBNw4brO)9J#sT3K{%O0gq;Pny zpP1gBHAY|UfZp)34w{G!jNX;kO{2NK|4EBYaO9|%06*7r2ZYEu84WlVrMFctDn+NV zk?9tki%VakKO+zXFDJWhC9Jy_Q)Dwy6;Wj3XETv~(BJ7cC9}*v3w(VZdc$S=mPkDc znFdg#eh?mm%qH&B{&e41>5i0gnpl`wYB-B0oI%*G@p{n**8z3>8at;74jl083a+Y-S&5edy4Jjia4FSiCN}J_W`})3WVQUh@q7Wl7Pn(WQD;gXKrNH?vq` zs6{<;8gEZ-f=4Vd!O+konD~v+(3xwKW8?ag9ZO(y!w6uH2SInGmu6gy;oy{t7RrY8 zdWu>>x6pw%eLNMHRa#9ftn~nDNk5l5@2WvVOP*J3SKS&`&y&TWruM}!MR&{XtZc$n z=HrVSDb{M5q3?4xqV3NyBv7(w;?oIISV%@Q#<%=I@0=m+%bhdnCNTflZRlAhfTH1Q zyM$~dpUS@{bY>8Mb1s;8?suWiabeef!Q}pW-f;1zSG$cUOp=4p1mJbUJ38+gB8A2s z76o_Dot~*xn;#qo{*wI3bfYM!_b6HX0S;0a2~+Dg#HDlq+uVMs3zVB~M-$k%LB59R zM8aNbSrPP?NVlqtX|m=iBbA#+cY8 z>*}x7NyYPV9R@R?lv>Xpgs>Rdy%yv2%uf#W)PMq&?l5n4sDzy(to)8)Dlr;2eQt+1cF2x2@xxIX*lzwIF2zg)^w8c-W zJE5X5&mCFxSws?iN}G)3;)7Fiu5X*_S;Nb;z?k5!akI7&JZK^aEH@`D?&Go0uUqXm zQ(yIO_m_fflcx4(86lbx7`;D4`ytpwblEu!nl?>w+HUE+qC#Yc*>@}n=EzrCx24I3 zTVESarT|OuCU|}N`MQIivu^#HTTx`lXOhh9poYW*c53Th%`OU>;YKzmuWaz>FK%x* z%U%wdb{V@(SU4(CYQv=-yc~8DR)Z;>7MH9=!5ZO<%nG@ua}NUxjB`mfbCn4RS|aqfU}&8Qk9fcLte}H z84Df~t7FDH6t>+)PYq;zS7vx5C+|CyZPYg zXcnJNSzd_6)RYpLDz<-;F(&IqVem|^n15F#_e;-IHnvGR%Q1hsmEvX6XrAC&||8&-~gY zOFwF9>O>JivEV1$Vm7c)&UGhTgsdmyq=0RWfSz?Bs|0;-URPrtFc&l^-dCCFmR?k$ zx*O;XF-AeFz}Q8ri+Q@jq+!aF#(Th#2d*KF7r{y{&_aE?3G&MKkp0mnW8bS^9Ap~qY3AUxTI?*% zs|0b)6z0N;#JbPVFDrUjTju$1<{%gnfzkq{b2WyT)d*Ku6>o7Ga>)#A^>5Zd+lKjg zR>af!9_bdzmrb0Z0;a|!%a+O>ObP>|OtZ8uSw=sNe6=cYO(5RPQ4HxJ=Z)<1hfvKcd{Kh+F#(;gZ z}MxSenMdV{~}1?(Um(bHz*uNu|} z0fH)DU#UMg`?{Bqm%Lk|&T6w;&UWo;U8M?c2zxzPfx2OQ{z_%a4^ZvuGOdueej+Z6 z;QyHzJ=2I)2Mh-X?5^=CyUTZ3gMIjB|6QTRI8L7hC%D5M;~|59*Ohvd5vvW@)f(eL z8Dn*^$L80?8bc7hC*Lc}CUB^p@+_;s=aK64{(S5vMyv~5BtYbV*FE_$dSG&NppBm~ z>kzJ3ztc>s&Gd1K0YD_7-^hZoL%7n^_dKan08Ou+qZkbV`5i{5TU!KqINy@DKH*6O z9)y89$r;4*m`3eB)QaKCFzGmPDB=mHfBue_T-mJIvzb`jfOwpVcb5aG#A@|8fHttT z8=xkr&dqq@1LJ$QkSx^Nj(qh2h2=rF-N|#f6FU!G7-kKo2$?t)2FyNW82mBRvDo#RwhfR70EsGE^G%sCC9D7N zbD$m>HzD7%2^HW{=ulx^m7f0F8k4yspnl+VT;;b&#VBzE!2AS+AZ0dHm+eIHrDYCK zUOLk+S5_}PieiY|0NU$S&S_v|;KaLjGv$oVWfNM>3-^^15YEmh#6+A71%Qmc&k!y! zLwCQUiQKTUuv4!CT}NcoME|ZEpNUg*rat!P=WP z@HJ5F%msRj^dwL~t^9dZg+k0k^+tgFM^73z0S9k^Giionnqw;vo!l02kliWKkx&?(GevkBCy z6(%Tj*^e*SIOwjH!x8&BnM)L(@zrM(k_6-Q0XV}}c#yAHVi9Ahy)_jsF-^B1KhU12 zBrj0YCBC``yIoe;DSze)BdmxrzZZB^rJ;W1WOLQ`o;3_8E$D9cP<_Xrgk}(-H2Ox6 zD}uync)##7hP#JP@m8R@-i;5n<#^k*=e?T21ZY)Zj71p4870M&K?AK~>8&8Xa4F9( z$q(60Ugb%DOYZGXryI-X341;>>X&{4>!63=!-U6*)a)YUhS#cmCvZJ0io?mO!fg$j zu?T2Iy#vA`m5WpL;OS7*o_w;QhaU*hiGn5w09}d%5&}hBXo=?VX>@8T75<+9ya_}0 z9%6mA1DG4hfk9cN+N+?b8ey~b$w<$OCY_Y3R{@YD0Z|xwCER;TOAnCjHut%#fU1F_ zo%!Qui_w7UfGgG&D!@mJ=4O2iTqudc z6q{MVZWghbM0%l$3`IwEXL)1fdcPt!1e8cBKm8iLRCSNEXl|CcW^++*!tcHWR`ud| z0R%x`?cC!;9lbC>L6D5P%^liQRm}r@&|ZiH2BJ>;agRb8&>HcJ=4RarJlF1xV=;-? z&3X-YbJy~@3^-P-D;#o`!=($d52L5R04M?$9j*;ofOm;3CB|iIHW$6qMW2mDPfT?^ zkOrK!W^++(wC?@4w_lZvzR>wv^h&=XP=a1U`;mK|di~HH-?}K#IOaNFiZM|iMGshi ztZdN?-4PD1~>c$C4cp=$s{ur2#zH+_E#J_vR zy29y0u|t}>4I#byET1_=4M?Ftcik=>jU7%HJgh{`w2cfdQs6-vm}y~kVwje z3?xZ1^e&as(xV)!C~qDxWmR6(?)_(BVCs`=Hy-Tfx1Cyz(4bbH<)64n)raQiM zQ3}JDq7Fb~_MbOW!51m5*{_&m?(V3URJD5?wAb#*AiMoU@JeWid;=c`m`Q z8^i!;fX@LudZL4`6$qaK{<{~ayami$v$<$fly9XO2(F~jxKq-Q%ogNOkcQI3gggy8 zOEX(An|017MHW4h+ReVS_CLhOx$)Q4P=DkQo{BO|CKKLJ+c`!Odp#u6VgPKRUv|?W zClvTvf$&lEjA`AG3@il}tl3;tH2}BaX_jqO70GNNE+q|XTmqV=;;pX0TUm~#DkzF# z=q(Yo+nvJZZT-(Er=5n8BFk*eFE7dUuK%M(d>SnfAfPbB6 z;A;iKhtStTc18z*bJuJxdSn3mr#X73uCBIO+;b$2#x*t-QIZJxJk%X6Zbn{Mj!63b zs+)a#jfn*SUnoqY3hvZ&Z1IT*qR8PRB^>}4mV52*|2hUhomSFy)@cb?w`gwG@)ssv~_?l-&_{_$kD?Df`JxGirs-bB^{H^PGcb0oc_-jkbBi` zd%EYT*K2{doBsEQWh!fH*}3a0_8<6$U0?5{s;aWhIiawE+`Bx2N9hU z!?CIgijGxM)u>CV!H_~A*dqYHLU-zSNB5$;D_S^QI81$gJ)uxX>D6#S_HgG|WN&xv{r2{&ZU$EOG}+fT25Iz#o&{b4*3xrG-^wS~ZoG3ifNanl z@r&kWN$B>r5{D_IGi) z6FQq18ataLj_lhhf3og{G+#rlr32s-*V{8504LItm zjwS8+;*@X}A(cGhy-! zobfH;pMI~0{ky)Ps=O3cRd6ScX7cn?NgR{h$3du4QL>){yFR0;v;;*}vBxEmkv)q^ z(`R9^+S;E$X>k$7`*!1PsKa8jlbn`G*2yz5nJwKiQv;Yjbn9=UF&WeXHO6OkyZ>u} z%G8wPs^bp8vhri2(Ie1jp+~|`LXZ3(+aH}#QDhDl?x66CE$sgMV=lTnk2x1Dh@l}y zLy1B_DR2ZmbnhGB6JSefN^)SZ0Qd@U8GWlX8>1MFG^zrAmzt8iV$ej;(z0?3dg9zB z4w!0e6IzLyNeul8yD^GUx6*hk5wzUcjv5?rpRpCCrX=^vKRaMXn9{OxS1T}%YNZ3Z zfOx|&;xG&$u2%mi7@u}ypECyL7)3|{W2;Axw(%LC4Xt#)21Ebz8~a-8dd=VaBUTOx z07jci%gP0Y`bH*FWz z9uEo|1F|b>q+_awP#5RaL!0b?L0WuvVOm1Z6uPj60(GsvH_&1^Ra$*|&?9KPt=bI( zzSNZD&~ThFdIi83#VAIDM`ElCVicp}NB@5Sl*Y>YVa&-g00000NkvXXu0mjfXg;0c literal 0 HcmV?d00001 diff --git a/assets/images/checkout-bg2x.png b/assets/images/checkout-bg2x.png new file mode 100644 index 0000000000000000000000000000000000000000..87adda555279fc251581ce0099f4d6580aeaaadb GIT binary patch literal 51000 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�Q!@tV35dMzZh+bN9UTfl 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 B;^F`R literal 0 HcmV?d00001 diff --git a/assets/images/checkout.svg b/assets/images/checkout.svg new file mode 100644 index 000000000..580d8bbbb --- /dev/null +++ b/assets/images/checkout.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/chevron-down.svg b/assets/images/chevron-down.svg new file mode 100644 index 000000000..3ae8b304e --- /dev/null +++ b/assets/images/chevron-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/chevron-up.svg b/assets/images/chevron-up.svg new file mode 100644 index 000000000..ff63bd5a7 --- /dev/null +++ b/assets/images/chevron-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/close.svg b/assets/images/close.svg new file mode 100644 index 000000000..9e64a2a42 --- /dev/null +++ b/assets/images/close.svg @@ -0,0 +1 @@ + diff --git a/assets/images/confirm-order-bg.png b/assets/images/confirm-order-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..72ff27e1f3e6af0386b325d2502a4cae601138d9 GIT binary patch literal 28185 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 M8VP$eZqlt3V;X5fz# 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 z + + diff --git a/assets/images/dribbble-logo.svg b/assets/images/dribbble-logo.svg new file mode 100644 index 000000000..89f2ce28b --- /dev/null +++ b/assets/images/dribbble-logo.svg @@ -0,0 +1,97 @@ + + + +image/svg+xml diff --git a/assets/images/edit.svg b/assets/images/edit.svg new file mode 100644 index 000000000..c81d49328 --- /dev/null +++ b/assets/images/edit.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/images/empty-checkout-bg.png b/assets/images/empty-checkout-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..f9252c0de247554626e9daa977db27458d486d7a GIT binary patch literal 10773 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�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 literal 0 HcmV?d00001 diff --git a/assets/images/facebook-logo.svg b/assets/images/facebook-logo.svg new file mode 100644 index 000000000..45c2ee19f --- /dev/null +++ b/assets/images/facebook-logo.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/favicon.svg b/assets/images/favicon.svg new file mode 100644 index 000000000..edda289bb --- /dev/null +++ b/assets/images/favicon.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/filter-icon.svg b/assets/images/filter-icon.svg new file mode 100644 index 000000000..faa47d97a --- /dev/null +++ b/assets/images/filter-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/assets/images/gallery-arrow.svg b/assets/images/gallery-arrow.svg new file mode 100644 index 000000000..3be1a489c --- /dev/null +++ b/assets/images/gallery-arrow.svg @@ -0,0 +1,18 @@ + +Group +Created using Figma + + + + + + + + + + + + + + + diff --git a/assets/images/github-logo.svg b/assets/images/github-logo.svg new file mode 100644 index 000000000..c8a7210be --- /dev/null +++ b/assets/images/github-logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/google-logo.svg b/assets/images/google-logo.svg new file mode 100644 index 000000000..800402771 --- /dev/null +++ b/assets/images/google-logo.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/instagram-logo.svg b/assets/images/instagram-logo.svg new file mode 100644 index 000000000..3f4f4ed61 --- /dev/null +++ b/assets/images/instagram-logo.svg @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/assets/images/linkedin-logo.svg b/assets/images/linkedin-logo.svg new file mode 100644 index 000000000..56f547317 --- /dev/null +++ b/assets/images/linkedin-logo.svg @@ -0,0 +1 @@ +icon-linkedin \ No newline at end of file diff --git a/assets/images/loader.svg b/assets/images/loader.svg new file mode 100644 index 000000000..a2457c3ad --- /dev/null +++ b/assets/images/loader.svg @@ -0,0 +1,46 @@ + + + + + + diff --git a/assets/images/login-background.svg b/assets/images/login-background.svg new file mode 100644 index 000000000..f3489b8b5 --- /dev/null +++ b/assets/images/login-background.svg @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/login-bg.png b/assets/images/login-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..651dacde17489a8deddbcde6f49d4e55a68fe571 GIT binary patch literal 7312 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¡`l7lq4rU}_A57Z8I7x!lip+ucUM25peqIhkbg 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 literal 0 HcmV?d00001 diff --git a/assets/images/logo-dark.svg b/assets/images/logo-dark.svg new file mode 100644 index 000000000..309d7c895 --- /dev/null +++ b/assets/images/logo-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/logo-light.svg b/assets/images/logo-light.svg new file mode 100644 index 000000000..60f632623 --- /dev/null +++ b/assets/images/logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/logo-white.svg b/assets/images/logo-white.svg new file mode 100644 index 000000000..d01d84844 --- /dev/null +++ b/assets/images/logo-white.svg @@ -0,0 +1 @@ + diff --git a/assets/images/meetup-logo.svg b/assets/images/meetup-logo.svg new file mode 100644 index 000000000..8bc2c38b9 --- /dev/null +++ b/assets/images/meetup-logo.svg @@ -0,0 +1,72 @@ + + + + + + image/svg+xml + + + + + + + meetup + Created with Sketch. + + + + + + + diff --git a/assets/images/mobile-menu.svg b/assets/images/mobile-menu.svg new file mode 100644 index 000000000..cf6d6688b --- /dev/null +++ b/assets/images/mobile-menu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/no-results-bg.svg b/assets/images/no-results-bg.svg new file mode 100644 index 000000000..26f94ff44 --- /dev/null +++ b/assets/images/no-results-bg.svg @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/not-found-404.svg b/assets/images/not-found-404.svg new file mode 100644 index 000000000..3d240f77f --- /dev/null +++ b/assets/images/not-found-404.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/pass-invisible.svg b/assets/images/pass-invisible.svg new file mode 100644 index 000000000..454002a2d --- /dev/null +++ b/assets/images/pass-invisible.svg @@ -0,0 +1,19 @@ + + + + + + diff --git a/assets/images/pass-visible.svg b/assets/images/pass-visible.svg new file mode 100644 index 000000000..7c71d26a5 --- /dev/null +++ b/assets/images/pass-visible.svg @@ -0,0 +1,15 @@ + + + + + + diff --git a/assets/images/photo-icon.svg b/assets/images/photo-icon.svg new file mode 100644 index 000000000..57ee59835 --- /dev/null +++ b/assets/images/photo-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/placeholder1080x1080.png b/assets/images/placeholder1080x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd6bf607884b0053871e710d0a2e526e1e6147a GIT binary patch literal 31718 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 literal 0 HcmV?d00001 diff --git a/assets/images/placeholder255x255.png b/assets/images/placeholder255x255.png new file mode 100644 index 0000000000000000000000000000000000000000..90451c5134a733aafe3d9a5377f474c16b72fb8a GIT binary patch literal 4710 zcmeHK`#+QY{~t+94oMLui&EXOl@(z&MIi}ErD)D;GN(B<+Z07b=s+XJr-O3H?GU%q z9MWxt?Ji0TE2m*tHpcAqneO|0e?Omp;PcacJs$7t{k~q;^YwhbUa!aNeZ3#oZI{z_ zDoQ#^002P6!QS?aY?iJLprY&!2Le6-017H-8ygn~8yk>IL}(y7H~;`Rl9uM~b!EHz zW_SY@Ww49p7JTStxwUAWp0+!%z16BWio9M?{U~zpjF!8$lBtK7zPN+$J6U_sx*c-ux9@&^Z?SMf8ai;y zXrw1)t-D)LO7_O|u6N5Pl!XU>{emoT3St*ej{nOyH)^P$B8=lBA!Ayv+~i^27STy$ zcoN6QQ@H=|Zq|3#cE{rT*+tl(DXuLVi~E z=FUz6E6J2+G-8}WH)DNpYyDbM{NUY_*68-y!xy<+ONEx(^_OzyJ0gS_w|p*ZeEM)s zCoaxbw9*)7&&NlQ&1a|LCwWO(#_L4SvmYjIX-`Zc7M?iDXN^cI22XBWqaCC(?mz_J zf2w*3GU|nSF-dn+)-vnWbJS$7Tt8DFwXM1vkx=fTSmK(R<~(3rH_aBfzN2ZyljCoi zmRu)NRI1jm-TU}Ja+8wNg*EE_d#x3jnqRNHN>o)e*<7|+`wp@&P-`2j1;(|gCUv(` z+8#=%RAi#yH(K>C{>ktgnw2`Dd!?E^0rMp{J^eHg1S2zfgrPQQQ-31;vWWvfGu%W@ zKkg39iT_}GrG`Ie!a%E-*MW<)!${ya^96tG1m{QaV!XWxip=jUr9IxcoKRGxY}6MO+1T_<amo!kxXw}WMkKgdEcWH*-ykZhd z5cf_Ewqr|K#tCoCEc2R~oX9V5YiS7pl}3~+AjiAAcuPWM--q>K_8wROV1vf$kOSmA z*$M#2d7#f;h`iu*%EB)c1NQL`^$h^WV!~u-000(iAzNYsB7H!ynBWksMXZ(nPlSbR zy=sQ&gMLCHuUhF}aB>0Jghm8_4ucPY59q^{Kp+q-!avaBjO~fP++|Nz`d1<&!z>_> zn3x!F3=|w1fr1<~H#dhIFoBqu7|RgG*tn2LpIGA%tihio|Hoq+fc1+&hee`8LqMy% zKE9z*kyiTpt3rQYf5sV!4*Y+m5bR%R$r6ODzJVMBAAtPLEpvsfS}mL-&;c^#RetzE z*iYnt+5XajK~}~8BbYxk{b`k@3Ri+b{w^C_=~UYu4*)sS{&1PB~8Ai)aM za>b2%cUwz7wQtxa$1Rcj$K{`j{jVD)#&PtulJHB}C0vJ)Kg(#Ut!S+WW)Qsu1Hvnz zOiGhL$Z0l{ig@(rwcXy~ELt80m)P>WqU`lf!TIb;vFh>?lgNY-CGl0|?PNT^f8yg) zJH}COCT7Xs63n^3&|v0w?s|5)>wWM&Dom8f;scS_*B;7y!{ zR8c2>hLOzgb50QT(U(u+Qtb8a^D6V~+A|MU#nBA8PpT5*o|O-gBpG-;_G8Gl+~{O= zkkn@oK7Gz$w$L(dFjLH4Z|43Zi zfg7fjTEgYHdgQ713r99h)C)_>DFgA`_j?$Axr^8W?X7b|4YhSdsU&)1EPtloFx^P2 zTQoH)v*xZ-+Y!uh^as?voSo_5p=A-E$49T&X_!NCMB!|0E`+k|Yx$O?>>W5Y4#wkY?41&JLYfCv<L@PP{U((h*Y8@ci)wky01| z7)in@aH4$QrELO9(?$>y8q|@cgMh{)r9V_($VL(b%(TX?1$9Eq`<4u7qUf2~2wmHH zPRl>+>lWCWmKncV2*;V+B5D41MEp1?{lGESS*yyxjVYydclG9ZaB_gTv#6BLLT8f* z&rUNIvgtGi?G=GqhTSQ(;6=~5+R?g}%`tke*kVMVs467C=s_HrrMwkQMgTwDkD3Y% z(V>~TaBvLC1K#lGvd~t3@MNf1Wug@TU zp0dRK$czsZ+i#1rTS1eS1l{;RE<&>GCwz4I^?VOu;NA}d;+G=kLa2bVG3+e|alaFo zvn{TZz2eD9r)mTajGqCmvG%8_;qqZ|l~$k0HBg|xFfNb4qc$a=&G6SQ?~$_+{7iw~ zwcUqR!8m|18D(9q7pa1nA6bjR4Z#Tfn0XtyFR*`@9VP3NdhTND)9yu~QRZT!_B9Hn zb4h>@FZA&DHw|{vSB3)m?GzINqz#xRq@EnN9D>r?5k8jMZh!%=$#PVn)j#2~LI@$# zz8?vbfnIpzRArYutWd#p1 zJ=?K{yf_u3m=&KQ^ANjh za@VOk0_;HkRX#9JZ$Y#?n$EZ?^kgHe{c{B+loWDqf*>1D6F$wqyYef+N`cy(@9DK- zkIl=^y(ZX!kouojOn{*PDP3{?hUBY~!R6dmeH74uKv2sdycl|}X8qP(w#k0^RLwj} z+eeV>y!WKdZpM6^&K4NtWm?SgEYgig^VnM(=UHdGn+^WBrXo|gWuzOH+9?MjGRfrm zz*~Cn?L_ME2I_7b8gPR7BiD4@%&_5pkhNsXuBkt4x&Rrw5o7P28bmmpz|JCz_)Mb} z+Q7nzy7)ZIQNXbz@$gPw*Mf(v6E#56 z^{nNga$c>SmQQvOD|tKDo=o6UPaz!Pmk4mS8vZoWV?yu;AvmT3}&SrbZj1I_cSX2xIOwxqL%5y9sVAFM%}4&VZ$RhBv&Twc{WR$%R?)00+M2Q^mdG zi0nPy6V0%aZRomkYhexIoQv5Trk^g+4-vvP4fN^)HX2wH0urqE$#Js{FMkDQAXPvv zClf@^Z)=&#kDXrwe7FfjM33A|0|-6?KBL-tV8Vno}) SH&%c69FCv1eSOUP#=ilOpw4{& literal 0 HcmV?d00001 diff --git a/assets/images/placeholder540x540.png b/assets/images/placeholder540x540.png new file mode 100644 index 0000000000000000000000000000000000000000..409d9bee0c9d6459b7cc1b740341c575754348da GIT binary patch literal 11505 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 literal 0 HcmV?d00001 diff --git a/assets/images/placeholder60x60.png b/assets/images/placeholder60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..a2efcc0bf8cbed584d502a13dab4c7195e578943 GIT binary patch literal 2284 zcmY*Zc{~(c7akfyNH3;%c};^-m|P?j=C zi>1>wCZZ`<;8wJ@+}!bI$$aoU^kzDkdT;0ssKSP{+(2c&E{p z2?_Fc1MWBx004@i&CKjjW@cbJB0d<62?7B0GBcgML*<;M5FMltMWta!%%K!=m5G?L zSf0xvTFagI*ROSORFuvHWFe6KX}Iv=u%1@O2F=#OE>?4?M5^y@TLM_+>&{6;3+$qZ z^2Bqn3ZmtElHEc^<#LgsRuTG6@;K53(2V!y9H^k_VTLUH>~(|Y+K4GvfEZ+>63BQ2Zn z^L6LP5qziDa}-RLJpN((FSKcz_Q6iK&jh^cB_ZN6(ZTQ3W=GQmoE^i`3M8@z`@bVa zIhqYGeJZTOma7-$FZ-9AdR@^-VES#AV|zkVSlHg{BSqziWTu}NM^#&yF=O9nS)E&s zqOVQcV`aqoo-~!&Xa4B3}mj49miOl zFw%Xw(Rp6Wp|Zr{wSG%Sh3^logH~RSuWHrAThA&!KEM(1?&99}Y4loD)3tA%mAQ1s zb$HEZZJ7&at8&AxPRGA<{nADp@EGi9vg-YSaU(@K%VGuRK%bu$^`GmPXN7-x=eiRa zM}1hts9*Iqa>ql(k+lT^>tSmyGB%m!wW~?1sV!<<`zb0L_q&EDk0?WwVM>oTe~#hf zOLN^bP=W%<=RP}(CF}7v1{A%gEo6~;viA61MU3=6AR=97#@-LUvR_mv;E4TLBDHRr z11g7=8Ow_YD7?SU@#==U@SWo{@~>KNIy*Zp67mnoyWp+$x(`d9S27DcpReQet=*MH zgIu(ocR))x8ahheXncNnXKHh0L2KKxeaB093hz z!~sRzo{>k}-w5cjk|&xbd*pMD#qOAX{_O+%?m9dwZsYmlR3E99p`LI{*YMKaw@mU& zgz1kOKuBghUqyMWvz_lIo;M$a3CG+?0Kg8(E#m_em+k=o_}tM>Ze%xWD}w+$7U~y> z_YZmHY@LX&V*$*6r#o$N=QO1y;2m_wK6^22;KOy9k#t=7aJFpp^7zEaa z9)fB>5F%hO*oYVyY~Wyy{GHCb8AC$JWP$+<78w}{jnsnTi6JmeeSLkH1{?;5tMd@* zq-Y%3FG?LpQv5~oUmo)yQUDQ6Afxd(@D{J1KmHWi7y{W6`m=u3Nk#|%PYFl*-4?Gw z*wzb76RH9G!_7-I+KL+36460CV1K?1 zA!0?}?+yTL1Eb6jJB12-EIfx>(vYx_XFF7lrGNiXZYKSNKgdU6AT(+h>R`2KR{n&; z(zG(WD8`ruWUX;An|24ddtEY?5?MFfUB^^Qn}wn*8CFk(vRw84$}QE7N+InF1rDgn z38RK(JL&q8htAANXC*6zh$$Bs9hT^WMj|>m7at01RG7+V9}S?*bTo|KXB?sVG6SyA zrm6%7EAt*LlHpgLKKKyPq5AptJzU$#rLTAVrn+_rrB`lyp3pY=(OT0!tJu`)x?{6P zomHb-OTbkHoYRlZ%~pz^Z(?BFjjOHJl2khv!a5oef6W)ZKNP_a7U3ieZ2K z`hp%88(V1E-7wdHpeSig3yDPRZvT3k(veLeq$8!LKd%H(YnckF@%Q)G>qwlLrXOt|P`6}jL^cq*ph>EIE zZHNyQCGN^x;g@T3pGe>nuV|p>Ua<2VhEXH!%YxAfYe(QELu&bfVZOpZ3XnFsI93dN zf4NFUE(BcxnAHZ7YhE<9daHqSIo(}dM$qTVSEWTX>s z%W@Ye6uVMZCE2!D7$|XmTQPIcWQdmi?N%^q<83bH{ZrQd=|PULOPQthg_iVm`b5dI zGZ`_%tWp1|YMIvPY0)HRAiBOGPa~u~%~h{=+R%MM^@Gx&40Kj{SmV15l`Uc@Ogftp sm7*ouop-H^ZbL7fft;B6SK0#;mHvX*fmY=+TVn@hVPk&ti0_&I0Ff*raR2}S literal 0 HcmV?d00001 diff --git a/assets/images/reset-bg.png b/assets/images/reset-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..3e824a03467b14e20195f4428db7b0bcd4e272e1 GIT binary patch literal 5864 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 yyOk%LrVYqrsn^4;Wz7~sDpbC%blJ!M7hnJ+_@6 + + diff --git a/assets/images/sample-product.jpg b/assets/images/sample-product.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1db06734fb0647198e634cd79b0d167ac65cb131 GIT binary patch literal 26849 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 E0zR(F8vpfoG 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 + + diff --git a/assets/images/twitter-logo.svg b/assets/images/twitter-logo.svg new file mode 100644 index 000000000..2fa8be814 --- /dev/null +++ b/assets/images/twitter-logo.svg @@ -0,0 +1,2 @@ + + diff --git a/assets/images/what.svg b/assets/images/what.svg new file mode 100644 index 000000000..52ca6ab45 --- /dev/null +++ b/assets/images/what.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..a8fca2178 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,32039 @@ +{ + "name": "saleor", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@apollographql/apollo-tools": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.3.5.tgz", + "integrity": "sha512-5ySiiNT2EIwxGKWyoAOnibCPUXvbxKOVxiPMK4uIXmvF+qbGNleQWP+vekciiAmCCESPmGd5szscRwDm4G/NNg==", + "requires": { + "apollo-env": "0.4.0" + } + }, + "@apollographql/graphql-language-service-interface": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-language-service-interface/-/graphql-language-service-interface-2.0.2.tgz", + "integrity": "sha512-28wePK0hlIVjgmvMXMAUq8qRSjz9O+6lqFp4PzOTHtfJfSsjVe9EfjF98zTpHsTgT3HcOxmbqDZZy8jlXtOqEA==", + "requires": { + "@apollographql/graphql-language-service-parser": "^2.0.0", + "@apollographql/graphql-language-service-types": "^2.0.0", + "@apollographql/graphql-language-service-utils": "^2.0.2" + } + }, + "@apollographql/graphql-language-service-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-language-service-parser/-/graphql-language-service-parser-2.0.2.tgz", + "integrity": "sha512-rpTPrEJu1PMaRQxz5P8BZWsixNNhYloS0H0dwTxNBuE3qctbARvR7o8UCKLsmKgTbo+cz3T3a6IAsWlkHgMWGg==", + "requires": { + "@apollographql/graphql-language-service-types": "^2.0.0" + } + }, + "@apollographql/graphql-language-service-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-language-service-types/-/graphql-language-service-types-2.0.2.tgz", + "integrity": "sha512-vE+Dz8pG+Xa1Z2nMl82LoO66lQ6JqBUjaXqLDvS3eMjvA3N4hf+YUDOWfPdNZ0zjhHhHXzUIIZCkax6bXfFbzQ==" + }, + "@apollographql/graphql-language-service-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-language-service-utils/-/graphql-language-service-utils-2.0.2.tgz", + "integrity": "sha512-fDj5rWlTi/czvUS5t7V7I45Ai6bOO3Z7JARYj21Y2xxfbRGtJi6h8FvLX0N/EbzQgo/fiZc/HAhtfwn+OCjD7A==", + "requires": { + "@apollographql/graphql-language-service-types": "^2.0.0" + } + }, + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.0.tgz", + "integrity": "sha512-7pvAdC4B+iKjFFp9Ztj0QgBndJ++qaMeonT185wAqUnhipw8idm9Rv1UMyBuKtYjfl6ORNkgEgcsYLfHX/GpLw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.0", + "@babel/helpers": "^7.2.0", + "@babel/parser": "^7.2.0", + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.6", + "@babel/types": "^7.2.0", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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 + }, + "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 + } + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz", + "integrity": "sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "esutils": "^2.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-call-delegate": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", + "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.2.1.tgz", + "integrity": "sha512-EsEP7XLFmcJHjcuFYBxYD1FkP0irC8C9fsrt2tX/jrAi/eTnFI6DOPgVFb+WREeg1GboF+Ib+nCHbGBodyAXSg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + }, + "dependencies": { + "@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/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/helper-define-map": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", + "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "@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/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", + "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz", + "integrity": "sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "@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/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", + "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz", + "integrity": "sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@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/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "@babel/helpers": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.2.0.tgz", + "integrity": "sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A==", + "dev": true, + "requires": { + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "@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.0.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0.tgz", + "integrity": "sha512-RgJhNdRinpO8zibnoHbzTTexNs4c8ROkXFBanNDZTLHjwbdLk8J5cJSKulx/bycWTLYmKVNCkxRtVCoJnqPk+g==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.2.1.tgz", + "integrity": "sha512-/4FKFChkQ2Jgb8lBDsvFX496YTi7UWTetVgS8oJUpX1e/DlaoeEK57At27ug8Hu2zI2g8bzkJ+8k9qrHZRPGPA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.2.1", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.2.0.tgz", + "integrity": "sha512-yrDmvCsOMvNPpjCC6HMseiac2rUuQdeNqUyPU+3QbW7gLg/APX0c/7l9i/aulSICJQOkP6/4EHxkcB4d4DqZhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", + "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.2.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz", + "integrity": "sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", + "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0.tgz", + "integrity": "sha512-Gt9xNyRrCHCiyX/ZxDGOcBnlJl0I3IWicpZRC4CdC0P5a/I07Ya2OAMEBU+J7GmRFVmIetqEYRko6QYRuKOESw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", + "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.2.0.tgz", + "integrity": "sha512-WhKr6yu6yGpGcNMVgIBuI9MkredpVc7Y3YR4UzEZmDztHoL6wV56YBHLhWnjO1EvId1B32HrD3DRFc+zSoKI1g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz", + "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz", + "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.0.tgz", + "integrity": "sha512-aPCEkrhJYebDXcGTAP+cdUENkH7zqOlgbKwLbghjjHpJRJBWM/FSlCjMoPGA8oUdiMfOrk3+8EFPLLb5r7zj2w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@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/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz", + "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", + "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.2.3.tgz", + "integrity": "sha512-xnt7UIk9GYZRitqCnsVMjQK1O2eKZwFB3CvvHjf5SGx6K6vr/MScCKQDnf1DxRaj501e3pXjti+inbSXX2ZUoQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", + "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", + "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@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/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", + "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz", + "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", + "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", + "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz", + "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", + "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.2.0.tgz", + "integrity": "sha512-h/fZRel5wAfCqcKgq3OhbmYaReo7KkoJBpt8XnvpS7wqaNMqtw5xhxutzcm35iMUWucfAdT/nvGTsWln0JTg2Q==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", + "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz", + "integrity": "sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + } + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", + "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.3" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz", + "integrity": "sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "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.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.0.tgz", + "integrity": "sha512-7TtPIdwjS/i5ZBlNiQePQCovDh9pAhVbp/nGVRBZuUdBiVRThyyLend3OHobc0G+RLCPPAN70+z/MAMhsgJd/A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", + "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.2.0.tgz", + "integrity": "sha512-EnI7i2/gJ7ZNr2MuyvN2Hu+BHJENlxWte5XygPvfj/MbvtOkWor9zcnHpMMQL2YYaaCcqtIvJUyJ7QVfoGs7ew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.2.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", + "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/preset-env": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.2.0.tgz", + "integrity": "sha512-haGR38j5vOGVeBatrQPr3l0xHbs14505DcM57cbJy48kgMFvvHHoYEhHuRV+7vi559yyAUAVbTWzbK/B/pzJng==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.2.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.2.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.2.0", + "@babel/plugin-transform-classes": "^7.2.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.2.0", + "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-modules-systemjs": "^7.2.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.2.0", + "browserslist": "^4.3.4", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + }, + "dependencies": { + "browserslist": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.5.tgz", + "integrity": "sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000912", + "electron-to-chromium": "^1.3.86", + "node-releases": "^1.0.5" + } + }, + "caniuse-lite": { + "version": "1.0.30000914", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000914.tgz", + "integrity": "sha512-qqj0CL1xANgg6iDOybiPTIxtsmAnfIky9mBC35qgWrnK4WwmhqfpmkDYMYgwXJ8LRZ3/2jXlCntulO8mBaAgSg==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.88", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.88.tgz", + "integrity": "sha512-UPV4NuQMKeUh1S0OWRvwg0PI8ASHN9kBC8yDTk1ROXLC85W5GnhTRu/MZu3Teqx3JjlQYuckuHYXSUSgtb3J+A==", + "dev": true + } + } + }, + "@babel/preset-flow": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.0.0.tgz", + "integrity": "sha512-bJOHrYOPqJZCkPVbG1Lot2r5OSsB+iUOaxiHdlOeB1yPWS6evswVHwvkDLZ54WTaTRIk89ds0iHmGZSnxlPejQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0" + } + }, + "@babel/preset-react": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", + "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + } + } + }, + "@babel/preset-typescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz", + "integrity": "sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.1.0" + } + }, + "@babel/runtime": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz", + "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==", + "requires": { + "regenerator-runtime": "^0.12.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + }, + "dependencies": { + "@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/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "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/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "@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/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" + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@emotion/cache": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-0.8.8.tgz", + "integrity": "sha512-yaQQjNAVkKclMX6D8jTU3rhQKjCnXU1KS+Ok0lgZcarGHI2yydU/kKHyF3PZnQhbTpIFBK5W4+HmLCtCie7ESw==", + "dev": true, + "requires": { + "@emotion/sheet": "^0.8.1", + "@emotion/stylis": "^0.7.1", + "@emotion/utils": "^0.8.2" + } + }, + "@emotion/core": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-0.13.1.tgz", + "integrity": "sha512-5qzKP6bTe2Ah7Wvh1sgtzgy6ycdpxwgMAjQ/K/VxvqBxveG9PCpq+Z0GdVg7Houb1AwYjTfNtXstjSk4sqi/7g==", + "dev": true, + "requires": { + "@emotion/cache": "^0.8.8", + "@emotion/css": "^0.9.8", + "@emotion/serialize": "^0.9.1", + "@emotion/sheet": "^0.8.1", + "@emotion/utils": "^0.8.2" + } + }, + "@emotion/css": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-0.9.8.tgz", + "integrity": "sha512-Stov3+9+KWZAte/ED9Hts3r4DVBADd5erDrhrywokM31ctQsRPD3qk8W4d1ca48ry57g/nc0qUHNis/xd1SoFg==", + "dev": true, + "requires": { + "@emotion/serialize": "^0.9.1", + "@emotion/utils": "^0.8.2" + } + }, + "@emotion/hash": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz", + "integrity": "sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ==", + "dev": true + }, + "@emotion/is-prop-valid": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.6.8.tgz", + "integrity": "sha512-IMSL7ekYhmFlILXcouA6ket3vV7u9BqStlXzbKOF9HBtpUPMMlHU+bBxrLOa2NvleVwNIxeq/zL8LafLbeUXcA==", + "dev": true, + "requires": { + "@emotion/memoize": "^0.6.6" + } + }, + "@emotion/memoize": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz", + "integrity": "sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ==", + "dev": true + }, + "@emotion/provider": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@emotion/provider/-/provider-0.11.2.tgz", + "integrity": "sha512-y/BRd6cJ9tyxsy4EK8WheD2X1/RfmudMYILpa8sgI3dKCjVWeEZuQM17wXRVEyhrisaRaIp1qT4h0eWUaaqNLg==", + "dev": true, + "requires": { + "@emotion/cache": "^0.8.8", + "@emotion/weak-memoize": "^0.1.3" + } + }, + "@emotion/serialize": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.9.1.tgz", + "integrity": "sha512-zTuAFtyPvCctHBEL8KZ5lJuwBanGSutFEncqLn/m9T1a6a93smBStK+bZzcNPgj4QS8Rkw9VTwJGhRIUVO8zsQ==", + "dev": true, + "requires": { + "@emotion/hash": "^0.6.6", + "@emotion/memoize": "^0.6.6", + "@emotion/unitless": "^0.6.7", + "@emotion/utils": "^0.8.2" + } + }, + "@emotion/sheet": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.8.1.tgz", + "integrity": "sha512-p82hFBHbNkPLZ410HOeaRJZMrN1uh9rI7JAaRXIp62PP5evspPXyi3xYtxZc1+sCSlwjnQPuOIa6N88iJNtPXw==", + "dev": true + }, + "@emotion/styled": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-0.10.6.tgz", + "integrity": "sha512-DFNW8jlMjy1aYCj/PKsvBoJVZAQXzjmSCwtKXLs31qZzNPaUEPbTYSIKnMUtIiAOYsu0pUTGXM+l0a+MYNm4lA==", + "dev": true, + "requires": { + "@emotion/styled-base": "^0.10.6" + } + }, + "@emotion/styled-base": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-0.10.6.tgz", + "integrity": "sha512-7RfdJm2oEXiy3isFRY63mHRmWWjScFXFoZTFkCJPaL8NhX+H724WwIoQOt3WA1Jd+bb97xkJg31JbYYsSqnEaQ==", + "dev": true, + "requires": { + "@emotion/is-prop-valid": "^0.6.8", + "@emotion/serialize": "^0.9.1", + "@emotion/utils": "^0.8.2" + } + }, + "@emotion/stylis": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.7.1.tgz", + "integrity": "sha512-/SLmSIkN13M//53TtNxgxo57mcJk/UJIDFRKwOiLIBEyBHEcipgR6hNMQ/59Sl4VjCJ0Z/3zeAZyvnSLPG/1HQ==", + "dev": true + }, + "@emotion/unitless": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.6.7.tgz", + "integrity": "sha512-Arj1hncvEVqQ2p7Ega08uHLr1JuRYBuO5cIvcA+WWEQ5+VmkOE3ZXzl04NbQxeQpWX78G7u6MqxKuNX3wvYZxg==", + "dev": true + }, + "@emotion/utils": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.8.2.tgz", + "integrity": "sha512-rLu3wcBWH4P5q1CGoSSH/i9hrXs7SlbRLkoq9IGuoPYNGQvDJ3pt/wmOM+XgYjIDRMVIdkUWt0RsfzF50JfnCw==", + "dev": true + }, + "@emotion/weak-memoize": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.1.3.tgz", + "integrity": "sha512-QsYGKdhhuDFNq7bjm2r44y0mp5xW3uO3csuTPDWZc0OIiMQv+AIY5Cqwd4mJiC5N8estVl7qlvOx1hbtOuUWbw==", + "dev": true + }, + "@endemolshinegroup/cosmiconfig-typescript-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.0.tgz", + "integrity": "sha512-qMbu0alhP2VmxYhO9rwJDAEDhBIa2lN+aRxRTBbvvk1sxuzAj3RZNuvtlKkM8CPBlE9PBAjCV3l5opXP1wPIZw==", + "requires": { + "lodash.get": "^4", + "ts-node": "^7" + } + }, + "@heroku-cli/color": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@heroku-cli/color/-/color-1.1.14.tgz", + "integrity": "sha512-2JYy//YE2YINTe21hpdVMBNc7aYFkgDeY9JUz/BCjFZmYLn0UjGaCc4BpTcMGXNJwuqoUenw2WGOFGHsJqlIDw==", + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "strip-ansi": "^5.0.0", + "supports-color": "^5.5.0", + "tslib": "^1.9.3" + }, + "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==" + }, + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.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==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@jest/console": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", + "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "dev": true, + "requires": { + "@jest/source-map": "^24.3.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@jest/core": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.7.1.tgz", + "integrity": "sha512-ivlZ8HX/FOASfHcb5DJpSPFps8ydfUYzLZfgFFqjkLijYysnIEOieg72YRhO4ZUB32xu40hsSMmaw+IGYeKONA==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.7.0", + "jest-config": "^24.7.1", + "jest-haste-map": "^24.7.1", + "jest-message-util": "^24.7.1", + "jest-regex-util": "^24.3.0", + "jest-resolve-dependencies": "^24.7.1", + "jest-runner": "^24.7.1", + "jest-runtime": "^24.7.1", + "jest-snapshot": "^24.7.1", + "jest-util": "^24.7.1", + "jest-validate": "^24.7.0", + "jest-watcher": "^24.7.1", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "@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/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" + } + }, + "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 + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-diff": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.7.0.tgz", + "integrity": "sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "jest-matcher-utils": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz", + "integrity": "sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.7.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-message-util": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz", + "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-snapshot": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.7.1.tgz", + "integrity": "sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "expect": "^24.7.1", + "jest-diff": "^24.7.0", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-resolve": "^24.7.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.7.0", + "semver": "^5.5.0" + } + }, + "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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" + } + } + } + }, + "@jest/environment": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.7.1.tgz", + "integrity": "sha512-wmcTTYc4/KqA+U5h1zQd5FXXynfa7VGP2NfF+c6QeGJ7c+2nStgh65RQWNX62SC716dTtqheTRrZl0j+54oGHw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.7.1", + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "jest-mock": "^24.7.0" + } + }, + "@jest/fake-timers": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.7.1.tgz", + "integrity": "sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-mock": "^24.7.0" + }, + "dependencies": { + "@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/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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-message-util": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz", + "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@jest/reporters": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.7.1.tgz", + "integrity": "sha512-bO+WYNwHLNhrjB9EbPL4kX/mCCG4ZhhfWmO3m4FSpbgr7N83MFejayz30kKjgqr7smLyeaRFCBQMbXpUgnhAJw==", + "dev": true, + "requires": { + "@jest/environment": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-api": "^2.1.1", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-source-maps": "^3.0.1", + "jest-haste-map": "^24.7.1", + "jest-resolve": "^24.7.1", + "jest-runtime": "^24.7.1", + "jest-util": "^24.7.1", + "jest-worker": "^24.6.0", + "node-notifier": "^5.2.1", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + } + } + }, + "@jest/source-map": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", + "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.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 + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "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 + } + } + }, + "@jest/test-result": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.7.1.tgz", + "integrity": "sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.7.1.tgz", + "integrity": "sha512-84HQkCpVZI/G1zq53gHJvSmhUer4aMYp9tTaffW28Ih5OxfCg8hGr3nTSbL1OhVDRrFZwvF+/R9gY6JRkDUpUA==", + "dev": true, + "requires": { + "@jest/test-result": "^24.7.1", + "jest-haste-map": "^24.7.1", + "jest-runner": "^24.7.1", + "jest-runtime": "^24.7.1" + } + }, + "@jest/transform": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.7.1.tgz", + "integrity": "sha512-EsOUqP9ULuJ66IkZQhI5LufCHlTbi7hrcllRMUEV/tOgqBVQi93+9qEvkX0n8mYpVXQ8VjwmICeRgg58mrtIEw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.7.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.7.1", + "jest-regex-util": "^24.3.0", + "jest-util": "^24.7.1", + "micromatch": "^3.1.10", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "babel-plugin-istanbul": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz", + "integrity": "sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.0.0", + "test-exclude": "^5.0.0" + } + }, + "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" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, + "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 + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "test-exclude": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", + "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + } + } + }, + "@jest/types": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.7.0.tgz", + "integrity": "sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/yargs": "^12.0.9" + } + }, + "@material-ui/core": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.9.3.tgz", + "integrity": "sha512-REIj62+zEvTgI/C//YL4fZxrCVIySygmpZglsu/Nl5jPqy3CDjZv1F9ubBYorHqmRgeVPh64EghMMWqk4egmfg==", + "requires": { + "@babel/runtime": "^7.2.0", + "@material-ui/system": "^3.0.0-alpha.0", + "@material-ui/utils": "^3.0.0-alpha.2", + "@types/jss": "^9.5.6", + "@types/react-transition-group": "^2.0.8", + "brcast": "^3.0.1", + "classnames": "^2.2.5", + "csstype": "^2.5.2", + "debounce": "^1.1.0", + "deepmerge": "^3.0.0", + "dom-helpers": "^3.2.1", + "hoist-non-react-statics": "^3.2.1", + "is-plain-object": "^2.0.4", + "jss": "^9.8.7", + "jss-camel-case": "^6.0.0", + "jss-default-unit": "^8.0.2", + "jss-global": "^3.0.0", + "jss-nested": "^6.0.1", + "jss-props-sort": "^6.0.0", + "jss-vendor-prefixer": "^7.0.0", + "normalize-scroll-left": "^0.1.2", + "popper.js": "^1.14.1", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.2", + "react-transition-group": "^2.2.1", + "recompose": "0.28.0 - 0.30.0", + "warning": "^4.0.1" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@material-ui/icons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-3.0.1.tgz", + "integrity": "sha512-1kNcxYiIT1x8iDPEAlgmKrfRTIV8UyK6fLVcZ9kMHIKGWft9I451V5mvSrbCjbf7MX1TbLWzZjph0aVCRf9MqQ==", + "requires": { + "@babel/runtime": "7.0.0", + "recompose": "^0.29.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "recompose": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.29.0.tgz", + "integrity": "sha512-J/qLXNU4W+AeHCDR70ajW8eMd1uroqZaECTj6qqDLPMILz3y0EzpYlvrnxKB9DnqcngWrtGwjXY9JeXaW9kS1A==", + "requires": { + "@babel/runtime": "^7.0.0", + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "react-lifecycles-compat": "^3.0.2", + "symbol-observable": "^1.0.4" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, + "@material-ui/styles": { + "version": "3.0.0-alpha.10", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-3.0.0-alpha.10.tgz", + "integrity": "sha512-qJ5eiupBPRCNlMCDZ2G5h8auBtBtm8uT/oCUAJ/FqhO5oC7POLmmvDN1Cq1cgAmqQnaL6uN5mAM1Gc90GpKr9A==", + "requires": { + "@babel/runtime": "^7.2.0", + "@emotion/hash": "^0.7.1", + "@material-ui/utils": "^3.0.0-alpha.2", + "classnames": "^2.2.5", + "deepmerge": "^3.0.0", + "hoist-non-react-statics": "^3.2.1", + "jss": "^10.0.0-alpha.7", + "jss-plugin-camel-case": "^10.0.0-alpha.7", + "jss-plugin-default-unit": "^10.0.0-alpha.7", + "jss-plugin-global": "^10.0.0-alpha.7", + "jss-plugin-nested": "^10.0.0-alpha.7", + "jss-plugin-props-sort": "^10.0.0-alpha.7", + "jss-plugin-rule-value-function": "^10.0.0-alpha.7", + "jss-plugin-vendor-prefixer": "^10.0.0-alpha.7", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.1.tgz", + "integrity": "sha512-OYpa/Sg+2GDX+jibUfpZVn1YqSVRpYmTLF2eyAfrFTIJSbwyIrc+YscayoykvaOME/wV4BV0Sa0yqdMrgse6mA==" + }, + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + }, + "jss": { + "version": "10.0.0-alpha.16", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.0-alpha.16.tgz", + "integrity": "sha512-HmKNNnr82TR5jkWjBcbrx/uim2ief588pWp7zsf4GQpL125zRkEaWYL1SXv5bR6bBvAoTtvJsTAOxDIlLxUNZg==", + "requires": { + "@babel/runtime": "^7.3.1", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + } + } + }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@material-ui/system": { + "version": "3.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-3.0.0-alpha.2.tgz", + "integrity": "sha512-odmxQ0peKpP7RQBQ8koly06YhsPzcoVib1vByVPBH4QhwqBXuYoqlCjt02846fYspAqkrWzjxnWUD311EBbxOA==", + "requires": { + "@babel/runtime": "^7.2.0", + "deepmerge": "^3.0.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + }, + "dependencies": { + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@material-ui/utils": { + "version": "3.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-3.0.0-alpha.3.tgz", + "integrity": "sha512-rwMdMZptX0DivkqBuC+Jdq7BYTXwqKai5G5ejPpuEDKpWzi1Oxp+LygGw329FrKpuKeiqpcymlqJTjmy+quWng==", + "requires": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "react-is": "^16.6.3" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@oclif/color": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@oclif/color/-/color-0.0.0.tgz", + "integrity": "sha512-KKd3W7eNwfNF061tr663oUNdt8EMnfuyf5Xv55SGWA1a0rjhWqS/32P7OeB7CbXcJUBdfVrPyR//1afaW12AWw==", + "requires": { + "ansi-styles": "^3.2.1", + "supports-color": "^5.4.0", + "tslib": "^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==", + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "@oclif/command": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.5.12.tgz", + "integrity": "sha512-D5/Kph9smL92X1z9WPmxFd9zDruFsCk4/LbfCaBmiO2Vyyt7Y9O6kI1YLsC3B0KC9wymSCTH14IK96rf9AFHfQ==", + "requires": { + "@oclif/errors": "^1.2.2", + "@oclif/parser": "^3.7.3", + "debug": "^4.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, + "@oclif/config": { + "version": "1.12.12", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.12.12.tgz", + "integrity": "sha512-0vlX5VYvOfF9QbkCqMyPSzH9GMp6at4Mbqn8CxCskxhKvNZoPD5ocda2ku0zEnoqxGAQ4VfQP7NCqJthuiStfg==", + "requires": { + "debug": "^4.1.1", + "tslib": "^1.9.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@oclif/errors": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.2.2.tgz", + "integrity": "sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg==", + "requires": { + "clean-stack": "^1.3.0", + "fs-extra": "^7.0.0", + "indent-string": "^3.2.0", + "strip-ansi": "^5.0.0", + "wrap-ansi": "^4.0.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==" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", + "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, + "@oclif/linewrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", + "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==" + }, + "@oclif/parser": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.7.3.tgz", + "integrity": "sha512-yfYpDzVn9ipo4HZtYLfMtd3j3ArpTQlRbQfy9pNnHFd4VedE2PNYQTRWYYMuu1FxEOoknlMZbzsewVvl41TvKg==", + "requires": { + "@oclif/linewrap": "^1.0.0", + "chalk": "^2.4.1", + "tslib": "^1.9.3" + }, + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@oclif/plugin-autocomplete": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-0.1.0.tgz", + "integrity": "sha512-Dz2dGyBoOUcv6/gqr9qaG7KTIkYxILL0MvMVwlhkS0f6UqCsh8fC3adYTr8BeIPQmUqWkACtC7bYp9DyQ8m2Jw==", + "requires": { + "@oclif/command": "^1.4.31", + "@oclif/config": "^1.6.22", + "@types/fs-extra": "^5.0.2", + "chalk": "^2.4.1", + "cli-ux": "^4.4.0", + "debug": "^3.1.0", + "fs-extra": "^6.0.1", + "moment": "^2.22.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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "@oclif/plugin-help": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-2.1.6.tgz", + "integrity": "sha512-M4kTERpPWNSM1Mga7K/zo9DWHLCVf2FRaIeXPoytmTPd+0kSvG3TR0Vc1bwx9/cxXoYyYGgEejwNlrfayr8FZw==", + "requires": { + "@oclif/command": "^1.5.8", + "chalk": "^2.4.1", + "indent-string": "^3.2.0", + "lodash.template": "^4.4.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0", + "widest-line": "^2.0.1", + "wrap-ansi": "^4.0.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==" + }, + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "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==", + "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==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wrap-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", + "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, + "@oclif/plugin-not-found": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-1.2.2.tgz", + "integrity": "sha512-SPlmiJFmTFltQT/owdzQwKgq6eq5AEKVwVK31JqbzK48bRWvEL1Ye60cgztXyZ4bpPn2Fl+KeL3FWFQX41qJuA==", + "requires": { + "@oclif/color": "^0.0.0", + "@oclif/command": "^1.5.3", + "cli-ux": "^4.9.0", + "fast-levenshtein": "^2.0.6", + "lodash": "^4.17.11" + } + }, + "@oclif/plugin-plugins": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-1.7.8.tgz", + "integrity": "sha512-GxLxaf8Lk1RqHVAIBZyA7hmhU7u5oV97i/OsWgFPdjPaT+BmWlWXR8IpmtA8giNo6atR+JpfgDmYndMU75zYUQ==", + "requires": { + "@oclif/color": "^0.0.0", + "@oclif/command": "^1.5.12", + "chalk": "^2.4.2", + "cli-ux": "^5.2.1", + "debug": "^4.1.0", + "fs-extra": "^7.0.1", + "http-call": "^5.2.2", + "load-json-file": "^5.2.0", + "npm-run-path": "^3.0.0", + "semver": "^5.6.0", + "tslib": "^1.9.3", + "yarn": "^1.15.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==" + }, + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "clean-stack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.1.0.tgz", + "integrity": "sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA==" + }, + "cli-ux": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.2.1.tgz", + "integrity": "sha512-zG1012o7U4ZsCuIST1t2yrHPADv16J81RAGYjY9X1yABEFK40oyjRchD5ffVZaG44BjizmLvu677zbVIypRuxw==", + "requires": { + "@oclif/command": "^1.5.1", + "@oclif/errors": "^1.2.1", + "@oclif/linewrap": "^1.0.0", + "@oclif/screen": "^1.0.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "clean-stack": "^2.0.0", + "extract-stack": "^1.0.0", + "fs-extra": "^7.0.1", + "hyperlinker": "^1.0.0", + "indent-string": "^3.2.0", + "is-wsl": "^1.1.0", + "lodash": "^4.17.11", + "natural-orderby": "^2.0.1", + "password-prompt": "^1.1.2", + "semver": "^5.6.0", + "string-width": "^3.1.0", + "strip-ansi": "^5.1.0", + "supports-color": "^5.5.0", + "supports-hyperlinks": "^1.0.1", + "treeify": "^1.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + } + }, + "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==" + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "requires": { + "path-key": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "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==", + "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==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@oclif/plugin-warn-if-update-available": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-1.7.0.tgz", + "integrity": "sha512-Nwyz3BJ8RhsfQ+OmFSsJSPIfn5YJqMrCzPh72Zgo2jqIjKIBWD8N9vTTe4kZlpeUUn77SyXFfwlBQbNCL5OEuQ==", + "requires": { + "@oclif/command": "^1.5.10", + "@oclif/config": "^1.12.8", + "@oclif/errors": "^1.2.2", + "chalk": "^2.4.1", + "debug": "^4.1.0", + "fs-extra": "^7.0.0", + "http-call": "^5.2.2", + "lodash.template": "^4.4.0", + "semver": "^5.6.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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, + "@oclif/screen": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-1.0.4.tgz", + "integrity": "sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==" + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "requires": { + "any-observable": "^0.3.0" + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + }, + "@storybook/addon-storyshots": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-storyshots/-/addon-storyshots-4.1.4.tgz", + "integrity": "sha512-AQk7lYpYqDmBG6rFm0PSffW3mKOSogLci1CQ+vNFBhwvf2INLj4JHU/G7cSKK1NvtZlp9kvl4E8jVzXGNo610A==", + "dev": true, + "requires": { + "@storybook/addons": "4.1.4", + "core-js": "^2.5.7", + "glob": "^7.1.3", + "global": "^4.3.2", + "jest-specific-snapshot": "^1.0.0", + "read-pkg-up": "^4.0.0", + "regenerator-runtime": "^0.12.1" + }, + "dependencies": { + "core-js": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.1.tgz", + "integrity": "sha512-L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg==", + "dev": true + }, + "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" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "@storybook/addons": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-4.1.4.tgz", + "integrity": "sha512-h91OXr9eFx3ilST+4rpXpPB3Y6gnJ/ZBps84cgZ69coffTeYfzNHPB1Fu2RVsB1skdSFTF/TnB1bAEzYNZ2cDQ==", + "dev": true, + "requires": { + "@storybook/channels": "4.1.4", + "@storybook/components": "4.1.4", + "global": "^4.3.2", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channel-postmessage": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-4.1.6.tgz", + "integrity": "sha512-CUFcnzZE5y24AUZqArt9/95wLdk0phsrOzDU8Q/WNWpzYCzTaaNzd82DDG4AWWHd7awtbgGGueKDCoAXU99t5A==", + "dev": true, + "requires": { + "@storybook/channels": "4.1.6", + "global": "^4.3.2", + "json-stringify-safe": "^5.0.1" + }, + "dependencies": { + "@storybook/channels": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-4.1.6.tgz", + "integrity": "sha512-8MqGYypdaPmZR7eORXdxtJijGOz5UMHXoMskVtodvKi26tmltFKX+okXFNh/teKe3+8s0QWkpzM95VI+Z+0qFA==", + "dev": true + } + } + }, + "@storybook/channels": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-4.1.4.tgz", + "integrity": "sha512-tXKSz58p4o1CiRL9VNUfgMuNeuyUkLLyBfK0tAY0Co370BTfUvMq7clG65+nPj+rdb7foYQQKpnwGYdMVzuzsg==", + "dev": true + }, + "@storybook/client-logger": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-4.1.6.tgz", + "integrity": "sha512-P65Pw3m2FRW7QDIU51zj3ANzo7twL7/9nQKoyMJKy/1rgqk1RMa/boHERPRhfATzqYPf5hh2G0PBTMKBEG4A8w==", + "dev": true + }, + "@storybook/components": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-4.1.4.tgz", + "integrity": "sha512-H0SMPt/zF1zfyCqUTwx0RcaRbviiz9vdxXWO4jURfgULhGpP+mQRXz0KUn2k7s/RMerTtpB4/DKNKm0zDylcNQ==", + "dev": true, + "requires": { + "@emotion/core": "^0.13.1", + "@emotion/provider": "^0.11.2", + "@emotion/styled": "^0.10.6", + "global": "^4.3.2", + "lodash": "^4.17.11", + "prop-types": "^15.6.2", + "react-inspector": "^2.3.0", + "react-split-pane": "^0.1.84", + "react-textarea-autosize": "^7.0.4", + "render-fragment": "^0.1.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + } + } + }, + "@storybook/core": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-4.1.6.tgz", + "integrity": "sha512-0T4mDt3Wzyg8UIrF0kPvP5kA+S+fGhaZI/vWGUPvmxsYuVQHGhvna1ZiayIW8R9TdHx1g+uSYkUxb8wVVUmwQA==", + "dev": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.2.0", + "@babel/preset-env": "^7.2.0", + "@emotion/core": "^0.13.1", + "@emotion/provider": "^0.11.2", + "@emotion/styled": "^0.10.6", + "@storybook/addons": "4.1.6", + "@storybook/channel-postmessage": "4.1.6", + "@storybook/client-logger": "4.1.6", + "@storybook/core-events": "4.1.6", + "@storybook/node-logger": "4.1.6", + "@storybook/ui": "4.1.6", + "airbnb-js-shims": "^1 || ^2", + "autoprefixer": "^9.3.1", + "babel-plugin-macros": "^2.4.2", + "babel-preset-minify": "^0.5.0 || 0.6.0-alpha.5", + "boxen": "^2.0.0", + "case-sensitive-paths-webpack-plugin": "^2.1.2", + "chalk": "^2.4.1", + "child-process-promise": "^2.2.1", + "cli-table3": "0.5.1", + "commander": "^2.19.0", + "common-tags": "^1.8.0", + "core-js": "^2.5.7", + "css-loader": "^1.0.1", + "detect-port": "^1.2.3", + "dotenv-webpack": "^1.5.7", + "ejs": "^2.6.1", + "eventemitter3": "^3.1.0", + "express": "^4.16.3", + "file-loader": "^2.0.0", + "file-system-cache": "^1.0.5", + "find-cache-dir": "^2.0.0", + "fs-extra": "^7.0.1", + "global": "^4.3.2", + "html-webpack-plugin": "^4.0.0-beta.2", + "inquirer": "^6.2.0", + "interpret": "^1.1.0", + "ip": "^1.1.5", + "json5": "^2.1.0", + "lazy-universal-dotenv": "^2.0.0", + "node-fetch": "^2.2.0", + "opn": "^5.4.0", + "postcss-flexbugs-fixes": "^4.1.0", + "postcss-loader": "^3.0.0", + "pretty-hrtime": "^1.0.3", + "prop-types": "^15.6.2", + "qs": "^6.5.2", + "raw-loader": "^0.5.1", + "react-dev-utils": "^6.1.0", + "redux": "^4.0.1", + "regenerator-runtime": "^0.12.1", + "resolve": "^1.8.1", + "resolve-from": "^4.0.0", + "semver": "^5.6.0", + "serve-favicon": "^2.5.0", + "shelljs": "^0.8.2", + "spawn-promise": "^0.1.8", + "style-loader": "^0.23.1", + "svg-url-loader": "^2.3.2", + "terser-webpack-plugin": "^1.1.0", + "url-loader": "^1.1.2", + "webpack": "^4.23.1", + "webpack-dev-middleware": "^3.4.0", + "webpack-hot-middleware": "^2.24.3" + }, + "dependencies": { + "@storybook/addons": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-4.1.6.tgz", + "integrity": "sha512-5dG0adChzNRbRLS/YD/5mEoWLTk3uaJpzbRSJVKe6HQKBPDXmuEMYYPiHI83o15YBJjGHx68+PkHBI08oRsuhQ==", + "dev": true, + "requires": { + "@storybook/channels": "4.1.6", + "@storybook/components": "4.1.6", + "global": "^4.3.2", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-4.1.6.tgz", + "integrity": "sha512-8MqGYypdaPmZR7eORXdxtJijGOz5UMHXoMskVtodvKi26tmltFKX+okXFNh/teKe3+8s0QWkpzM95VI+Z+0qFA==", + "dev": true + }, + "@storybook/components": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-4.1.6.tgz", + "integrity": "sha512-kWIUiexzFurNwW8NaJEhlFWD1kohnvNlOxgph7oSoXo/yCBodkEYpIuNbznQnNSH2xIjqh1dvbniJNSJZyEbTQ==", + "dev": true, + "requires": { + "@emotion/core": "^0.13.1", + "@emotion/provider": "^0.11.2", + "@emotion/styled": "^0.10.6", + "global": "^4.3.2", + "lodash": "^4.17.11", + "prop-types": "^15.6.2", + "react-inspector": "^2.3.0", + "react-split-pane": "^0.1.84", + "react-textarea-autosize": "^7.0.4", + "render-fragment": "^0.1.1" + } + }, + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "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-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "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" + } + }, + "autoprefixer": { + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.5.tgz", + "integrity": "sha512-M602C0ZxzFpJKqD4V6eq2j+K5CkzlhekCrcQupJmAOrPEZjWJyj/wSeo6qRSNoN6M3/9mtLPQqTTrABfReytQg==", + "dev": true, + "requires": { + "browserslist": "^4.4.0", + "caniuse-lite": "^1.0.30000928", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.11", + "postcss-value-parser": "^3.3.1" + } + }, + "browserslist": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.0.tgz", + "integrity": "sha512-tQkHS8VVxWbrjnNDXgt7/+SuPJ7qDvD0Y2e6bLtoQluR2SPvlmPUcfcU75L1KAalhqULlIFJlJ6BDfnYyJxJsw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000928", + "electron-to-chromium": "^1.3.100", + "node-releases": "^1.1.3" + } + }, + "caniuse-lite": { + "version": "1.0.30000929", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz", + "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==", + "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" + } + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, + "core-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.2.tgz", + "integrity": "sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g==", + "dev": true + }, + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" + } + }, + "css-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "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" + } + } + } + }, + "electron-to-chromium": { + "version": "1.3.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz", + "integrity": "sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ==", + "dev": true + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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 + }, + "file-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", + "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + } + }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "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" + } + }, + "html-webpack-plugin": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", + "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==", + "dev": true, + "requires": { + "html-minifier": "^3.5.20", + "loader-utils": "^1.1.0", + "lodash": "^4.17.11", + "pretty-error": "^2.1.1", + "tapable": "^1.1.0", + "util.promisify": "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" + } + }, + "inquirer": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" + } + }, + "js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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 + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", + "dev": true + }, + "node-releases": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz", + "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "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 + }, + "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" + } + }, + "postcss": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.13.tgz", + "integrity": "sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-load-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", + "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "dev": true, + "requires": { + "cosmiconfig": "^4.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.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 + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.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": "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.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "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 + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } + }, + "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" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + } + } + }, + "@storybook/core-events": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-4.1.6.tgz", + "integrity": "sha512-07ki5+VuruWQv7B1ZBlsNYEVSC3dQwIZKjEFL4aKFO57ruaNijkZTF1QHkSGJapyBPa7+LLM2fXqnBkputoEZw==", + "dev": true + }, + "@storybook/mantra-core": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@storybook/mantra-core/-/mantra-core-1.7.2.tgz", + "integrity": "sha512-GD4OYJ8GsayVhIg306sfgcKDk9j8YfuSKIAWvdB/g7IDlw0pDgueONALVEEE2XWJtCwcsUyDtCYzXFgCBWLEjA==", + "dev": true, + "requires": { + "@storybook/react-komposer": "^2.0.1", + "@storybook/react-simple-di": "^1.2.1", + "babel-runtime": "6.x.x" + } + }, + "@storybook/node-logger": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-4.1.6.tgz", + "integrity": "sha512-3mLcNp0eTjwQKHJ0vWpZLlayPOUaZJR/Umc6kWzdMn1K398/k7FU0fBK4FJ7VmnI0z1sYTlqaTqjqN0U3XaxjA==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "core-js": "^2.5.7", + "npmlog": "^4.1.2", + "pretty-hrtime": "^1.0.3", + "regenerator-runtime": "^0.12.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" + } + }, + "core-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.2.tgz", + "integrity": "sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + } + } + }, + "@storybook/podda": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@storybook/podda/-/podda-1.2.3.tgz", + "integrity": "sha512-g7dsdsn50AhlGZ8iIDKdF8bi7Am++iFOq+QN+hNKz3FvgLuf8Dz+mpC/BFl90eE9bEYxXqXKeMf87399Ec5Qhw==", + "dev": true, + "requires": { + "babel-runtime": "^6.11.6", + "immutable": "^3.8.1" + } + }, + "@storybook/react": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-4.1.6.tgz", + "integrity": "sha512-JavzdoIrLQprLlt/0Bm0QMKMOzqweL7gjXKSl8W5p38hhDpyxRt989t0yfZnwF6K0iGWeU88mAb9OoRkn7o8tA==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-constant-elements": "^7.2.0", + "@babel/preset-flow": "^7.0.0", + "@babel/preset-react": "^7.0.0", + "@emotion/styled": "^0.10.6", + "@storybook/core": "4.1.6", + "@storybook/node-logger": "4.1.6", + "@svgr/webpack": "^4.0.3", + "babel-plugin-named-asset-import": "^0.2.3", + "babel-plugin-react-docgen": "^2.0.0", + "babel-preset-react-app": "^6.1.0", + "common-tags": "^1.8.0", + "core-js": "^2.5.7", + "global": "^4.3.2", + "lodash": "^4.17.11", + "mini-css-extract-plugin": "^0.4.4", + "prop-types": "^15.6.2", + "react-dev-utils": "^6.1.0", + "regenerator-runtime": "^0.12.1", + "semver": "^5.6.0", + "webpack": "^4.23.1" + }, + "dependencies": { + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "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-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, + "core-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.2.tgz", + "integrity": "sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g==", + "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 + }, + "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 + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz", + "integrity": "sha512-dqBanNfktnp2hwL2YguV9Jh91PFX7gu7nRLs4TGsbAfAG6WOtlynFRYzwDwmmeSb5uIwHo9nx1ta0f7vAZVp2w==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, + "@storybook/react-komposer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@storybook/react-komposer/-/react-komposer-2.0.5.tgz", + "integrity": "sha512-zX5UITgAh37tmD0MWnUFR29S5YM8URMHc/9iwczX/P1f3tM4nPn8VAzxG/UWQecg1xZVphmqkZoux+SDrtTZOQ==", + "dev": true, + "requires": { + "@storybook/react-stubber": "^1.0.0", + "babel-runtime": "^6.11.6", + "hoist-non-react-statics": "^1.2.0", + "lodash": "^4.17.11", + "shallowequal": "^1.1.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "@storybook/react-simple-di": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@storybook/react-simple-di/-/react-simple-di-1.3.0.tgz", + "integrity": "sha512-RH6gPQaYMs/VzQX2dgbZU8DQMKFXVOv1ruohHjjNPys4q+YdqMFMDe5jOP1AUE3j9g01x0eW7bVjRawSpl++Ew==", + "dev": true, + "requires": { + "babel-runtime": "6.x.x", + "create-react-class": "^15.6.2", + "hoist-non-react-statics": "1.x.x", + "prop-types": "^15.6.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=", + "dev": true + } + } + }, + "@storybook/react-stubber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@storybook/react-stubber/-/react-stubber-1.0.1.tgz", + "integrity": "sha512-k+CHH+vA8bQfCmzBTtJsPkITFgD+C/w19KuByZ9WeEvNUFtnDaCqfP+Vp3/OR+3IAfAXYYOWolqPLxNPcEqEjw==", + "dev": true, + "requires": { + "babel-runtime": "^6.5.0" + } + }, + "@storybook/ui": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-4.1.6.tgz", + "integrity": "sha512-MXod0JMu/P2sTYlN6DM6yuwvizUKjwFn4lOf+F9hNe4lxZEXw74KogCv0CN32VUrWUP++ZY9DybQr4SMRFVVww==", + "dev": true, + "requires": { + "@emotion/core": "^0.13.1", + "@emotion/provider": "^0.11.2", + "@emotion/styled": "^0.10.6", + "@storybook/components": "4.1.6", + "@storybook/core-events": "4.1.6", + "@storybook/mantra-core": "^1.7.2", + "@storybook/podda": "^1.2.3", + "@storybook/react-komposer": "^2.0.5", + "deep-equal": "^1.0.1", + "eventemitter3": "^3.1.0", + "fuse.js": "^3.3.0", + "global": "^4.3.2", + "keycode": "^2.2.0", + "lodash": "^4.17.11", + "prop-types": "^15.6.2", + "qs": "^6.5.2", + "react": "^16.7.0", + "react-dom": "^16.7.0", + "react-fuzzy": "^0.5.2", + "react-lifecycles-compat": "^3.0.4", + "react-modal": "^3.6.1", + "react-treebeard": "^3.1.0" + }, + "dependencies": { + "@storybook/components": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-4.1.6.tgz", + "integrity": "sha512-kWIUiexzFurNwW8NaJEhlFWD1kohnvNlOxgph7oSoXo/yCBodkEYpIuNbznQnNSH2xIjqh1dvbniJNSJZyEbTQ==", + "dev": true, + "requires": { + "@emotion/core": "^0.13.1", + "@emotion/provider": "^0.11.2", + "@emotion/styled": "^0.10.6", + "global": "^4.3.2", + "lodash": "^4.17.11", + "prop-types": "^15.6.2", + "react-inspector": "^2.3.0", + "react-split-pane": "^0.1.84", + "react-textarea-autosize": "^7.0.4", + "render-fragment": "^0.1.1" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "react": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.7.0.tgz", + "integrity": "sha512-StCz3QY8lxTb5cl2HJxjwLFOXPIFQp+p+hxQfc8WE0QiLfCtIlKj8/+5tjjKm8uSTlAW+fCPaavGFS06V9Ar3A==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.12.0" + } + }, + "react-dom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.7.0.tgz", + "integrity": "sha512-D0Ufv1ExCAmF38P2Uh1lwpminZFRXEINJe53zRAbm4KPwSyd6DY/uDoS0Blj9jvPpn1+wivKpZYc8aAAN/nAkg==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.12.0" + } + }, + "scheduler": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.12.0.tgz", + "integrity": "sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.0.0.tgz", + "integrity": "sha512-PDvHV2WhSGCSExp+eIMEKxYd1Q0SBvXLb4gAOXbdh0dswHFFgXWzxGjCmx5aln4qGrhkuN81khzYzR/44DYaMA==", + "dev": true + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.0.3.tgz", + "integrity": "sha512-fpG7AzzJxz1tc8ITYS1jCAt1cq4ydK2R+sx//BMTJgvOjfk91M5GiqFolP8aYTzLcum92IGNAVFS3zEcucOQEA==", + "dev": true + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.0.0.tgz", + "integrity": "sha512-nBGVl6LzXTdk1c6w3rMWcjq3mYGz+syWc5b3CdqAiEeY/nswYDoW/cnGUKKC8ofD6/LaG+G/IUnfv3jKoHz43A==", + "dev": true + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.0.0.tgz", + "integrity": "sha512-ejQqpTfORy6TT5w1x/2IQkscgfbtNFjitcFDu63GRz7qfhVTYhMdiJvJ1+Aw9hmv9bO4tXThGQDr1IF5lIvgew==", + "dev": true + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.0.0.tgz", + "integrity": "sha512-OE6GT9WRKWqd0Dk6NJ5TYXTF5OxAyn74+c/D+gTLbCXnK2A0luEXuwMbe5zR5Px4A/jow2OeEBboTENl4vtuQg==", + "dev": true + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.0.0.tgz", + "integrity": "sha512-QeDRGHXfjYEBTXxV0TsjWmepsL9Up5BOOlMFD557x2JrSiVGUn2myNxHIrHiVW0+nnWnaDcrkjg/jUvbJ5nKCg==", + "dev": true + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.0.0.tgz", + "integrity": "sha512-c6eE6ovs14k6dmHKoy26h7iRFhjWNnwYVrDWIPfouVm/gcLIeMw/ME4i91O5LEfaDHs6kTRCcVpbAVbNULZOtw==", + "dev": true + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.1.0.tgz", + "integrity": "sha512-uulxdx2p3nrM2BkrtADQHK8IhEzCxdUILfC/ddvFC8tlFWuKiA3ych8C6q0ulyQHq34/3hzz+3rmUbhWF9redg==", + "dev": true + }, + "@svgr/babel-preset": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.1.0.tgz", + "integrity": "sha512-Nat5aJ3VO3LE8KfMyIbd3sGWnaWPiFCeWIdEV+lalga0To/tpmzsnPDdnrR9fNYhvSSLJbwhU/lrLYt9wXY0ZQ==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^4.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.0.3", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^4.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.0.0", + "@svgr/babel-plugin-transform-svg-component": "^4.1.0" + } + }, + "@svgr/core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.1.0.tgz", + "integrity": "sha512-ahv3lvOKuUAcs0KbQ4Jr5fT5pGHhye4ew8jZVS4lw8IQdWrbG/o3rkpgxCPREBk7PShmEoGQpteeXVwp2yExuQ==", + "dev": true, + "requires": { + "@svgr/plugin-jsx": "^4.1.0", + "camelcase": "^5.0.0", + "cosmiconfig": "^5.0.7" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "cosmiconfig": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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" + } + } + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.1.0.tgz", + "integrity": "sha512-tdkEZHmigYYiVhIEzycAMKN5aUSpddUnjr6v7bPwaNTFuSyqGUrpCg1JlIGi7PUaaJVHbn6whGQMGUpKOwT5nw==", + "dev": true, + "requires": { + "@babel/types": "^7.1.6" + } + }, + "@svgr/plugin-jsx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.1.0.tgz", + "integrity": "sha512-xwu+9TGziuN7cu7p+vhCw2EJIfv8iDNMzn2dR0C7fBYc8q+SRtYTcg4Uyn8ZWh6DM+IZOlVrS02VEMT0FQzXSA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.6", + "@svgr/babel-preset": "^4.1.0", + "@svgr/hast-util-to-babel-ast": "^4.1.0", + "rehype-parse": "^6.0.0", + "unified": "^7.0.2", + "vfile": "^3.0.1" + } + }, + "@svgr/plugin-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.0.3.tgz", + "integrity": "sha512-MgL1CrlxvNe+1tQjPUc2bIJtsdJOIE5arbHlPgW+XVWGjMZTUcyNNP8R7/IjM2Iyrc98UJY+WYiiWHrinnY9ZQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.7", + "merge-deep": "^3.0.2", + "svgo": "^1.1.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" + } + }, + "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" + } + }, + "cosmiconfig": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + } + }, + "css-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", + "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", + "dev": true + }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "dev": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + } + } + }, + "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" + } + }, + "js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.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" + } + }, + "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" + } + }, + "svgo": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.1.1.tgz", + "integrity": "sha512-GBkJbnTuFpM4jFbiERHDWhZc/S/kpHToqmZag3aEBjPYK44JAN2QBjvrGIxLOoCyMZjuFQIfTO2eJd8uwLY/9g==", + "dev": true, + "requires": { + "coa": "~2.0.1", + "colors": "~1.1.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "~0.1.0", + "css-tree": "1.0.0-alpha.28", + "css-url-regex": "^1.1.0", + "csso": "^3.5.0", + "js-yaml": "^3.12.0", + "mkdirp": "~0.5.1", + "object.values": "^1.0.4", + "sax": "~1.2.4", + "stable": "~0.1.6", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + } + } + }, + "@svgr/webpack": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.1.0.tgz", + "integrity": "sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.6", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.1.6", + "@babel/preset-react": "^7.0.0", + "@svgr/core": "^4.1.0", + "@svgr/plugin-jsx": "^4.1.0", + "@svgr/plugin-svgo": "^4.0.3", + "loader-utils": "^1.1.0" + } + }, + "@types/async": { + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/@types/async/-/async-2.0.50.tgz", + "integrity": "sha512-VMhZMMQgV1zsR+lX/0IBfAk+8Eb7dPVMWiQGFAt3qjo5x7Ml6b77jUo0e1C3ToD+XRDXqtrfw+6AB0uUsPEr3Q==", + "optional": true + }, + "@types/babel__core": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.0.tgz", + "integrity": "sha512-wJTeJRt7BToFx3USrCDs2BhEi4ijBInTQjOIukj6a/5tEkwpFMVZ+1ppgmE+Q/FQyc5P/VWUbx7I9NELrKruHA==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + }, + "dependencies": { + "@babel/parser": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz", + "integrity": "sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==", + "dev": true + } + } + }, + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/parser": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz", + "integrity": "sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==", + "dev": true + } + } + }, + "@types/babel__traverse": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz", + "integrity": "sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@types/cheerio": { + "version": "0.22.10", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.10.tgz", + "integrity": "sha512-fOM/Jhv51iyugY7KOBZz2ThfT1gwvsGCfWxpLpZDgkGjpEO4Le9cld07OdskikLjDUQJ43dzDaVRSFwQlpdqVg==" + }, + "@types/classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-XHcYvVdbtAxVstjKxuULYqYaWIzHR15yr1pZj4fnGChuBVJlIAp9StJna0ZJNSgxPh4Nac2FL4JM3M11Tm6fqQ==" + }, + "@types/draft-js": { + "version": "0.10.28", + "resolved": "https://registry.npmjs.org/@types/draft-js/-/draft-js-0.10.28.tgz", + "integrity": "sha512-mShgWAYAduZ2Rwzpo52cToq+q8SIZ2O6Byl2F9wphB0QFjuNtUMyvAzGGg4kYGWPLZKELMWlEA/wv+AdPlkclw==", + "dev": true, + "requires": { + "@types/react": "*", + "immutable": "^3.8.1" + } + }, + "@types/enzyme": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.1.15.tgz", + "integrity": "sha512-6b4JWgV+FNec1c4+8HauGbXg5gRc1oQK93t2+4W+bHjG/PzO+iPvagY6d6bXAZ+t+ps51Zb2F9LQ4vl0S0Epog==", + "requires": { + "@types/cheerio": "*", + "@types/react": "*" + } + }, + "@types/events": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" + }, + "@types/fs-extra": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.5.tgz", + "integrity": "sha512-w7iqhDH9mN8eLClQOYTkhdYUOSpp25eXxfc6VbFOGtzxW34JcvctH2bKjj4jD4++z4R5iO5D+pg48W2e03I65A==", + "requires": { + "@types/node": "*" + } + }, + "@types/fuzzaldrin": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/fuzzaldrin/-/fuzzaldrin-2.1.1.tgz", + "integrity": "sha512-KHKQApfuxY67bNVCvRYXEJA/8krvf27T4aA5dTQV8GBx19FKOhcvznbHBVqR7pFJhXZk/yYMWiPEPJ/JVdQ0jQ==" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/history": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.6.2.tgz", + "integrity": "sha512-eVAb52MJ4lfPLiO9VvTgv8KaZDEIqCwhv+lXOMLlt4C1YHTShgmMULEg0RrCbnqfYd6QKfHsMp0MiX0vWISpSw==", + "dev": true + }, + "@types/i18next": { + "version": "8.4.3", + "resolved": "https://registry.npmjs.org/@types/i18next/-/i18next-8.4.3.tgz", + "integrity": "sha512-ayqHEU+i9H7/Fkefnhyvml1ChKEZXcDwmVqo3jmrxy7PoAtTSY1t4/hr58Xz8hkXLPoCGS1hTc6bLJOUaOAjfQ==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz", + "integrity": "sha512-eAtOAFZefEnfJiRFQBGw1eYqa5GTLCZ1y86N0XSI/D6EB+E8z6VPV/UL7Gi5UEclFqoQk+6NRqEDsfmDLXn8sg==", + "dev": true + }, + "@types/jest": { + "version": "23.3.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.1.tgz", + "integrity": "sha512-/UMY+2GkOZ27Vrc51pqC5J8SPd39FKt7kkoGAtWJ8s4msj0b15KehDWIiJpWY3/7tLxBQLLzJhIBhnEsXdzpgw==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/jss": { + "version": "9.5.8", + "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.8.tgz", + "integrity": "sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA==", + "requires": { + "csstype": "^2.0.0", + "indefinite-observable": "^1.0.1" + } + }, + "@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/moment-timezone": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@types/moment-timezone/-/moment-timezone-0.5.9.tgz", + "integrity": "sha512-tBf1QR8xAayQfI1xD+SMSNDMxi+aCYKEhjgVXTZt3sgxS2XusNX3jM6jJbFoY/ar1CK/PaYJoPkWs/mwcwgOqw==", + "requires": { + "moment": ">=2.14.0" + } + }, + "@types/node": { + "version": "9.4.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz", + "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==" + }, + "@types/prop-types": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.0.tgz", + "integrity": "sha512-eItQyV43bj4rR3JPV0Skpl1SncRCdziTEK9/v8VwXmV6d/qOUO8/EuWeHBbCZcsfSHfzI5UyMJLCSXtxxznyZg==" + }, + "@types/puppeteer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-1.5.0.tgz", + "integrity": "sha512-KNQzIbHKn/yOlCH3BXOBA+3OUTZRmLkeCMQOHSid1ytrCKNks8ut6Oj0eeUeiOdOoRcW264qNh5kjH6LIoxeCA==", + "requires": { + "@types/events": "*", + "@types/node": "*" + } + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==", + "dev": true + }, + "@types/react": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.6.tgz", + "integrity": "sha512-bN9qDjEMltmHrl0PZRI4IF2AbB7V5UlRfG+OOduckVnRQ4VzXVSzy/1eLAh778IEqhTnW0mmgL9yShfinNverA==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/react-dom": { + "version": "16.8.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.2.tgz", + "integrity": "sha512-MX7n1wq3G/De15RGAAqnmidzhr2Y9O/ClxPxyqaNg96pGyeXUYPSvujgzEVpLo9oIP4Wn1UETl+rxTN02KEpBw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-dropzone": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/react-dropzone/-/react-dropzone-4.2.2.tgz", + "integrity": "sha512-okO6HY+w7V0uHoy6JpLY6BwY/s/oObtXZmUQdX0ycjPeLhK8Af/xf79CFkLA1fM6oVp16n1d962ejdkEXk375Q==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-helmet": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-5.0.7.tgz", + "integrity": "sha512-FbDibfkcGsD/N+3k47bfLcr5uAzSi64LJ2OOILz/P5vtBwT5A92KZAU5H9/7OjhUN6au5k+BbNplhVfp6IXDcQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-infinite-scroller": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/react-infinite-scroller/-/react-infinite-scroller-1.2.0.tgz", + "integrity": "sha512-5TiqZoj3bn+lOctSra4+02T2ma12drNvQOjFicLL3iPWhNREbA9gb/XG9jCDR7f5Bl8k17pbm0nGFa5olnt9rA==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-router": { + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-4.0.26.tgz", + "integrity": "sha512-BBL/Dk/sXAlC0Ee4zJrgYp8AsM5ubITRz8kX2a+4BBkDh9E5YE+4ZqzrS6L+ec6cXb4yRHL983fEN5AsobOIHg==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*" + } + }, + "@types/react-router-dom": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-4.2.7.tgz", + "integrity": "sha512-6sIP3dIj6xquvcAuYDaxpbeLjr9954OuhCXnniMhnDgykAw2tVji9b0jKHofPJGUoHEMBsWzO83tjnk7vfzozA==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "@types/react-sortable-tree": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@types/react-sortable-tree/-/react-sortable-tree-0.3.6.tgz", + "integrity": "sha512-zNqhO7Rv9dJ8AfrLOrjOjMKsKsiXrWa6YbMakp+6bhYQojkNQ4Hs8g12gTO2+5Rerj3iU9hJb+XncI0G2X3W3Q==", + "requires": { + "@types/react": "*", + "@types/react-virtualized": "*", + "react-dnd": "5 || 6 || 7" + } + }, + "@types/react-test-renderer": { + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.8.1.tgz", + "integrity": "sha512-8gU69ELfJGxzVWVYj4MTtuHxz9nO+d175XeQ1XrXXxesUBsB4KK6OCfzVhEX6leZWWBDVtMJXp/rUjhClzL7gw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.9.1.tgz", + "integrity": "sha512-1usq4DRUVBFnxc9KGJAlJO9EpQrLZGDDEC8wDOn2+2ODSyudYo8FiIzPDRaX/hfQjHqGeeoNaNdA2bj0l35hZQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-virtualized": { + "version": "9.21.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.1.tgz", + "integrity": "sha512-BwWXk6Vy+YuWbc2jZsmm0fn8bglPUpqUWPH/JUUBfvfKfL2nDvvmCiauyxMCWrxZMVBbkxaUuP82SviaDv0wGw==", + "requires": { + "@types/prop-types": "*", + "@types/react": "*" + } + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/storybook__addon-storyshots": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/storybook__addon-storyshots/-/storybook__addon-storyshots-3.4.3.tgz", + "integrity": "sha512-xn8V+3heUFbpMeVkkhG97CB0UaiWdr7QklmhZ7OftH4uS7VgposNybp+2/iwduoKQyfB7tLSxth9t5rOvDHWMA==", + "requires": { + "@types/puppeteer": "*", + "@types/react": "*" + } + }, + "@types/storybook__react": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/storybook__react/-/storybook__react-4.0.0.tgz", + "integrity": "sha512-Iq3RX953fqZRwWN3jywm8pUx1/Atev+x/9tF7/2CNA+Ii55sGSJJRWMRthUKQXTa3zOexcvfksfVYdUaIZY91w==", + "dev": true, + "requires": { + "@types/react": "*", + "@types/webpack-env": "*" + } + }, + "@types/string-similarity": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/string-similarity/-/string-similarity-1.2.0.tgz", + "integrity": "sha512-zrUNNlpw29TES8RF5EbdjlyLQduy9rh0b+xgx3RuPl0Qb6KMcQ3CI+cNKejpU3TEbLEfq6l627WxDIXS+Ebj/Q==" + }, + "@types/unist": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.2.tgz", + "integrity": "sha512-iHI60IbyfQilNubmxsq4zqSjdynlmc2Q/QvH9kjzg9+CCYVVzq1O6tc7VBzSygIwnmOt07w80IG6HDQvjv3Liw==", + "dev": true + }, + "@types/url-join": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@types/url-join/-/url-join-0.8.2.tgz", + "integrity": "sha1-EYHsvh2XtwNODqHjXmLobMJrQi0=" + }, + "@types/vfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", + "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/unist": "*", + "@types/vfile-message": "*" + } + }, + "@types/vfile-message": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", + "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/unist": "*" + } + }, + "@types/webpack-env": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.6.tgz", + "integrity": "sha512-5Th3OsZ4gTRdr9Mho83BQ23cex4sRhOR4XTG+m+cJc0FhtUBK9Vn62hBJ+pnQYnSxoPOsKoAPOx6FcphxBC8ng==", + "dev": true + }, + "@types/yargs": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "dev": true + }, + "@types/zen-observable": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz", + "integrity": "sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==" + }, + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "~1.33.0" + } + } + } + }, + "acorn": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.0.tgz", + "integrity": "sha512-QatFQ4C0n+PLqemyC6zXEv04tSqRR0hRqe+uGKPEVgKe2G8kl8wJvHzRYWwz6vqqEqt6idPVMFojZ4P1zlyAzQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "acorn-globals": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", + "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "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 + }, + "address": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", + "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==", + "dev": true + }, + "airbnb-js-shims": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.1.1.tgz", + "integrity": "sha512-h8UtyB/TCdOwWoEPQJGHgsWwSnTqPrRZbhyZYjAwY9/AbjdjfkKy9L/T3fIFS6MKX8YrpWFRm6xqFSgU+2DRGw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "array.prototype.flatmap": "^1.2.1", + "es5-shim": "^4.5.10", + "es6-shim": "^0.35.3", + "function.prototype.name": "^1.1.0", + "object.entries": "^1.0.4", + "object.fromentries": "^1.0.0", + "object.getownpropertydescriptors": "^2.0.3", + "object.values": "^1.0.4", + "promise.prototype.finally": "^3.1.0", + "string.prototype.matchall": "^3.0.0", + "string.prototype.padend": "^3.0.0", + "string.prototype.padstart": "^3.0.0", + "symbol.prototype.description": "^1.0.0" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", + "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "dev": true + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "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 + }, + "string-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } + } + } + }, + "ansi-colors": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.2.tgz", + "integrity": "sha512-kJmcp4PrviBBEx95fC3dYRiC/QSN3EBd0GU1XoNEk/IuUa92rsB6o90zP3w5VAyNznR38Vkc9i8vk5zK6T7TxA==", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==" + }, + "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" + } + }, + "apollo": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/apollo/-/apollo-2.8.1.tgz", + "integrity": "sha512-8zU8Dr4fk39oMmdGXGwSFDtWF6LaIGXL6saqL5bNAhbzgPOon9IYtTE09o4qSlqULMtcm2TOdMZ+ffLH+ft6Iw==", + "requires": { + "@apollographql/apollo-tools": "0.3.5", + "@oclif/command": "1.5.12", + "@oclif/config": "1.12.12", + "@oclif/errors": "1.2.2", + "@oclif/plugin-autocomplete": "0.1.0", + "@oclif/plugin-help": "2.1.6", + "@oclif/plugin-not-found": "1.2.2", + "@oclif/plugin-plugins": "1.7.8", + "@oclif/plugin-warn-if-update-available": "1.7.0", + "apollo-codegen-core": "0.33.2", + "apollo-codegen-flow": "0.33.2", + "apollo-codegen-scala": "0.34.2", + "apollo-codegen-swift": "0.33.2", + "apollo-codegen-typescript": "0.33.2", + "apollo-env": "0.4.0", + "apollo-graphql": "0.2.0", + "apollo-language-server": "1.6.2", + "chalk": "2.4.2", + "cli-ux": "4.9.3", + "env-ci": "3.2.0", + "gaze": "1.1.3", + "git-parse": "1.0.3", + "git-rev-sync": "1.12.0", + "glob": "7.1.3", + "graphql": "^14.0.2", + "graphql-tag": "2.10.1", + "heroku-cli-util": "8.0.11", + "listr": "0.14.3", + "lodash": "4.17.11", + "tty": "1.0.1", + "vscode-uri": "1.0.6" + }, + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graphql-tag": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", + "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" + } + } + }, + "apollo-cache": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.21.tgz", + "integrity": "sha512-5ErNb78KHtrJNimkDBTEigcvHkIqUmS7QJIk4lpZZ+XLVVgvk2fD+GhD1PLP+s8vHfAKVbO6vdbRxCCjGGrh5w==", + "requires": { + "apollo-utilities": "^1.0.26" + }, + "dependencies": { + "apollo-utilities": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.26.tgz", + "integrity": "sha512-URw7o3phymliqYCYatcird2YRPUU2eWCNvip64U9gQrX56mEfK4m99yBIDCMTpmcvOFsKLii1sIEZsHIs/bvnw==", + "requires": { + "fast-json-stable-stringify": "^2.0.0" + } + } + } + }, + "apollo-cache-inmemory": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.3.11.tgz", + "integrity": "sha512-fSoyjBV5RV57J3i/VHDDB74ZgXc0PFiogheNFHEhC0mL6rg5e/DjTx0Vg+csIBk23gvlzTvV+eypx7Q2NJ+dYg==", + "requires": { + "apollo-cache": "^1.1.21", + "apollo-utilities": "^1.0.26", + "optimism": "^0.6.6" + }, + "dependencies": { + "apollo-utilities": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.26.tgz", + "integrity": "sha512-URw7o3phymliqYCYatcird2YRPUU2eWCNvip64U9gQrX56mEfK4m99yBIDCMTpmcvOFsKLii1sIEZsHIs/bvnw==", + "requires": { + "fast-json-stable-stringify": "^2.0.0" + } + } + } + }, + "apollo-client": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.4.7.tgz", + "integrity": "sha512-6aAm+16AFBYZhJF8eKxrup6AbYni01InDiwTfZhMMTP2xaXQWjsQnfaHbI2oE+hd3+AZFy1drkse8RZKghR/WQ==", + "requires": { + "@types/async": "2.0.50", + "@types/zen-observable": "^0.8.0", + "apollo-cache": "1.1.21", + "apollo-link": "^1.0.0", + "apollo-link-dedup": "^1.0.0", + "apollo-utilities": "1.0.26", + "symbol-observable": "^1.0.2", + "zen-observable": "^0.8.0" + }, + "dependencies": { + "apollo-cache": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.21.tgz", + "integrity": "sha512-5ErNb78KHtrJNimkDBTEigcvHkIqUmS7QJIk4lpZZ+XLVVgvk2fD+GhD1PLP+s8vHfAKVbO6vdbRxCCjGGrh5w==", + "requires": { + "apollo-utilities": "^1.0.26" + } + }, + "apollo-utilities": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.26.tgz", + "integrity": "sha512-URw7o3phymliqYCYatcird2YRPUU2eWCNvip64U9gQrX56mEfK4m99yBIDCMTpmcvOFsKLii1sIEZsHIs/bvnw==", + "requires": { + "fast-json-stable-stringify": "^2.0.0" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + } + } + }, + "apollo-client-preset": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/apollo-client-preset/-/apollo-client-preset-1.0.8.tgz", + "integrity": "sha512-vRrdBfoOBkSboUmkec/zDWK9dT22GoZ2NgTKxfPXaTRh82HGDejDAblMr7BuDtZQ6zxMUiD9kghmO+3HXsHKdQ==", + "requires": { + "apollo-cache-inmemory": "^1.1.7", + "apollo-client": "^2.2.2", + "apollo-link": "^1.0.6", + "apollo-link-http": "^1.3.1", + "graphql-tag": "^2.4.2" + } + }, + "apollo-codegen-core": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/apollo-codegen-core/-/apollo-codegen-core-0.33.2.tgz", + "integrity": "sha512-KRXUvJuV6PsO3ktImlTWcISmaQbG4rsCSltRgh/XiIPYr9pv4j61+7Q/J78/o+wgfRiKUhOytfuyVLNbSCFR1Q==", + "requires": { + "@babel/generator": "7.4.0", + "@babel/parser": "^7.1.3", + "@babel/types": "7.4.0", + "apollo-env": "0.4.0", + "apollo-language-server": "1.6.2", + "ast-types": "^0.12.0", + "common-tags": "^1.5.1", + "recast": "^0.17.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/parser": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz", + "integrity": "sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==" + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "ast-types": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.3.tgz", + "integrity": "sha512-wJUcAfrdW+IgDoMGNz5MmcvahKgB7BwIbLupdKVVHxHNYt+HVR2k35swdYNv9aZpF8nvlkjbnkp2rrNwxGckZA==" + }, + "recast": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.17.5.tgz", + "integrity": "sha512-K+DgfAMIyEjNKjaFSWgg9TTu7wFgU/4KTyw4E9vl6M5QPDuUYbyt49Yzb0EIDbZks+6lXk/UZ9eTuE4jlLyf2A==", + "requires": { + "ast-types": "0.12.3", + "esprima": "~4.0.0", + "private": "^0.1.8", + "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==" + } + } + }, + "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=" + } + } + }, + "apollo-codegen-flow": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/apollo-codegen-flow/-/apollo-codegen-flow-0.33.2.tgz", + "integrity": "sha512-s0Q7Mh2uWgZJM1y9jJs3bunInZrr4OISLGFOJL0PAiTURHtKoAWtgITY+Fiz3HdkIcyNgyb6cw+KnOTizyzm7A==", + "requires": { + "@babel/generator": "7.4.0", + "@babel/types": "7.4.0", + "apollo-codegen-core": "0.33.2", + "apollo-env": "0.4.0", + "change-case": "^3.0.1", + "common-tags": "^1.5.1", + "inflected": "^2.0.3" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "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=" + } + } + }, + "apollo-codegen-scala": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/apollo-codegen-scala/-/apollo-codegen-scala-0.34.2.tgz", + "integrity": "sha512-MDSS8aWFziw/+pvpswIOPdRwZpdSw/f5Hixu8PxYJG088UlQ8odVCa9bNqfmkGd+IPK6bRwAR0vv1HvIITzhsw==", + "requires": { + "apollo-codegen-core": "0.33.2", + "apollo-env": "0.4.0", + "change-case": "^3.0.1", + "common-tags": "^1.5.1", + "inflected": "^2.0.3" + } + }, + "apollo-codegen-swift": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/apollo-codegen-swift/-/apollo-codegen-swift-0.33.2.tgz", + "integrity": "sha512-+ZD9Deh04d+Iv8nU2R94ZnGj5sjxfAF+NNZoRAR9A7EqEKMNB8tUvwzKQlLnMN3v1J/Rs64Jlk84VbKMpbPgWQ==", + "requires": { + "apollo-codegen-core": "0.33.2", + "apollo-env": "0.4.0", + "change-case": "^3.0.1", + "common-tags": "^1.5.1", + "inflected": "^2.0.3" + } + }, + "apollo-codegen-typescript": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/apollo-codegen-typescript/-/apollo-codegen-typescript-0.33.2.tgz", + "integrity": "sha512-jE0sSbt1GXUjRVCgqMQqgbyDjc/HKD2UN55PG4K6wOfPQIzUkx6ZLFBhXJONrnXggQthZyT9h7LcGgvL4EEa1Q==", + "requires": { + "@babel/generator": "7.4.0", + "@babel/types": "7.4.0", + "apollo-codegen-core": "0.33.2", + "apollo-env": "0.4.0", + "change-case": "^3.0.1", + "common-tags": "^1.5.1", + "inflected": "^2.0.3" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "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=" + } + } + }, + "apollo-datasource": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.3.1.tgz", + "integrity": "sha512-qdEUeonc9pPZvYwXK36h2NZoT7Pddmy0HYOzdV0ON5pcG1YtNmUyyYi83Q60V5wTWjuaCjyJ9hOY6wr0BMvQuA==", + "requires": { + "apollo-server-caching": "0.3.1", + "apollo-server-env": "2.2.0" + } + }, + "apollo-env": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.4.0.tgz", + "integrity": "sha512-TZpk59RTbXd8cEqwmI0KHFoRrgBRplvPAP4bbRrX4uDSxXvoiY0Y6tQYUlJ35zi398Hob45mXfrZxeRDzoFMkQ==", + "requires": { + "core-js": "3.0.0-beta.13", + "node-fetch": "^2.2.0", + "sha.js": "^2.4.11" + }, + "dependencies": { + "core-js": { + "version": "3.0.0-beta.13", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.0-beta.13.tgz", + "integrity": "sha512-16Q43c/3LT9NyePUJKL8nRIQgYWjcBhjJSMWg96PVSxoS0PeE0NHitPI3opBrs9MGGHjte1KoEVr9W63YKlTXQ==" + }, + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" + } + } + }, + "apollo-graphql": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.2.0.tgz", + "integrity": "sha512-wwKynD31Yw1L93IAtnEyhSxBhK4X7NXqkY6wBKWRQ4xph5uJKGgmcQmq3sPieKJT91BGL4AQBv+cwGD3blbLNA==", + "requires": { + "apollo-env": "0.4.0", + "lodash.sortby": "^4.7.0" + } + }, + "apollo-language-server": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/apollo-language-server/-/apollo-language-server-1.6.2.tgz", + "integrity": "sha512-t3jjvyZtLr/PG6R4vtF6AD3eLu75npWIjUikh6KA8YT8c35IHEf55tNpYCDAJCVWszn6HGokKVtmFr6u5J+6Gg==", + "requires": { + "@apollographql/apollo-tools": "0.3.5", + "@apollographql/graphql-language-service-interface": "^2.0.2", + "@endemolshinegroup/cosmiconfig-typescript-loader": "^1.0.0", + "apollo-datasource": "^0.3.0", + "apollo-env": "0.4.0", + "apollo-link": "^1.2.3", + "apollo-link-context": "^1.0.9", + "apollo-link-error": "^1.1.1", + "apollo-link-http": "^1.5.5", + "apollo-link-ws": "^1.0.9", + "apollo-server-errors": "^2.0.2", + "await-to-js": "^2.0.1", + "core-js": "3.0.0-beta.13", + "cosmiconfig": "^5.0.6", + "dotenv": "^7.0.0", + "glob": "^7.1.3", + "graphql": "^14.0.2", + "graphql-tag": "^2.10.1", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "minimist": "^1.2.0", + "moment": "^2.22.2", + "recursive-readdir": "^2.2.2", + "subscriptions-transport-ws": "^0.9.15", + "vscode-languageserver": "^5.1.0", + "vscode-uri": "^1.0.6", + "ws": "^6.1.0" + }, + "dependencies": { + "core-js": { + "version": "3.0.0-beta.13", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.0-beta.13.tgz", + "integrity": "sha512-16Q43c/3LT9NyePUJKL8nRIQgYWjcBhjJSMWg96PVSxoS0PeE0NHitPI3opBrs9MGGHjte1KoEVr9W63YKlTXQ==" + }, + "cosmiconfig": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", + "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.0", + "parse-json": "^4.0.0" + } + }, + "dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==" + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graphql-tag": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", + "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "apollo-link": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.5.tgz", + "integrity": "sha512-GJHEE4B06oEB58mpRRwW6ISyvgX2aCqCLjpcE3M/6/4e+ZVeX7fRGpMJJDq2zZ8n7qWdrEuY315JfxzpsJmUhA==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.12" + } + }, + "apollo-link-batch": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/apollo-link-batch/-/apollo-link-batch-1.1.6.tgz", + "integrity": "sha512-jmNy15zMe3jwT27vyNhC8PqHC8hvHarZ2ui/lvZH77J58+5qBR5X9GmNyGZ1srtuBVynrMnrzBJWlvORmkO54Q==", + "requires": { + "apollo-link": "^1.2.5" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.5.tgz", + "integrity": "sha512-GJHEE4B06oEB58mpRRwW6ISyvgX2aCqCLjpcE3M/6/4e+ZVeX7fRGpMJJDq2zZ8n7qWdrEuY315JfxzpsJmUhA==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.12" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.12.tgz", + "integrity": "sha512-wwqbD6K6CqDd1T67UFg4hgDqnu2YAnFJDCPYmwN/N6Yfa+2QgoSp+nJomh+FWUdOc1A+553/ElvfoW8Vc/vsLg==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } + }, + "apollo-link-batch-http": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/apollo-link-batch-http/-/apollo-link-batch-http-1.2.5.tgz", + "integrity": "sha512-dU8DcH7aKY/mus4apii7FQolAal6nKN5TmOWCU+se/rsykFkQTpvU+hdF2EZvAgqSnNGpKdtgLetoM/GyrNk4A==", + "requires": { + "apollo-link": "^1.2.5", + "apollo-link-batch": "^1.1.6", + "apollo-link-http-common": "^0.2.7" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.5.tgz", + "integrity": "sha512-GJHEE4B06oEB58mpRRwW6ISyvgX2aCqCLjpcE3M/6/4e+ZVeX7fRGpMJJDq2zZ8n7qWdrEuY315JfxzpsJmUhA==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.12" + } + }, + "apollo-link-http-common": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.7.tgz", + "integrity": "sha512-rnn6BWDnd7DR8Xskpicw2dPV2bkXN4cD6VhikdWK982ovmLi7gP67ZXA+Hclox4aEUEhRLJnuprBwzSU3bRtEQ==", + "requires": { + "apollo-link": "^1.2.5" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.12.tgz", + "integrity": "sha512-wwqbD6K6CqDd1T67UFg4hgDqnu2YAnFJDCPYmwN/N6Yfa+2QgoSp+nJomh+FWUdOc1A+553/ElvfoW8Vc/vsLg==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } + }, + "apollo-link-context": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/apollo-link-context/-/apollo-link-context-1.0.10.tgz", + "integrity": "sha512-HX3BEmkANs2A8AcYCy92SFJrW+0SbGrhDTSHV6ZwKIJ9ZrsOtly8cMrRLzEw1emjHIz5SP7XJEn3ko7BwhBBSw==", + "requires": { + "apollo-link": "^1.2.4" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.4.tgz", + "integrity": "sha512-B1z+9H2nTyWEhMXRFSnoZ1vSuAYP+V/EdUJvRx9uZ8yuIBZMm6reyVtr1n0BWlKeSFyPieKJy2RLzmITAAQAMQ==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.11" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz", + "integrity": "sha512-8bs7rgGV4kz5iTb9isudkuQjtWwPnQ8lXq6/T76vrepYZVMsDEv6BXaEA+DHdJSK3KVLduagi9jSpSAJ5NgKHw==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } + }, + "apollo-link-dedup": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/apollo-link-dedup/-/apollo-link-dedup-1.0.11.tgz", + "integrity": "sha512-RcvkXR0CNbQcsw6LdrPksGa+9YjZ1ghk0k2PKal6rSBCyyqzokcBawXOtoMN8q+0FLR1dGs5GnAQVeucQuY28g==", + "requires": { + "apollo-link": "^1.2.4" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.4.tgz", + "integrity": "sha512-B1z+9H2nTyWEhMXRFSnoZ1vSuAYP+V/EdUJvRx9uZ8yuIBZMm6reyVtr1n0BWlKeSFyPieKJy2RLzmITAAQAMQ==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.11" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz", + "integrity": "sha512-8bs7rgGV4kz5iTb9isudkuQjtWwPnQ8lXq6/T76vrepYZVMsDEv6BXaEA+DHdJSK3KVLduagi9jSpSAJ5NgKHw==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } + }, + "apollo-link-error": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.2.tgz", + "integrity": "sha512-zlEZiqQ42E49+BeX3mIKPkMTSlOPrYNEwzSi1MubUiP/Bi6QRP7tzdJXNBnUpkW6MjZJQpfSNZNxK/xwvPiJIw==", + "requires": { + "apollo-link": "^1.2.4" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.4.tgz", + "integrity": "sha512-B1z+9H2nTyWEhMXRFSnoZ1vSuAYP+V/EdUJvRx9uZ8yuIBZMm6reyVtr1n0BWlKeSFyPieKJy2RLzmITAAQAMQ==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.11" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz", + "integrity": "sha512-8bs7rgGV4kz5iTb9isudkuQjtWwPnQ8lXq6/T76vrepYZVMsDEv6BXaEA+DHdJSK3KVLduagi9jSpSAJ5NgKHw==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } + }, + "apollo-link-http": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.7.tgz", + "integrity": "sha512-EZ9nynHjwYCpGYP5IsRrZGTWidUVpshk7MuSG4joqGtJMwpFCgMQz+y3BHdUhowHtfAd9z60XmeOTG9FJolb8A==", + "requires": { + "apollo-link": "^1.2.4", + "apollo-link-http-common": "^0.2.6" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.4.tgz", + "integrity": "sha512-B1z+9H2nTyWEhMXRFSnoZ1vSuAYP+V/EdUJvRx9uZ8yuIBZMm6reyVtr1n0BWlKeSFyPieKJy2RLzmITAAQAMQ==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.11" + } + }, + "apollo-link-http-common": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.6.tgz", + "integrity": "sha512-LUOMWvrZuBP1hyWLBXyaW0KyFeKo79j+k3N+Q4HSkXKbLibnllXQ+JxxoSKGhm0bhREygiLtJAG9JnGlhxGO/Q==", + "requires": { + "apollo-link": "^1.2.4" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz", + "integrity": "sha512-8bs7rgGV4kz5iTb9isudkuQjtWwPnQ8lXq6/T76vrepYZVMsDEv6BXaEA+DHdJSK3KVLduagi9jSpSAJ5NgKHw==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } + }, + "apollo-link-http-common": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.6.tgz", + "integrity": "sha512-LUOMWvrZuBP1hyWLBXyaW0KyFeKo79j+k3N+Q4HSkXKbLibnllXQ+JxxoSKGhm0bhREygiLtJAG9JnGlhxGO/Q==", + "requires": { + "apollo-link": "^1.2.4" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.4.tgz", + "integrity": "sha512-B1z+9H2nTyWEhMXRFSnoZ1vSuAYP+V/EdUJvRx9uZ8yuIBZMm6reyVtr1n0BWlKeSFyPieKJy2RLzmITAAQAMQ==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.11" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz", + "integrity": "sha512-8bs7rgGV4kz5iTb9isudkuQjtWwPnQ8lXq6/T76vrepYZVMsDEv6BXaEA+DHdJSK3KVLduagi9jSpSAJ5NgKHw==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } + }, + "apollo-link-ws": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/apollo-link-ws/-/apollo-link-ws-1.0.17.tgz", + "integrity": "sha512-0PKgahM2BOcUiI3QSJMYXOoUylWKzar5NTZLgMLEW4K/CczOTzC4CTXvKMjh/cx57Jto/U2xzKRy9BEoNfnK5Q==", + "requires": { + "apollo-link": "^1.2.11", + "tslib": "^1.9.3" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.11.tgz", + "integrity": "sha512-PQvRCg13VduLy3X/0L79M6uOpTh5iHdxnxYuo8yL7sJlWybKRJwsv4IcRBJpMFbChOOaHY7Og9wgPo6DLKDKDA==", + "requires": { + "apollo-utilities": "^1.2.1", + "ts-invariant": "^0.3.2", + "tslib": "^1.9.3", + "zen-observable-ts": "^0.8.18" + } + }, + "apollo-utilities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.2.1.tgz", + "integrity": "sha512-Zv8Udp9XTSFiN8oyXOjf6PMHepD4yxxReLsl6dPUy5Ths7jti3nmlBzZUOxuTWRwZn0MoclqL7RQ5UEJN8MAxg==", + "requires": { + "fast-json-stable-stringify": "^2.0.0", + "ts-invariant": "^0.2.1", + "tslib": "^1.9.3" + }, + "dependencies": { + "ts-invariant": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.2.1.tgz", + "integrity": "sha512-Z/JSxzVmhTo50I+LKagEISFJW3pvPCqsMWLamCTX8Kr3N5aMrnGOqcflbe5hLUzwjvgPfnLzQtHZv0yWQ+FIHg==", + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "zen-observable-ts": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.18.tgz", + "integrity": "sha512-q7d05s75Rn1j39U5Oapg3HI2wzriVwERVo4N7uFGpIYuHB9ff02P/E92P9B8T7QVC93jCMHpbXH7X0eVR5LA7A==", + "requires": { + "tslib": "^1.9.3", + "zen-observable": "^0.8.0" + } + } + } + }, + "apollo-server-caching": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.3.1.tgz", + "integrity": "sha512-mfxzikYXbB/OoEms77AGYwRh7FF3Oim5v5XWAL+VL49FrkbZt5lopVa4bABi7Mz8Nt3Htl9EBJN8765s/yh8IA==", + "requires": { + "lru-cache": "^5.0.0" + }, + "dependencies": { + "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==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "apollo-server-env": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.2.0.tgz", + "integrity": "sha512-wjJiI5nQWPBpNmpiLP389Ezpstp71szS6DHAeTgYLb/ulCw3CTuuA+0/E1bsThVWiQaDeHZE0sE3yI8q2zrYiA==", + "requires": { + "node-fetch": "^2.1.2", + "util.promisify": "^1.0.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" + } + } + }, + "apollo-server-errors": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.2.1.tgz", + "integrity": "sha512-wY/YE3iJVMYC+WYIf8QODBjIP4jhI+oc7kiYo9mrz7LdYPKAgxr/he+NteGcqn/0Ea9K5/ZFTGJDbEstSMeP8g==" + }, + "apollo-upload-client": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-9.1.0.tgz", + "integrity": "sha512-ZN5gsbBjImEZTWWTUHpCEGDasnoBGbaODpznQ5EawyNHceuFYSNJbbft+ZZ841vZAcj9XZdKUKoaLBlMZ/r7nw==", + "requires": { + "apollo-link": "^1.2.3", + "apollo-link-http-common": "^0.2.5", + "extract-files": "^4.0.0" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.4.tgz", + "integrity": "sha512-B1z+9H2nTyWEhMXRFSnoZ1vSuAYP+V/EdUJvRx9uZ8yuIBZMm6reyVtr1n0BWlKeSFyPieKJy2RLzmITAAQAMQ==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.11" + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz", + "integrity": "sha512-8bs7rgGV4kz5iTb9isudkuQjtWwPnQ8lXq6/T76vrepYZVMsDEv6BXaEA+DHdJSK3KVLduagi9jSpSAJ5NgKHw==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } + }, + "apollo-utilities": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.8.tgz", + "integrity": "sha512-EvqRJCw5xy2gWeH37toUimbEkmUxronCosBNE4tOCJvZUMLLGB8CuTQ5RsBhKJm+rZ6kwGxV+2uszk14f/P/rA==" + }, + "app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "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-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", + "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1" + } + }, + "array.prototype.flatmap": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.1.tgz", + "integrity": "sha512-i18e2APdsiezkcqDyZor78Pbfjfds3S94dG6dgIV2ZASJaUf1N0dz2tGdrmwrmlZuNUgxH+wz6Z0zYVH2c5xzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "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": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.7.tgz", + "integrity": "sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "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 + }, + "attr-accept": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz", + "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==", + "requires": { + "core-js": "^2.5.0" + } + }, + "await-to-js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-2.1.1.tgz", + "integrity": "sha512-CHBC6gQGCIzjZ09tJ+XmpQoZOn4GdWePB4qUweCaKNJ0D3f115YdhmYVTZ4rMVpiJ3cFzZcTYK1VMYEICV4YXw==" + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "dev": true + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-helper-evaluate-path": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz", + "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==", + "dev": true + }, + "babel-helper-flip-expressions": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz", + "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=", + "dev": true + }, + "babel-helper-is-nodes-equiv": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", + "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", + "dev": true + }, + "babel-helper-is-void-0": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz", + "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=", + "dev": true + }, + "babel-helper-mark-eval-scopes": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz", + "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=", + "dev": true + }, + "babel-helper-remove-or-void": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz", + "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=", + "dev": true + }, + "babel-helper-to-multiple-sequence-expressions": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz", + "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==", + "dev": true + }, + "babel-jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } + }, + "babel-loader": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.4.tgz", + "integrity": "sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw==", + "dev": true, + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", + "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, + "babel-plugin-macros": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.4.5.tgz", + "integrity": "sha512-+/9yteNQw3yuZ3krQUfjAeoT/f4EAdn3ELwhFfDj0rTMIaoHfIdrcLePOfIaL0qmFLpIcgPIL2Lzm58h+CGWaw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.5", + "resolve": "^1.8.1" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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" + } + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "babel-plugin-minify-builtins": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz", + "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==", + "dev": true + }, + "babel-plugin-minify-constant-folding": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz", + "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "^0.5.0" + } + }, + "babel-plugin-minify-dead-code-elimination": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.0.tgz", + "integrity": "sha512-XQteBGXlgEoAKc/BhO6oafUdT4LBa7ARi55mxoyhLHNuA+RlzRmeMAfc31pb/UqU01wBzRc36YqHQzopnkd/6Q==", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-mark-eval-scopes": "^0.4.3", + "babel-helper-remove-or-void": "^0.4.3", + "lodash.some": "^4.6.0" + } + }, + "babel-plugin-minify-flip-comparisons": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz", + "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=", + "dev": true, + "requires": { + "babel-helper-is-void-0": "^0.4.3" + } + }, + "babel-plugin-minify-guarded-expressions": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.3.tgz", + "integrity": "sha1-zHCbRFP9IbHzAod0RMifiEJ845c=", + "dev": true, + "requires": { + "babel-helper-flip-expressions": "^0.4.3" + } + }, + "babel-plugin-minify-infinity": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz", + "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=", + "dev": true + }, + "babel-plugin-minify-mangle-names": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz", + "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==", + "dev": true, + "requires": { + "babel-helper-mark-eval-scopes": "^0.4.3" + } + }, + "babel-plugin-minify-numeric-literals": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz", + "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=", + "dev": true + }, + "babel-plugin-minify-replace": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz", + "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==", + "dev": true + }, + "babel-plugin-minify-simplify": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.0.tgz", + "integrity": "sha512-TM01J/YcKZ8XIQd1Z3nF2AdWHoDsarjtZ5fWPDksYZNsoOjQ2UO2EWm824Ym6sp127m44gPlLFiO5KFxU8pA5Q==", + "dev": true, + "requires": { + "babel-helper-flip-expressions": "^0.4.3", + "babel-helper-is-nodes-equiv": "^0.0.1", + "babel-helper-to-multiple-sequence-expressions": "^0.5.0" + } + }, + "babel-plugin-minify-type-constructors": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz", + "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=", + "dev": true, + "requires": { + "babel-helper-is-void-0": "^0.4.3" + } + }, + "babel-plugin-named-asset-import": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.2.3.tgz", + "integrity": "sha512-9mx2Z9M4EGbutvXxoLV7aUBCY6ps3sqLFl094FeA2tFQzQffIh0XSsmwwQRxiSfpg3rnb5x/o46qRLxS/OzFTg==", + "dev": true + }, + "babel-plugin-react-docgen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-2.0.0.tgz", + "integrity": "sha512-AaA6IPxCF1EkzpFG41GkVh/VGdoBejPF6oIub2K8E6AD3kwnTZ0DIKG7f20a7zmqBEeO8GkFWdM7tYd9Owkc+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10", + "react-docgen": "^3.0.0-rc.1" + } + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-inline-consecutive-adds": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", + "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=", + "dev": true + }, + "babel-plugin-transform-member-expression-literals": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", + "integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8=", + "dev": true + }, + "babel-plugin-transform-merge-sibling-variables": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz", + "integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4=", + "dev": true + }, + "babel-plugin-transform-minify-booleans": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz", + "integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=", + "dev": true + }, + "babel-plugin-transform-property-literals": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz", + "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.18.tgz", + "integrity": "sha512-azed2nHo8vmOy7EY26KH+om5oOcWRs0r1U8wOmhwta+SBMMnmJ4H6yaBZRCcHBtMeWp9AVhvBTL/lpR1kEx+Xw==", + "dev": true + }, + "babel-plugin-transform-regexp-constructors": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz", + "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=", + "dev": true + }, + "babel-plugin-transform-remove-console": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", + "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=", + "dev": true + }, + "babel-plugin-transform-remove-debugger": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz", + "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=", + "dev": true + }, + "babel-plugin-transform-remove-undefined": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz", + "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "^0.5.0" + } + }, + "babel-plugin-transform-simplify-comparison-operators": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", + "integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk=", + "dev": true + }, + "babel-plugin-transform-undefined-to-void": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz", + "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=", + "dev": true + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-preset-minify": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.0.tgz", + "integrity": "sha512-xj1s9Mon+RFubH569vrGCayA9Fm2GMsCgDRm1Jb8SgctOB7KFcrVc2o8K3YHUyMz+SWP8aea75BoS8YfsXXuiA==", + "dev": true, + "requires": { + "babel-plugin-minify-builtins": "^0.5.0", + "babel-plugin-minify-constant-folding": "^0.5.0", + "babel-plugin-minify-dead-code-elimination": "^0.5.0", + "babel-plugin-minify-flip-comparisons": "^0.4.3", + "babel-plugin-minify-guarded-expressions": "^0.4.3", + "babel-plugin-minify-infinity": "^0.4.3", + "babel-plugin-minify-mangle-names": "^0.5.0", + "babel-plugin-minify-numeric-literals": "^0.4.3", + "babel-plugin-minify-replace": "^0.5.0", + "babel-plugin-minify-simplify": "^0.5.0", + "babel-plugin-minify-type-constructors": "^0.4.3", + "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", + "babel-plugin-transform-member-expression-literals": "^6.9.4", + "babel-plugin-transform-merge-sibling-variables": "^6.9.4", + "babel-plugin-transform-minify-booleans": "^6.9.4", + "babel-plugin-transform-property-literals": "^6.9.4", + "babel-plugin-transform-regexp-constructors": "^0.4.3", + "babel-plugin-transform-remove-console": "^6.9.4", + "babel-plugin-transform-remove-debugger": "^6.9.4", + "babel-plugin-transform-remove-undefined": "^0.5.0", + "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", + "babel-plugin-transform-undefined-to-void": "^6.9.4", + "lodash.isplainobject": "^4.0.6" + } + }, + "babel-preset-react-app": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-6.1.0.tgz", + "integrity": "sha512-8PJ4N+acfYsjhDK4gMWkqJMVRMjDKb93D+nz7lWlNe73Jcv38FNu37i5K/dVQnFDdRYHbe1SjII+Y0mCgink9A==", + "dev": true, + "requires": { + "@babel/core": "7.1.0", + "@babel/plugin-proposal-class-properties": "7.1.0", + "@babel/plugin-proposal-decorators": "7.1.2", + "@babel/plugin-proposal-object-rest-spread": "7.0.0", + "@babel/plugin-syntax-dynamic-import": "7.0.0", + "@babel/plugin-transform-classes": "7.1.0", + "@babel/plugin-transform-destructuring": "7.0.0", + "@babel/plugin-transform-flow-strip-types": "7.0.0", + "@babel/plugin-transform-react-constant-elements": "7.0.0", + "@babel/plugin-transform-react-display-name": "7.0.0", + "@babel/plugin-transform-runtime": "7.1.0", + "@babel/preset-env": "7.1.0", + "@babel/preset-react": "7.0.0", + "@babel/preset-typescript": "7.1.0", + "@babel/runtime": "7.0.0", + "babel-loader": "8.0.4", + "babel-plugin-dynamic-import-node": "2.2.0", + "babel-plugin-macros": "2.4.2", + "babel-plugin-transform-react-remove-prop-types": "0.4.18" + }, + "dependencies": { + "@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/core": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.0.tgz", + "integrity": "sha512-9EWmD0cQAbcXSc+31RIoYgEHx3KQ2CCSMDBhnXrShWvo45TMw+3/55KVxlhkG53kw9tl87DqINgHDgFVhZJV/Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.0.0", + "@babel/helpers": "^7.1.0", + "@babel/parser": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0", + "convert-source-map": "^1.1.0", + "debug": "^3.1.0", + "json5": "^0.5.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", + "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==", + "dev": true + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz", + "integrity": "sha512-/PCJWN+CKt5v1xcGn4vnuu13QDoV+P7NcICP44BoonAJoPSGwVkgrXihFIQGiEjjPlUDBIw1cM7wYFLARS2/hw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/plugin-syntax-class-properties": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.2.tgz", + "integrity": "sha512-YooynBO6PmBgHvAd0fl5e5Tq/a0pEC6RqF62ouafme8FzdIVH41Mz/u1dn8fFVm4jzEJ+g/MsOxouwybJPuP8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.1.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz", + "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz", + "integrity": "sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz", + "integrity": "sha512-Fr2GtF8YJSXGTyFPakPFB4ODaEKGU04bPsAllAIabwoXdFrPxL0LVXQX5dQWoxOjjgozarJcC9eWGsj0fD6Zsg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0.tgz", + "integrity": "sha512-WhXUNb4It5a19RsgKKbQPrjmy4yWOY1KynpEbNw7bnd1QTcrT/EIl3MJvnGgpgvrKyKbqX7nUNOJfkpLOnoDKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.0.0.tgz", + "integrity": "sha512-z8yrW4KCVcqPYr0r9dHXe7fu3daLzn0r6TQEFoGbXahdrzEwT1d1ux+/EnFcqIHv9uPilUlnRnPIUf7GMO0ehg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz", + "integrity": "sha512-BX8xKuQTO0HzINxT6j/GiCwoJB0AOMs0HmLbEnAvcte8U8rSkNa/eSCAY+l1OA4JnCVq2jw2p6U8QQryy2fTPg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/preset-env": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.0.tgz", + "integrity": "sha512-ZLVSynfAoDHB/34A17/JCZbyrzbQj59QC1Anyueb4Bwjh373nVPq5/HMph0z+tCmcDjXDe+DlKQq9ywQuvWrQg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.1.0", + "@babel/plugin-proposal-json-strings": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.0.0", + "@babel/plugin-syntax-async-generators": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.1.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.1.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-dotall-regex": "^7.0.0", + "@babel/plugin-transform-duplicate-keys": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.1.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.1.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-amd": "^7.1.0", + "@babel/plugin-transform-modules-commonjs": "^7.1.0", + "@babel/plugin-transform-modules-systemjs": "^7.0.0", + "@babel/plugin-transform-modules-umd": "^7.1.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.1.0", + "@babel/plugin-transform-parameters": "^7.1.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typeof-symbol": "^7.0.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "browserslist": "^4.1.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + } + }, + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "babel-plugin-macros": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.4.2.tgz", + "integrity": "sha512-NBVpEWN4OQ/bHnu1fyDaAaTPAjnhXCEPqr1RwqxrU7b6tZ2hypp+zX4hlNfmVGfClD5c3Sl6Hfj5TJNF5VG5aA==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.5", + "resolve": "^1.8.1" + }, + "dependencies": { + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "browserslist": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.0.tgz", + "integrity": "sha512-tQkHS8VVxWbrjnNDXgt7/+SuPJ7qDvD0Y2e6bLtoQluR2SPvlmPUcfcU75L1KAalhqULlIFJlJ6BDfnYyJxJsw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000928", + "electron-to-chromium": "^1.3.100", + "node-releases": "^1.1.3" + } + }, + "caniuse-lite": { + "version": "1.0.30000929", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz", + "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==", + "dev": true + }, + "cosmiconfig": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz", + "integrity": "sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ==", + "dev": true + }, + "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 + }, + "js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "node-releases": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz", + "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "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" + } + }, + "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 + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "bail": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", + "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "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": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "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 + }, + "boxen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-2.1.0.tgz", + "integrity": "sha512-luq3RQOt2U5sUX+fiu+qnT+wWnHDcATLpEe63jvge6GUZO99AKbVRfp97d2jgLvq1iQa0ORzaAm4lGVG52ZSlw==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.0.0", + "chalk": "^2.4.1", + "cli-boxes": "^1.0.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "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" + } + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "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" + } + }, + "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 + }, + "string-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + } + } + }, + "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" + } + } + } + }, + "brcast": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.1.tgz", + "integrity": "sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg==" + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "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.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + }, + "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 + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "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": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-oEZgAFfEvKtjSRCu6VgYkuGxwrWXMnQzyBmlLPP7r6PWQVtHxP5Z5N6XsuJvtoVax78am/r7lr46bwo3IVEBOg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "ccount": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", + "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", + "dev": true + }, + "chain-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.0.tgz", + "integrity": "sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w=" + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.2.0" + } + }, + "change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "requires": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" + }, + "child-process-promise": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", + "integrity": "sha1-RzChHvYQ+tRQuPIjx50x172tgHQ=", + "dev": true, + "requires": { + "cross-spawn": "^4.0.2", + "node-version": "^1.0.0", + "promise-polyfill": "^6.0.1" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "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" + }, + "dependencies": { + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": 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 + }, + "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" + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + } + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "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" + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "cli-ux": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-4.9.3.tgz", + "integrity": "sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA==", + "requires": { + "@oclif/errors": "^1.2.2", + "@oclif/linewrap": "^1.0.0", + "@oclif/screen": "^1.0.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "clean-stack": "^2.0.0", + "extract-stack": "^1.0.0", + "fs-extra": "^7.0.0", + "hyperlinker": "^1.0.0", + "indent-string": "^3.2.0", + "is-wsl": "^1.1.0", + "lodash": "^4.17.11", + "password-prompt": "^1.0.7", + "semver": "^5.6.0", + "strip-ansi": "^5.0.0", + "supports-color": "^5.5.0", + "supports-hyperlinks": "^1.0.1", + "treeify": "^1.1.0", + "tslib": "^1.9.3" + }, + "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==" + }, + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "clean-stack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.1.0.tgz", + "integrity": "sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA==" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz", + "integrity": "sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.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=" + }, + "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.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "comma-separated-tokens": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.5.tgz", + "integrity": "sha512-Cg90/fcK93n0ecgYTAz1jaA3zvnQ0ExlmKY1rdbyHqAx6BHxwoJc+J7HDu0iuQ7ixEs1qaa+WyQ6oeuBpYP1iA==", + "dev": true, + "requires": { + "trim": "0.0.1" + } + }, + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", + "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + }, + "dependencies": { + "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 + } + } + }, + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "requires": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "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==" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "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=" + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-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" + } + }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "dev": true, + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "create-react-context": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", + "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "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-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "css-tree": { + "version": "1.0.0-alpha.28", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", + "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "dev": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + }, + "css-url-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", + "dev": true + }, + "css-vendor": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", + "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=", + "requires": { + "is-in-browser": "^1.0.2" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssom": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "dev": true + }, + "cssstyle": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", + "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "csstype": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.5.3.tgz", + "integrity": "sha512-G5HnoK8nOiAq3DXIEoY2n/8Vb7Lgrms+jGJl8E4EJpQEeVONEnPFJSl8IK505wPBoxxtrtHhrRm4WX2GgdqarA==" + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debounce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", + "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "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=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", + "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==" + }, + "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" + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "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": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + }, + "is-path-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", + "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", + "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" + } + }, + "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 + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "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 + }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==" + }, + "diff-sequences": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", + "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "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" + } + }, + "dir-glob": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.1.tgz", + "integrity": "sha512-UN6X6XwRjllabfRhBdkVSo63uurJ8nSvMGrwl94EYVz6g+exhTV+yVSYk5VC/xl3MBFBTtC0J20uFKce4Brrng==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, + "dnd-core": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-7.4.4.tgz", + "integrity": "sha512-xR8SINDCJG9AmKSjXUMJ1PEl8ih1+xSHH8x4DgBtzScXnEtpCnV1ibDZNV0uyps9VgkXTTbYYzJdF04y0v0e3Q==", + "requires": { + "asap": "^2.0.6", + "invariant": "^2.2.4", + "redux": "^4.0.1" + } + }, + "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" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-helpers": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", + "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", + "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.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", + "requires": { + "no-case": "^2.2.0" + } + }, + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", + "dev": true + }, + "dotenv-expand": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", + "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", + "dev": true + }, + "dotenv-webpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.6.0.tgz", + "integrity": "sha512-jTbHXmcVw3KMVhTdgthYNLWWHRGtucrADpZWwVCdiP+pCvuWvxLcUadwEnmz8Wqv/d2UAJxJhp1jrxGlMYCetg==", + "dev": true, + "requires": { + "dotenv": "^5.0.1", + "dotenv-expand": "^4.0.1" + } + }, + "downshift": { + "version": "1.31.14", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-1.31.14.tgz", + "integrity": "sha512-KguEqOCAykRVkBG8kB1YMOf4RWolupoUMW3cv6VLVBQw+yOB1BrROX4MbUoCqDaj9vBZS7DNqz7VBqfM4x3dsg==" + }, + "draft-js": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.10.5.tgz", + "integrity": "sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg==", + "requires": { + "fbjs": "^0.8.15", + "immutable": "~3.7.4", + "object-assign": "^4.1.0" + }, + "dependencies": { + "immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" + } + } + }, + "draftail": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/draftail/-/draftail-1.1.0.tgz", + "integrity": "sha512-wELmjR4cDBgXRZr31PhB2RTR34OO79+kgAG8kdWC17aV6zziKgY/LMjz3OJPvQzSOP41U9GIx0qFESw9O5Yxgg==", + "requires": { + "draftjs-conductor": "^0.4.1", + "draftjs-filters": "^2.2.3" + } + }, + "draftjs-conductor": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/draftjs-conductor/-/draftjs-conductor-0.4.1.tgz", + "integrity": "sha512-5BcJLdYLNIA/TNp/9xwIeD1quWsWEoi0ZI81TiW3vLecBEQgWKVxuKZaLdaXHYpW4/kdQvAJz2KcOBTpJkYBxg==" + }, + "draftjs-filters": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/draftjs-filters/-/draftjs-filters-2.2.3.tgz", + "integrity": "sha512-xbpXgjTtFzaMp9P9xlaqmf3NpP4yYM3OT3HbodUQpI4t2kO9ltJTo0+3H+1PlsUPKoc7jPthiE0MYN/VMrsuNw==" + }, + "draftjs-to-html": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/draftjs-to-html/-/draftjs-to-html-0.8.4.tgz", + "integrity": "sha512-+4hekxc8dTJvKk6usiEsFX9O1uOD9vLZZOs9ZI3RhTe89yNmtazYII/ILDXfbMPfzNaYfX7Gf3zjRm6UUFxqyg==" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "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.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=" + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "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==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", + "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "env-ci": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.2.0.tgz", + "integrity": "sha512-TFjNiDlXrL8/pfHswdvJGEZzJcq3aBPb8Eka83hlGLwuNw9F9BC9S9ETlkfkItLRT9k5JgpGgeP+rL6/3cEbcw==", + "requires": { + "execa": "^1.0.0", + "java-properties": "^0.2.9" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "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" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "enzyme": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.7.0.tgz", + "integrity": "sha512-QLWx+krGK6iDNyR1KlH5YPZqxZCQaVF6ike1eDJAOg0HvSkSCVImPsdWaNw6v+VrnK92Kg8jIOYhuOSS9sBpyg==", + "dev": true, + "requires": { + "array.prototype.flat": "^1.2.1", + "cheerio": "^1.0.0-rc.2", + "function.prototype.name": "^1.1.0", + "has": "^1.0.3", + "is-boolean-object": "^1.0.0", + "is-callable": "^1.1.4", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.6.0", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4", + "object.values": "^1.0.4", + "raf": "^3.4.0", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.1.2" + }, + "dependencies": { + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } + }, + "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" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "*" + } + } + } + }, + "enzyme-adapter-react-16": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.7.0.tgz", + "integrity": "sha512-rDr0xlnnFPffAPYrvG97QYJaRl9unVDslKee33wTStsBEwZTkESX1H7VHGT5eUc6ifNzPgOJGvSh2zpHT4gXjA==", + "dev": true, + "requires": { + "enzyme-adapter-utils": "^1.9.0", + "function.prototype.name": "^1.1.0", + "object.assign": "^4.1.0", + "object.values": "^1.0.4", + "prop-types": "^15.6.2", + "react-is": "^16.6.1", + "react-test-renderer": "^16.0.0-0" + }, + "dependencies": { + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "react-is": { + "version": "16.6.3", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.6.3.tgz", + "integrity": "sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA==", + "dev": true + } + } + }, + "enzyme-adapter-utils": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.9.0.tgz", + "integrity": "sha512-uMe4xw4l/Iloh2Fz+EO23XUYMEQXj5k/5ioLUXCNOUCI8Dml5XQMO9+QwUq962hBsY5qftfHHns+d990byWHvg==", + "dev": true, + "requires": { + "function.prototype.name": "^1.1.0", + "object.assign": "^4.1.0", + "prop-types": "^15.6.2", + "semver": "^5.6.0" + }, + "dependencies": { + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, + "enzyme-to-json": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.3.5.tgz", + "integrity": "sha512-DmH1wJ68HyPqKSYXdQqB33ZotwfUhwQZW3IGXaNXgR69Iodaoj8TF/D9RjLdz4pEhGq2Tx2zwNUIjBuqoZeTgA==", + "dev": true, + "requires": { + "lodash": "^4.17.4" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es5-shim": { + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.12.tgz", + "integrity": "sha512-MjoCAHE6P2Dirme70Cxd9i2Ng8rhXiaVSsxDWdSwimfLERJL/ypR2ed2rTYkeeYrMk8gq281dzKLiGcdrmc8qg==", + "dev": true + }, + "es6-shim": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.4.tgz", + "integrity": "sha512-oJidbXjN/VWXZJs41E9JEqWzcFbjt43JupimIoVX82Thzt5qy1CiYezdhRmWkj3KOuwJ106IG/ZZrcFC6fgIUQ==", + "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=" + }, + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "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, + "optional": true + } + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": ">=0.0.5" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expect": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.7.1.tgz", + "integrity": "sha512-mGfvMTPduksV3xoI0xur56pQsg2vJjNf5+a+bXOjqCkiCBbmCayrBbHS/75y9K430cfqyocPr2ZjiNiRx4SRKw==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.3.0", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-regex-util": "^24.3.0" + }, + "dependencies": { + "@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/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" + } + }, + "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 + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-diff": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.7.0.tgz", + "integrity": "sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "jest-matcher-utils": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz", + "integrity": "sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.7.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-message-util": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz", + "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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 + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "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" + } + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "extract-files": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-4.1.0.tgz", + "integrity": "sha512-2gjdb3dVzr1ie9+K8pupPTnsNkK4qmzbTFOIxghiWoh6nCTajGCGC72ZNYX0nBWy5IOq1FXfRVgvkkLqqE4sdw==" + }, + "extract-stack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-1.0.0.tgz", + "integrity": "sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-array-diff": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/fast-array-diff/-/fast-array-diff-0.2.0.tgz", + "integrity": "sha1-9T6JEQl0/+lgP2LnpePvcfCvU3k=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-glob": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.9" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + } + }, + "file-system-cache": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.0.5.tgz", + "integrity": "sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08=", + "dev": true, + "requires": { + "bluebird": "^3.3.5", + "fs-extra": "^0.30.0", + "ramda": "^0.21.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + } + } + }, + "fined": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", + "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "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.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "dev": true, + "requires": { + "debug": "^3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.5.2.tgz", + "integrity": "sha512-a5IG+xXyKnpruI0CP/anyRLAoxWtp3lzdG6flxicANnoSzz64b12dJ7ASAVRrI2OaWwZR2JyBaMHFQqInhWhIw==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "tapable": "^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" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + }, + "dependencies": { + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + } + } + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + }, + "dependencies": { + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "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 + }, + "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=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "frontend-collective-react-dnd-scrollzone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/frontend-collective-react-dnd-scrollzone/-/frontend-collective-react-dnd-scrollzone-1.0.2.tgz", + "integrity": "sha512-me/D9PZJq9j/sjEjs/OPmm6V6nbaHbhgeQiwrWu0t35lhwAOKWc+QBzzKKcZQeboYTkgE8UvCD9el+5ANp+g5Q==", + "requires": { + "hoist-non-react-statics": "^3.1.0", + "lodash.throttle": "^4.0.1", + "prop-types": "^15.5.9", + "raf": "^3.2.0", + "react": "^16.3.0", + "react-display-name": "^0.2.0", + "react-dom": "^16.3.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.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==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "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" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "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-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "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" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", + "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "is-callable": "^1.1.3" + } + }, + "fuse.js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.3.0.tgz", + "integrity": "sha512-ESBRkGLWMuVkapqYCcNO1uqMg5qbCKkgb+VS6wsy17Rix0/cMS9kSOZoYkjH8Ko//pgJ/EEGu0GTjk2mjX2LGQ==", + "dev": true + }, + "fuzzaldrin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fuzzaldrin/-/fuzzaldrin-2.1.0.tgz", + "integrity": "sha1-kCBMPi/appQbso0WZF1BgGOpDps=" + }, + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "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" + } + }, + "git-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/git-parse/-/git-parse-1.0.3.tgz", + "integrity": "sha512-LlGDePBQ9Lr/jsL3ULrnV8SQL8sk3cdScyc+vAk6jVLkHBOxdIj3JosNWemH2o9pNnGtcqukl+ym1Nl6k5jw0Q==", + "requires": { + "babel-polyfill": "6.26.0", + "byline": "5.0.0", + "util.promisify": "1.0.0" + } + }, + "git-rev-sync": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.12.0.tgz", + "integrity": "sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U=", + "requires": { + "escape-string-regexp": "1.0.5", + "graceful-fs": "4.1.11", + "shelljs": "0.7.7" + }, + "dependencies": { + "shelljs": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", + "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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": "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" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + }, + "dependencies": { + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", + "dev": true + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-modules-path": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", + "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", + "dev": true + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "dev": true + }, + "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" + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graphql": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz", + "integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==", + "requires": { + "iterall": "^1.2.2" + } + }, + "graphql-tag": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.0.tgz", + "integrity": "sha512-9FD6cw976TLLf9WYIUPCaaTpniawIjHWZSwIRZSjrfufJamcXbVVYfN2TWvJYbw0Xf2JjYbl1/f2+wDnBVw3/w==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, + "gzip-size": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", + "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "^1.0.2" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "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-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-util-from-parse5": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.0.tgz", + "integrity": "sha512-A7ev5OseS/J15214cvDdcI62uwovJO2PB60Xhnq7kaxvvQRFDEccuqbkrFXU03GPBGopdPqlpQBRqIcDS/Fjbg==", + "dev": true, + "requires": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + } + }, + "hast-util-parse-selector": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.1.tgz", + "integrity": "sha512-Xyh0v+nHmQvrOqop2Jqd8gOdyQtE8sIP9IQf7mlVDqp924W4w/8Liuguk2L2qei9hARnQSG2m+wAOCxM7npJVw==", + "dev": true + }, + "hastscript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.0.0.tgz", + "integrity": "sha512-xJtuJ8D42Xtq5yJrnDg/KAIxl2cXBXKoiIJwmWX9XMf8113qHTGl/Bf7jEsxmENJ4w6q4Tfl8s/Y6mEZo8x8qw==", + "dev": true, + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.2.0", + "property-information": "^5.0.1", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, + "heroku-cli-util": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/heroku-cli-util/-/heroku-cli-util-8.0.11.tgz", + "integrity": "sha512-cApMBbrfAhFTKs/loXm7zkWRC4kOH1VHoqU5WNgzs2TGKJqQI3QYvxITKE+8iC1Gb1xAy0BCqdGgzx8t7EoeWQ==", + "requires": { + "@heroku-cli/color": "^1.1.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.0.1", + "chalk": "^2.4.1", + "co": "^4.6.0", + "got": "^8.3.1", + "heroku-client": "^3.0.7", + "lodash": "^4.17.10", + "netrc-parser": "^3.1.4", + "opn": "^3.0.3", + "strip-ansi": "^4.0.0", + "supports-color": "^5.4.0", + "tslib": "^1.9.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "opn": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz", + "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=", + "requires": { + "object-assign": "^4.0.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "heroku-client": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/heroku-client/-/heroku-client-3.0.7.tgz", + "integrity": "sha512-wL8d3ufIWGzL8B2U7oPzN+SdcMt6LPqA/x4nb9pDG45IXpr8KO+N4dvX4Vycgn0WrJVDfQnQ1juctJsUwuoeww==", + "requires": { + "is-retry-allowed": "^1.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "history": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/history/-/history-4.9.0.tgz", + "integrity": "sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^0.4.0" + } + }, + "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" + } + }, + "hoist-non-react-statics": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz", + "integrity": "sha512-6Bl6XsDT1ntE0lHbIhr4Kp2PGcleGZ66qu5Jqk8lc0Xc/IeG6gVLmwUGs/K0Us+L8VWoKgj0uWdPMataOsm31w==" + }, + "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" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "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" + } + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "http-call": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.2.3.tgz", + "integrity": "sha512-IkwGruHVHATmnonLKMGX5tkpM0KSn/C240o8/OfBsESRaJacykSia+akhD0d3fljQ5rQPXtBvSrVShAsj+EOUQ==", + "requires": { + "content-type": "^1.0.4", + "debug": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "is-stream": "^1.1.0", + "tunnel-agent": "^0.6.0" + } + }, + "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": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "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.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-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" + } + }, + "httpplease": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/httpplease/-/httpplease-0.16.4.tgz", + "integrity": "sha1-04Lr4jDvUHkIC06f/r8xap51wNo=", + "requires": { + "urllite": "~0.5.0", + "xmlhttprequest": "*", + "xtend": "~3.0.0" + }, + "dependencies": { + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" + } + } + }, + "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 + }, + "hyperlinker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", + "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==" + }, + "hyphenate-style-name": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", + "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=" + }, + "i18next": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-11.2.2.tgz", + "integrity": "sha512-Rld/aWCZUut44b1VdfUCp1n5fDWf9/7hseF7hCl/W3s6zQeWuTT7354JnosYyMbFNbbduv32fte0JBeyMIoM1Q==" + }, + "i18next-browser-languagedetector": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-2.2.0.tgz", + "integrity": "sha512-fKhsaJzXY2anqAPxn9bgxc5NrTcu1GnYiIwGfNFPkpfFneutHnuReb4x4suOVNMf9RTuiCxfR+UAF8aHhv89SQ==" + }, + "i18next-xhr-backend": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-1.5.1.tgz", + "integrity": "sha512-9OLdC/9YxDvTFcgsH5t2BHCODHEotHCa6h7Ly0EUlUC7Y2GS09UeoHOGj3gWKQ3HCqXz8NlH4gOrK3NNc9vPuw==" + }, + "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==" + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "dev": true + }, + "immer": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.7.2.tgz", + "integrity": "sha512-4Urocwu9+XLDJw4Tc6ZCg7APVjjLInCFvO4TwGsAYV5zT6YYSor14dsZR0+0tHlDIN92cFUOq+i7fC00G5vTxA==", + "dev": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, + "immutable-tuple": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/immutable-tuple/-/immutable-tuple-0.4.9.tgz", + "integrity": "sha512-LWbJPZnidF8eczu7XmcnLBsumuyRBkpwIRPCZxlojouhBo5jEBO4toj6n7hMy6IxHU/c+MqDSWkvaTpPlMQcyA==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indefinite-observable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.2.tgz", + "integrity": "sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA==", + "requires": { + "symbol-observable": "1.2.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflected": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inflected/-/inflected-2.0.4.tgz", + "integrity": "sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.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.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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=" + }, + "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=" + }, + "is-dom": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", + "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=", + "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-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "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=" + }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "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-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, + "is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", + "requires": { + "lower-case": "^1.1.0" + } + }, + "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-number-object": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "dev": true + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "requires": { + "symbol-observable": "^1.1.0" + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "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==", + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", + "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" + }, + "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-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", + "requires": { + "upper-case": "^1.1.0" + } + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "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=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.1.tgz", + "integrity": "sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw==", + "dev": true, + "requires": { + "async": "^2.6.1", + "compare-versions": "^3.2.1", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.3", + "istanbul-lib-hook": "^2.0.3", + "istanbul-lib-instrument": "^3.1.0", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.2", + "istanbul-reports": "^2.1.1", + "js-yaml": "^3.12.0", + "make-dir": "^1.3.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "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" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz", + "integrity": "sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz", + "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "supports-color": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz", + "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + }, + "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" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "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 + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.1.tgz", + "integrity": "sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==", + "dev": true, + "requires": { + "handlebars": "^4.1.0" + }, + "dependencies": { + "handlebars": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", + "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "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 + } + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "iterall": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + }, + "java-properties": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-0.2.10.tgz", + "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==" + }, + "jest": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz", + "integrity": "sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.7.1" + }, + "dependencies": { + "jest-cli": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.7.1.tgz", + "integrity": "sha512-32OBoSCVPzcTslGFl6yVCMzB2SqX3IrWwZCY5mZYkb0D2WsogmU3eV2o8z7+gRQa4o4sZPX/k7GU+II7CxM6WQ==", + "dev": true, + "requires": { + "@jest/core": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.7.1", + "jest-util": "^24.7.1", + "jest-validate": "^24.7.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^12.0.2" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.7.0.tgz", + "integrity": "sha512-33BgewurnwSfJrW7T5/ZAXGE44o7swLslwh8aUckzq2e17/2Os1V0QU506ZNik3hjs8MgnEMKNkcud442NCDTw==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "execa": "^1.0.0", + "throat": "^4.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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-config": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.7.1.tgz", + "integrity": "sha512-8FlJNLI+X+MU37j7j8RE4DnJkvAghXmBWdArVzypW6WxfGuxiL/CCkzBg0gHtXhD2rxla3IMOSUAHylSKYJ83g==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.7.1", + "@jest/types": "^24.7.0", + "babel-jest": "^24.7.1", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.7.1", + "jest-environment-node": "^24.7.1", + "jest-get-type": "^24.3.0", + "jest-jasmine2": "^24.7.1", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.7.1", + "jest-util": "^24.7.1", + "jest-validate": "^24.7.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.7.0", + "realpath-native": "^1.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 + }, + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "babel-jest": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.7.1.tgz", + "integrity": "sha512-GPnLqfk8Mtt0i4OemjWkChi73A3ALs4w2/QbG64uAj8b5mmwzxc7jbJVRZt8NJkxi6FopVHog9S3xX6UJKb2qg==", + "dev": true, + "requires": { + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.6.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz", + "integrity": "sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.0.0", + "test-exclude": "^5.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", + "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", + "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.6.0" + } + }, + "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" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "test-exclude": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", + "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + } + } + }, + "jest-diff": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.7.0.tgz", + "integrity": "sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-docblock": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", + "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.7.1.tgz", + "integrity": "sha512-4fsS8fEfLa3lfnI1Jw6NxjhyRTgfpuOVTeUZZFyVYqeTa4hPhr2YkToUhouuLTrL2eMGOfpbdMyRx0GQ/VooKA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.3.0", + "jest-util": "^24.7.1", + "pretty-format": "^24.7.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 + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + } + } + }, + "jest-environment-jsdom": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.7.1.tgz", + "integrity": "sha512-Gnhb+RqE2JuQGb3kJsLF8vfqjt3PHKSstq4Xc8ic+ax7QKo4Z0RWGucU3YV+DwKR3T9SYc+3YCUQEJs8r7+Jxg==", + "dev": true, + "requires": { + "@jest/environment": "^24.7.1", + "@jest/fake-timers": "^24.7.1", + "@jest/types": "^24.7.0", + "jest-mock": "^24.7.0", + "jest-util": "^24.7.1", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.7.1.tgz", + "integrity": "sha512-GJJQt1p9/C6aj6yNZMvovZuxTUd+BEJprETdvTKSb4kHcw4mFj8777USQV0FJoJ4V3djpOwA5eWyPwfq//PFBA==", + "dev": true, + "requires": { + "@jest/environment": "^24.7.1", + "@jest/fake-timers": "^24.7.1", + "@jest/types": "^24.7.0", + "jest-mock": "^24.7.0", + "jest-util": "^24.7.1" + } + }, + "jest-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jest-file/-/jest-file-1.0.0.tgz", + "integrity": "sha1-jFmWeL/TrtDTvp9+pgUES/3wFYw=", + "dev": true + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "jest-haste-map": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.7.1.tgz", + "integrity": "sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.4.0", + "jest-util": "^24.7.1", + "jest-worker": "^24.6.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + } + } + }, + "jest-jasmine2": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.7.1.tgz", + "integrity": "sha512-Y/9AOJDV1XS44wNwCaThq4Pw3gBPiOv/s6NcbOAkVRRUEPu+36L2xoPsqQXsDrxoBerqeyslpn2TpCI8Zr6J2w==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.7.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.7.1", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-runtime": "^24.7.1", + "jest-snapshot": "^24.7.1", + "jest-util": "^24.7.1", + "pretty-format": "^24.7.0", + "throat": "^4.0.0" + }, + "dependencies": { + "@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/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" + } + }, + "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 + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-diff": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.7.0.tgz", + "integrity": "sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "jest-matcher-utils": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz", + "integrity": "sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.7.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-message-util": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz", + "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-snapshot": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.7.1.tgz", + "integrity": "sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "expect": "^24.7.1", + "jest-diff": "^24.7.0", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-resolve": "^24.7.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.7.0", + "semver": "^5.5.0" + } + }, + "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "jest-leak-detector": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.7.0.tgz", + "integrity": "sha512-zV0qHKZGXtmPVVzT99CVEcHE9XDf+8LwiE0Ob7jjezERiGVljmqKFWpV2IkG+rkFIEUHFEkMiICu7wnoPM/RoQ==", + "dev": true, + "requires": { + "pretty-format": "^24.7.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 + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + } + } + }, + "jest-matcher-utils": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz", + "integrity": "sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.7.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-message-util": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz", + "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "jest-mock": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.7.0.tgz", + "integrity": "sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-regex-util": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "dev": true + }, + "jest-resolve": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.7.1.tgz", + "integrity": "sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.7.1.tgz", + "integrity": "sha512-2Eyh5LJB2liNzfk4eo7bD1ZyBbqEJIyyrFtZG555cSWW9xVHxII2NuOkSl1yUYTAYCAmM2f2aIT5A7HzNmubyg==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.7.1" + }, + "dependencies": { + "@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/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" + } + }, + "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 + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-diff": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.7.0.tgz", + "integrity": "sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "jest-matcher-utils": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz", + "integrity": "sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.7.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-message-util": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz", + "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-snapshot": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.7.1.tgz", + "integrity": "sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "expect": "^24.7.1", + "jest-diff": "^24.7.0", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-resolve": "^24.7.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.7.0", + "semver": "^5.5.0" + } + }, + "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "jest-runner": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.7.1.tgz", + "integrity": "sha512-aNFc9liWU/xt+G9pobdKZ4qTeG/wnJrJna3VqunziDNsWT3EBpmxXZRBMKCsNMyfy+A/XHiV+tsMLufdsNdgCw==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.7.1", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.7.1", + "jest-jasmine2": "^24.7.1", + "jest-leak-detector": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-resolve": "^24.7.1", + "jest-runtime": "^24.7.1", + "jest-util": "^24.7.1", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "@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/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" + } + }, + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-message-util": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz", + "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "jest-runtime": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.7.1.tgz", + "integrity": "sha512-0VAbyBy7tll3R+82IPJpf6QZkokzXPIS71aDeqh+WzPRXRCNz6StQ45otFariPdJ4FmXpDiArdhZrzNAC3sj6A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.7.1", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/yargs": "^12.0.2", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.7.1", + "jest-haste-map": "^24.7.1", + "jest-message-util": "^24.7.1", + "jest-mock": "^24.7.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.7.1", + "jest-snapshot": "^24.7.1", + "jest-util": "^24.7.1", + "jest-validate": "^24.7.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^12.0.2" + }, + "dependencies": { + "@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/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" + } + }, + "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 + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-diff": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.7.0.tgz", + "integrity": "sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "jest-matcher-utils": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz", + "integrity": "sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.7.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" + } + }, + "jest-message-util": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz", + "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-snapshot": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.7.1.tgz", + "integrity": "sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "expect": "^24.7.1", + "jest-diff": "^24.7.0", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-resolve": "^24.7.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.7.0", + "semver": "^5.5.0" + } + }, + "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "jest-serializer": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", + "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "dev": true + }, + "jest-snapshot": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.7.1.tgz", + "integrity": "sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "expect": "^24.7.1", + "jest-diff": "^24.7.0", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-resolve": "^24.7.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.7.0", + "semver": "^5.5.0" + } + }, + "jest-specific-snapshot": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jest-specific-snapshot/-/jest-specific-snapshot-1.0.0.tgz", + "integrity": "sha512-EjCK8Ob8eneeQCdBuO06J1v1C1jklKK7VvCOG/iwQx+8byZ7iCY8+d9M7xlUJiu76ubycXtSkIrPrL+nqjJsjA==", + "dev": true, + "requires": { + "jest-snapshot": ">=20.0.3" + } + }, + "jest-util": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.7.1.tgz", + "integrity": "sha512-/KilOue2n2rZ5AnEBYoxOXkeTu6vi7cjgQ8MXEkih0oeAXT6JkS3fr7/j8+engCjciOU1Nq5loMSKe0A1oeX0A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/fake-timers": "^24.7.1", + "@jest/source-map": "^24.3.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.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 + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + } + } + }, + "jest-validate": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.7.0.tgz", + "integrity": "sha512-cgai/gts9B2chz1rqVdmLhzYxQbgQurh1PEQSvSgPZ8KGa1AqXsqC45W5wKEwzxKrWqypuQrQxnF4+G9VejJJA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "camelcase": "^5.0.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.3.0", + "leven": "^2.1.0", + "pretty-format": "^24.7.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 + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.7.1.tgz", + "integrity": "sha512-Wd6TepHLRHVKLNPacEsBwlp9raeBIO+01xrN24Dek4ggTS8HHnOzYSFnvp+6MtkkJ3KfMzy220KTi95e2rRkrw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/yargs": "^12.0.9", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.7.1", + "string-length": "^2.0.0" + } + }, + "jest-worker": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", + "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "js-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", + "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "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, + "optional": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "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==" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "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.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "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" + } + }, + "jss": { + "version": "9.8.7", + "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", + "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", + "requires": { + "is-in-browser": "^1.1.3", + "symbol-observable": "^1.1.0", + "warning": "^3.0.0" + } + }, + "jss-camel-case": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", + "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", + "requires": { + "hyphenate-style-name": "^1.0.2" + } + }, + "jss-compose": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jss-compose/-/jss-compose-5.0.0.tgz", + "integrity": "sha512-YofRYuiA0+VbeOw0VjgkyO380sA4+TWDrW52nSluD9n+1FWOlDzNbgpZ/Sb3Y46+DcAbOS21W5jo6SAqUEiuwA==", + "requires": { + "warning": "^3.0.0" + } + }, + "jss-default-unit": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", + "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==" + }, + "jss-expand": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/jss-expand/-/jss-expand-5.3.0.tgz", + "integrity": "sha512-NiM4TbDVE0ykXSAw6dfFmB1LIqXP/jdd0ZMnlvlGgEMkMt+weJIl8Ynq1DsuBY9WwkNyzWktdqcEW2VN0RAtQg==" + }, + "jss-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jss-extend/-/jss-extend-6.2.0.tgz", + "integrity": "sha512-YszrmcB6o9HOsKPszK7NeDBNNjVyiW864jfoiHoMlgMIg2qlxKw70axZHqgczXHDcoyi/0/ikP1XaHDPRvYtEA==", + "requires": { + "warning": "^3.0.0" + } + }, + "jss-global": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", + "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==" + }, + "jss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", + "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", + "requires": { + "warning": "^3.0.0" + } + }, + "jss-plugin-camel-case": { + "version": "10.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.0-alpha.7.tgz", + "integrity": "sha512-Bwrav1ZB0XywdJW6TaEuFhKe1ZpZvUlESh3jsFOvebA9aFTYNCkmHMEqjA5+u9VMxksl3u77nnZHtukpxkzrBA==", + "requires": { + "@babel/runtime": "^7.0.0", + "hyphenate-style-name": "^1.0.2" + } + }, + "jss-plugin-default-unit": { + "version": "10.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.0-alpha.7.tgz", + "integrity": "sha512-auuJUbQaWMxoHOVFPrfZNZpZm9ab8PZeDyvey8nMt2lbokkmZ53UyAnM/1kNsg5BdAXTItcLDxDB3I4gwNU84g==", + "requires": { + "@babel/runtime": "^7.0.0" + } + }, + "jss-plugin-global": { + "version": "10.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.0-alpha.7.tgz", + "integrity": "sha512-OWeoW4szLDgRUKviST+xfilqa8O5uXJCW+O3YonheCRTRJg6rRzlE/b5pfYPoU9UtwvY9n7JvwBX5r3c1lMsEQ==", + "requires": { + "@babel/runtime": "^7.0.0" + } + }, + "jss-plugin-nested": { + "version": "10.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.0-alpha.7.tgz", + "integrity": "sha512-wsRzuIZXAc6WMjc61mREW9cUrDxgSI7dK/fx5c7a06IDUfSn+83NJ30J/RB4oBnbQW9SijV/muujz7IJqpn9Gw==", + "requires": { + "@babel/runtime": "^7.0.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.0-alpha.7.tgz", + "integrity": "sha512-KXOCaHUk1+KXqE0z3q66/w1fDoy+VsZvI77gLxOqTsTrvIKFLX0jarwXogW3CDlaPQQFTZ6JykJJXtPRTBlstA==", + "requires": { + "@babel/runtime": "^7.0.0" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.0-alpha.7.tgz", + "integrity": "sha512-ett83hvIM69/LknmrWndrrdiDlfLfP+rneU5qP7gTOWJ7g1P9GuEL1Tc4CWdZUWBX+T58tgIBP0V1pzWCkP0QA==", + "requires": { + "@babel/runtime": "^7.0.0" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.0-alpha.7.tgz", + "integrity": "sha512-YbIVgqq+dLimOBOEYggho1Iuc0roz4PJSZYyaok9n8JnXVIqPnxYJbr8+bMbvzJ5CL3eeJij/e7L2IPCceRKrA==", + "requires": { + "@babel/runtime": "^7.0.0", + "css-vendor": "^1.1.0" + }, + "dependencies": { + "css-vendor": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-1.2.1.tgz", + "integrity": "sha512-ZpwiWxn5jWNJ7NF3DAb/Dc/+c2lRu+fnovej/adCv3VJsULJSjdXEpUwRcq4fnpAAh98Hi7b0GDnlyoNFcdv1g==", + "requires": { + "@babel/runtime": "^7.3.1", + "is-in-browser": "^1.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + } + } + }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + } + } + }, + "jss-preset-default": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-4.5.0.tgz", + "integrity": "sha512-qZbpRVtHT7hBPpZEBPFfafZKWmq3tA/An5RNqywDsZQGrlinIF/mGD9lmj6jGqu8GrED2SMHZ3pPKLmjCZoiaQ==", + "requires": { + "jss-camel-case": "^6.1.0", + "jss-compose": "^5.0.0", + "jss-default-unit": "^8.0.2", + "jss-expand": "^5.3.0", + "jss-extend": "^6.2.0", + "jss-global": "^3.0.0", + "jss-nested": "^6.0.1", + "jss-props-sort": "^6.0.0", + "jss-template": "^1.0.1", + "jss-vendor-prefixer": "^7.0.0" + } + }, + "jss-props-sort": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", + "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==" + }, + "jss-template": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jss-template/-/jss-template-1.0.1.tgz", + "integrity": "sha512-m5BqEWha17fmIVXm1z8xbJhY6GFJxNB9H68GVnCWPyGYfxiAgY9WTQyvDAVj+pYRgrXSOfN5V1T4+SzN1sJTeg==", + "requires": { + "warning": "^3.0.0" + } + }, + "jss-vendor-prefixer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", + "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", + "requires": { + "css-vendor": "^0.3.8" + } + }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "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" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lazy-universal-dotenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-2.0.0.tgz", + "integrity": "sha512-1Wi0zgZMfRLaRAK21g3odYuU+HE1d85Loe2tb44YhcNwIzhmD49mTPR9aKckpB9Q9Q9mA+hUMLI2xlkcCAe3yw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "app-root-dir": "^1.0.2", + "core-js": "^2.5.7", + "dotenv": "^6.0.0", + "dotenv-expand": "^4.2.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.2.tgz", + "integrity": "sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g==", + "dev": true + }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", + "dev": true + } + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "linear-layout-vector": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/linear-layout-vector/-/linear-layout-vector-0.0.1.tgz", + "integrity": "sha1-OYEU1zA7bsx/1rJzr3uEAdi6nHA=" + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=" + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "requires": { + "chalk": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "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.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "requires": { + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "requires": { + "lodash._reinterpolate": "~3.0.0" + } + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + } + } + } + }, + "loglevel": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "requires": { + "lower-case": "^1.1.2" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "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 + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-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.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "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-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", + "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + }, + "dependencies": { + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "dev": true, + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + } + } + } + } + }, + "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-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "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.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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" + } + }, + "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.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "moment": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" + }, + "moment-timezone": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.21.tgz", + "integrity": "sha512-j96bAh4otsgj3lKydm3K7kdtA3iKf2m6MY2iSYCzCm5a1zmHo1g+aK3068dDEeocLZQIS9kU8bsdQHLqEvgW0A==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "moo": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", + "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", + "dev": true + }, + "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.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", + "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "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-odd": "^2.0.0", + "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": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "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 + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "natural-orderby": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.2.tgz", + "integrity": "sha512-ehKWiU0ZoYJw6JRlxcW3PPNW8xUpomrak7bXLyGzkx4f9eQVs7VpxEFMpGITdgrPuAWd5/9bD1MQha5w3z3v6A==" + }, + "nearley": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.1.tgz", + "integrity": "sha512-8IUY/rUrKz2mIynUGh8k+tul1awMKEjeHHC5G3FHvvyAW6oq4mQfNp2c0BMea+sYZJvYcrrM6GmZVIle/GRXGw==", + "dev": true, + "requires": { + "moo": "^0.4.3", + "nomnom": "~1.6.2", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6", + "semver": "^5.4.1" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.2.tgz", + "integrity": "sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw==", + "dev": true + }, + "netrc-parser": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/netrc-parser/-/netrc-parser-3.1.6.tgz", + "integrity": "sha512-lY+fmkqSwntAAjfP63jB4z5p5WbuZwyMCD3pInT7dpHU/Gc6Vv90SAC6A0aNiqaRGHiuZFBtiwu+pu8W/Eyotw==", + "requires": { + "debug": "^3.1.0", + "execa": "^0.10.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==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "dev": true, + "requires": { + "minimatch": "^3.0.2" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-plop": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.17.3.tgz", + "integrity": "sha512-oITDOxms/0tW0FQIorc/WcK8QxXxW78I6hRSxn7jTSO08KTsfWHsh8J4fGmT4V3GDextl9gyX3juqFl4j1A02A==", + "dev": true, + "requires": { + "change-case": "^3.0.1", + "co": "^4.6.0", + "core-js": "^2.4.1", + "del": "^3.0.0", + "globby": "^8.0.0", + "handlebars": "^4.0.5", + "inquirer": "^6.0.0", + "isbinaryfile": "^3.0.2", + "lodash.get": "^4.4.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.0", + "resolve": "^1.2.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "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" + } + }, + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "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" + } + }, + "inquirer": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "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 + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } + } + } + }, + "node-releases": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.5.tgz", + "integrity": "sha512-Ky7q0BO1BBkG/rQz6PkEZ59rwo+aSfhczHP1wwq8IowoVdN/FpiP7qp0XW0P2+BVCWe5fQUBozdbVd54q1RbCQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "node-version": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", + "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==", + "dev": true + }, + "nomnom": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", + "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", + "dev": true, + "requires": { + "colors": "0.5.x", + "underscore": "~1.4.4" + }, + "dependencies": { + "colors": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-scroll-left": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz", + "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg==" + }, + "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=", + "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.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwsapi": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.3.tgz", + "integrity": "sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "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-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.entries": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", + "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.0.1" + } + }, + "object.fromentries": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-1.0.0.tgz", + "integrity": "sha512-F7XUm84lg0uNXNzrRAC5q8KJe0yYaxgLU9hTSqWYM6Rfnh0YjP24EG3xq7ncj2Wu1AdfueNHKCOlamIonG4UHQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.11.0", + "function-bind": "^1.1.1", + "has": "^1.0.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + }, + "dependencies": { + "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" + } + } + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "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" + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.values": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.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=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimism": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.6.8.tgz", + "integrity": "sha512-bN5n1KCxSqwBDnmgDnzMtQTHdL+uea2HYFx1smvtE+w2AMl0Uy31g0aXnP/Nt85OINnMJPRpJyfRQLTCqn5Weg==", + "requires": { + "immutable-tuple": "^0.4.9" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "original": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", + "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", + "dev": true, + "requires": { + "url-parse": "~1.4.0" + } + }, + "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-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "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" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", + "requires": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "password-prompt": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", + "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", + "requires": { + "ansi-escapes": "^3.1.0", + "cross-spawn": "^6.0.5" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "requires": { + "no-case": "^2.2.0" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "plop": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/plop/-/plop-2.2.0.tgz", + "integrity": "sha512-qt4pCQPL76AzEYX+OPoWsvT+WUbyU15Zkwb3DQa9n5QQcd6np6l6Rh+7oufmxo93olMVScKBaZ1JDy3zyIsaQg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "interpret": "^1.0.0", + "liftoff": "^2.2.0", + "minimist": "^1.2.0", + "node-plop": "=0.17.3", + "ora": "^3.0.0", + "v8flags": "^2.0.10" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "ora": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.0.0.tgz", + "integrity": "sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.1.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^4.0.0", + "wcwidth": "^1.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" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "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" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "popper.js": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.6.tgz", + "integrity": "sha512-AGwHGQBKumlk/MDfrSOf0JHhJCImdDMcGNoqKmKkU+68GFazv3CQ6q9r7Ja1sKDZmYWTckY/uLyEznheTDycnA==" + }, + "portfinder": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "source-map": "^0.6.1", + "supports-color": "^5.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.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.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": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-flexbugs-fixes": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", + "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", + "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" + } + } + } + }, + "postcss": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.13.tgz", + "integrity": "sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg==", + "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-modules-extract-imports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", + "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "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 + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + } + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-polyfill": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", + "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=", + "dev": true + }, + "promise.prototype.finally": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz", + "integrity": "sha512-7p/K2f6dI+dM8yjRQEGrTQs5hTQixUAdOGpMEA3+pVxpX5oHKRSKAXyLw9Q9HUWDTdwtoo39dSHGQtN90HcEwQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.9.0", + "function-bind": "^1.1.1" + } + }, + "prompts": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", + "integrity": "sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==", + "dev": true, + "requires": { + "kleur": "^3.0.2", + "sisteransi": "^1.0.0" + } + }, + "prop-types": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "property-information": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.0.1.tgz", + "integrity": "sha512-nAtBDVeSwFM3Ot/YxT7s4NqZmqXI7lLzf46BThvotEtYf2uk2yH0ACYuWQkJ7gxKs49PPtKVY0UlDGkyN9aJlw==", + "dev": true, + "requires": { + "xtend": "^4.0.1" + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "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" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "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 + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "dev": true + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "ramda": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", + "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "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" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "react": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react/-/react-16.8.4.tgz", + "integrity": "sha512-0GQ6gFXfUH7aZcjGVymlPOASTuSjlQL4ZtVC5YKH+3JL6bBLCVO21DknzmaPlI90LN253ojj02nsapy+j7wIjg==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.4" + }, + "dependencies": { + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + } + } + }, + "react-is": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", + "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==" + }, + "scheduler": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.4.tgz", + "integrity": "sha512-cvSOlRPxOHs5dAhP9yiS/6IDmVAVxmk33f0CtTJRkmUWcb1Us+t7b1wqdzoC0REw2muC9V5f1L/w5R5uKGaepA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, + "react-apollo": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-2.5.2.tgz", + "integrity": "sha512-lmglhG6NQ+lfAUDzx8ZgelWKUbvxBhhy1l7Z2ksgtQ8+FVqwX7i6p5O3zicAZZlIdKzdq82V0kqq5WkxEsffrA==", + "requires": { + "apollo-utilities": "^1.2.1", + "hoist-non-react-statics": "^3.0.0", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.6.0", + "ts-invariant": "^0.3.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "apollo-utilities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.2.1.tgz", + "integrity": "sha512-Zv8Udp9XTSFiN8oyXOjf6PMHepD4yxxReLsl6dPUy5Ths7jti3nmlBzZUOxuTWRwZn0MoclqL7RQ5UEJN8MAxg==", + "requires": { + "fast-json-stable-stringify": "^2.0.0", + "ts-invariant": "^0.2.1", + "tslib": "^1.9.3" + }, + "dependencies": { + "ts-invariant": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.2.1.tgz", + "integrity": "sha512-Z/JSxzVmhTo50I+LKagEISFJW3pvPCqsMWLamCTX8Kr3N5aMrnGOqcflbe5hLUzwjvgPfnLzQtHZv0yWQ+FIHg==", + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + }, + "react-is": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", + "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "react-dev-utils": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-6.1.1.tgz", + "integrity": "sha512-ThbJ86coVd6wV/QiTo8klDTvdAJ1WsFCGQN07+UkN+QN9CtCSsl/+YuDJToKGeG8X4j9HMGXNKbk2QhPAZr43w==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0", + "address": "1.0.3", + "browserslist": "4.1.1", + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "1.0.5", + "filesize": "3.6.1", + "find-up": "3.0.0", + "global-modules": "1.0.0", + "globby": "8.0.1", + "gzip-size": "5.0.0", + "immer": "1.7.2", + "inquirer": "6.2.0", + "is-root": "2.0.0", + "loader-utils": "1.1.0", + "opn": "5.4.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^5.1.0", + "recursive-readdir": "2.2.2", + "shell-quote": "1.6.1", + "sockjs-client": "1.1.5", + "strip-ansi": "4.0.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@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/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" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "browserslist": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.1.1.tgz", + "integrity": "sha512-VBorw+tgpOtZ1BYhrVSVTzTt/3+vSE3eFUh0N2GCFK1HffceOaf32YS/bs6WiFhjDAblAFrx85jMy3BG9fBK2Q==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000884", + "electron-to-chromium": "^1.3.62", + "node-releases": "^1.0.0-alpha.11" + } + }, + "caniuse-lite": { + "version": "1.0.30000929", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz", + "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "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" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, + "electron-to-chromium": { + "version": "1.3.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz", + "integrity": "sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ==", + "dev": true + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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" + } + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^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" + } + }, + "inquirer": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", + "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "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 + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "react-display-name": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.4.tgz", + "integrity": "sha512-zvU6iouW+SWwHTyThwxGICjJYCMZFk/6r/+jmOdC7ntQoPlS/Pqb81MkxaMf2bHTSq9TN3K3zX2/ayMW/jCtyA==" + }, + "react-dnd": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-7.4.5.tgz", + "integrity": "sha512-/689FECqmfNxHZJymC0Ge0Vt5A2oxXwcpVpFjM7O21ifzSh3YtZl83rre6Cosdc4Sx9ucrMq3sRxKMH9p/ekCg==", + "requires": { + "dnd-core": "^7.4.4", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.1.0", + "shallowequal": "^1.1.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + } + } + }, + "react-dnd-html5-backend": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-7.4.4.tgz", + "integrity": "sha512-X/lP92ateY0glHan8mU0JzjBuZL6VHv2Gc/H9OBBxaf/ZCN1oC16MLKdesqG4x1f/NWFTNtuG3W4B99r5gPVog==", + "requires": { + "dnd-core": "^7.4.4" + } + }, + "react-docgen": { + "version": "3.0.0-rc.2", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-3.0.0-rc.2.tgz", + "integrity": "sha512-tXbIvq7Hxdc92jW570rztqsz0adtWEM5FX8bShJYozT2Y6L/LeHvBMQcED6mSqJ72niiNMPV8fi3S37OHrGMEw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.3", + "@babel/runtime": "^7.0.0", + "async": "^2.1.4", + "commander": "^2.19.0", + "doctrine": "^2.0.0", + "node-dir": "^0.1.10", + "recast": "^0.16.0" + }, + "dependencies": { + "@babel/parser": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", + "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==", + "dev": true + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "react-dom": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.4.tgz", + "integrity": "sha512-Ob2wK7XG2tUDt7ps7LtLzGYYB6DXMCLj0G5fO6WeEICtT4/HdpOi7W/xLzZnR6RCG1tYza60nMdqtxzA8FaPJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.4" + }, + "dependencies": { + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + } + } + }, + "react-is": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", + "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==" + }, + "scheduler": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.4.tgz", + "integrity": "sha512-cvSOlRPxOHs5dAhP9yiS/6IDmVAVxmk33f0CtTJRkmUWcb1Us+t7b1wqdzoC0REw2muC9V5f1L/w5R5uKGaepA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, + "react-dropzone": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-8.0.3.tgz", + "integrity": "sha512-3zvEH4szxTHjpNIbuSXY3aIByv6fUao8ZYOqtYucmgduRR+r0c94xMJvrPKyAj9hgWZTJ/0I//PMq+SDZp3MCw==", + "requires": { + "attr-accept": "^1.1.3", + "prop-types": "^15.6.2" + }, + "dependencies": { + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + } + } + }, + "react-error-overlay": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.2.tgz", + "integrity": "sha512-7kEBKwU9R8fKnZJBRa5RSIfay4KJwnYvKB6gODGicUmDSAhQJ7Tdnll5S0RLtYrzRfMVXlqYw61rzrSpP4ThLQ==", + "dev": true + }, + "react-event-listener": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz", + "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", + "requires": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + }, + "dependencies": { + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "react-fuzzy": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/react-fuzzy/-/react-fuzzy-0.5.2.tgz", + "integrity": "sha512-qIZZxaCheb/HhcBi5fABbiCFg85+K5r1TCps1D4uaL0LAMMD/1zm/x1/kNR130Tx7nnY9V7mbFyY0DquPYeLAw==", + "dev": true, + "requires": { + "babel-runtime": "^6.23.0", + "classnames": "^2.2.5", + "fuse.js": "^3.0.1", + "prop-types": "^15.5.9" + } + }, + "react-helmet": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.0.tgz", + "integrity": "sha1-qBgR3yExOm1VxfBYxK66XW89l6c=", + "requires": { + "deep-equal": "^1.0.1", + "object-assign": "^4.1.1", + "prop-types": "^15.5.4", + "react-side-effect": "^1.1.0" + } + }, + "react-infinite-scroller": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/react-infinite-scroller/-/react-infinite-scroller-1.2.4.tgz", + "integrity": "sha512-/oOa0QhZjXPqaD6sictN2edFMsd3kkMiE19Vcz5JDgHpzEJVqYcmq+V3mkwO88087kvKGe1URNksHEOt839Ubw==", + "requires": { + "prop-types": "^15.5.8" + } + }, + "react-inlinesvg": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-0.8.1.tgz", + "integrity": "sha512-rdeqawsT17tKvY3B9rfHsNUpZ9RpDP7URNLCrv4NifWcIoPcBxAc7Vel1pK7hyAYKgv6DDMaf8x9PB3jyWjW4A==", + "requires": { + "httpplease": "^0.16.4", + "once": "^1.4.0" + } + }, + "react-inspector": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-2.3.1.tgz", + "integrity": "sha512-tUUK7t3KWgZEIUktOYko5Ic/oYwvjEvQUFAGC1UeMeDaQ5za2yZFtItJa2RTwBJB//NxPr000WQK6sEbqC6y0Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "is-dom": "^1.0.9", + "prop-types": "^15.6.1" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" + }, + "react-jss": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-8.4.0.tgz", + "integrity": "sha512-yIi4udcTIIh5u4KJ47wsL3UZYMuSrp5xR1YBvPeRNshpCdRoJxt5BWmCu1RA3LIa+//dnRsAtAQmMAYeg1W9oQ==", + "requires": { + "hoist-non-react-statics": "^2.3.1", + "jss": "^9.7.0", + "jss-preset-default": "^4.3.0", + "prop-types": "^15.6.0", + "theming": "^1.3.0" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-modal": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.8.1.tgz", + "integrity": "sha512-aLKeZM9pgXpIKVwopRHMuvqKWiBajkqisDA8UzocdCF6S4fyKVfLWmZR5G1Q0ODBxxxxf2XIwiCP8G/11GJAuw==", + "dev": true, + "requires": { + "exenv": "^1.2.0", + "prop-types": "^15.5.10", + "react-lifecycles-compat": "^3.0.0", + "warning": "^3.0.0" + } + }, + "react-moment": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/react-moment/-/react-moment-0.7.7.tgz", + "integrity": "sha512-ARzgdPQV7NA1s2U8ZZ/y8KFc9MM4zMx+TY9TLxKybKZU55PbLFoiYD9u4XdNeguu47TNgzuTKW5lAZJuIY632g==" + }, + "react-router": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.0.tgz", + "integrity": "sha512-6EQDakGdLG/it2x9EaCt9ZpEEPxnd0OCLBHQ1AcITAAx7nCnyvnzf76jKWG1s2/oJ7SSviUgfWHofdYljFexsA==", + "requires": { + "@babel/runtime": "^7.1.2", + "create-react-context": "^0.2.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + } + } + }, + "react-is": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", + "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==" + } + } + }, + "react-router-dom": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.0.0.tgz", + "integrity": "sha512-wSpja5g9kh5dIteZT3tUoggjnsa+TPFHSMrpHXMpFsaHhQkm/JNVGh2jiF9Dkh4+duj4MKCkwO6H08u6inZYgQ==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + } + } + }, + "react-is": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", + "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==" + } + } + }, + "react-router-navigation-prompt": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/react-router-navigation-prompt/-/react-router-navigation-prompt-1.8.2.tgz", + "integrity": "sha512-jUdoU4Ri3ONhdoAqMW4knCiO4Ql9wy3IRu62BugORFMW5L2Fb3VyE4QHj0puPzVZ5lEeLCddU2vQDZwXiVUZ+g==" + }, + "react-side-effect": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.1.5.tgz", + "integrity": "sha512-Z2ZJE4p/jIfvUpiUMRydEVpQRf2f8GMHczT6qLcARmX7QRb28JDBTpnM2g/i5y/p7ZDEXYGHWg0RbhikE+hJRw==", + "requires": { + "exenv": "^1.2.1", + "shallowequal": "^1.0.1" + }, + "dependencies": { + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + } + } + }, + "react-sortable-hoc": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-0.6.8.tgz", + "integrity": "sha512-sUUAtNdV84AKZ2o+F5lVOOFWcyWG6aGDkNFgHoieB1zFLeWLWENkix06asPS4/GhigfuRh06aZix1j3Qx8+NSQ==", + "requires": { + "babel-runtime": "^6.11.6", + "invariant": "^2.2.1", + "lodash": "^4.12.0", + "prop-types": "^15.5.7" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + } + } + }, + "react-sortable-tree": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-2.6.2.tgz", + "integrity": "sha512-mYX6ByTs7fywPqTEWpEUMgtvLDVyVrkm1Tw/pOPteiLwwMnOqh1LxBwJPUJBmhU2E0P2Zvw3dhnBFL14Fe4EkA==", + "requires": { + "frontend-collective-react-dnd-scrollzone": "^1.0.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.6.1", + "react-dnd": "^7.3.0", + "react-dnd-html5-backend": "^7.0.1", + "react-lifecycles-compat": "^3.0.4", + "react-sortable-tree": "^2.6.0", + "react-virtualized": "^9.19.1" + } + }, + "react-split-pane": { + "version": "0.1.85", + "resolved": "https://registry.npmjs.org/react-split-pane/-/react-split-pane-0.1.85.tgz", + "integrity": "sha512-3GhaYs6+eVNrewgN4eQKJoNMQ4pcegNMTMhR5bO/NFO91K6/98qdD1sCuWPpsefCjzxNTjkvVYWQC0bMaC45mA==", + "dev": true, + "requires": { + "prop-types": "^15.5.10", + "react": "^16.6.3", + "react-dom": "^16.6.3", + "react-lifecycles-compat": "^3.0.4", + "react-style-proptype": "^3.0.0" + } + }, + "react-style-proptype": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.2.tgz", + "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", + "dev": true, + "requires": { + "prop-types": "^15.5.4" + } + }, + "react-svg": { + "version": "2.2.18", + "resolved": "https://registry.npmjs.org/react-svg/-/react-svg-2.2.18.tgz", + "integrity": "sha512-Hm+PJYxfZ4FIWyI3xypvyrrt+qbhCaDHKPiYv3Aen57xMjhtESKYQArkGVmn2O7W+lROLCjFfp+NnivULBtxxw==", + "requires": { + "svg-injector": "^1.1.3" + } + }, + "react-test-renderer": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.8.6.tgz", + "integrity": "sha512-H2srzU5IWYT6cZXof6AhUcx/wEyJddQ8l7cLM/F7gDXYyPr4oq+vCIxJYXVGhId1J706sqziAjuOEjyNkfgoEw==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "react-is": "^16.8.6", + "scheduler": "^0.13.6" + }, + "dependencies": { + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + } + } + }, + "react-textarea-autosize": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz", + "integrity": "sha512-c2FlR/fP0qbxmlrW96SdrbgP/v0XZMTupqB90zybvmDVDutytUgPl7beU35klwcTeMepUIQEpQUn3P3bdshGPg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2", + "prop-types": "^15.6.0" + } + }, + "react-transition-group": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.2.1.tgz", + "integrity": "sha512-q54UBM22bs/CekG8r3+vi9TugSqh0t7qcEVycaRc9M0p0aCEu+h6rp/RFiW7fHfgd1IKpd9oILFTl5QK+FpiPA==", + "requires": { + "chain-function": "^1.0.0", + "classnames": "^2.2.5", + "dom-helpers": "^3.2.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.5.8", + "warning": "^3.0.0" + } + }, + "react-treebeard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-treebeard/-/react-treebeard-3.1.0.tgz", + "integrity": "sha512-u4OEzwZk1Xcxp2s55Ny/Ofp8fHRwlabKOAeGbzQ7XUE9YXFbPj8ajl0FInbXEP4Ys9+E1vHCtgqJ6VBsgbCPVg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "@emotion/core": "^0.13.1", + "@emotion/styled": "^0.10.6", + "deep-equal": "^1.0.1", + "prop-types": "^15.6.2", + "shallowequal": "^1.1.0", + "velocity-react": "^1.4.1" + }, + "dependencies": { + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + } + } + }, + "react-virtualized": { + "version": "9.21.1", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.1.tgz", + "integrity": "sha512-E53vFjRRMCyUTEKuDLuGH1ld/9TFzjf/fFW816PE4HFXWZorESbSTYtiZz1oAjra0MminaUU1EnvUxoGuEFFPA==", + "requires": { + "babel-runtime": "^6.26.0", + "clsx": "^1.0.1", + "dom-helpers": "^2.4.0 || ^3.0.0", + "linear-layout-vector": "0.0.1", + "loose-envify": "^1.3.0", + "prop-types": "^15.6.0", + "react-lifecycles-compat": "^3.0.4" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + } + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.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" + } + }, + "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" + } + } + } + }, + "recast": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.16.2.tgz", + "integrity": "sha512-O/7qXi51DPjRVdbrpNzoBQH5dnAPQNbfoOFyRiUwreTMJfIHYOEBzwuH+c0+/BTSJ3CQyKs6ILSWXhESH6Op3A==", + "dev": true, + "requires": { + "ast-types": "0.11.7", + "esprima": "~4.0.0", + "private": "~0.1.5", + "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 + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "recompose": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", + "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", + "requires": { + "@babel/runtime": "^7.0.0", + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "react-lifecycles-compat": "^3.0.2", + "symbol-observable": "^1.0.4" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "requires": { + "esprima": "~4.0.0" + } + }, + "redux": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", + "integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==", + "requires": { + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" + }, + "dependencies": { + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + } + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + }, + "dependencies": { + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", + "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "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" + } + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpu-core": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", + "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + }, + "dependencies": { + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + } + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "rehype-parse": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.0.tgz", + "integrity": "sha512-V2OjMD0xcSt39G4uRdMTqDXXm6HwkUbLMDayYKA/d037j8/OtVSQ+tqKwYWOuyBeoCs/3clXRe30VUjeMDTBSA==", + "dev": true, + "requires": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "render-fragment": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/render-fragment/-/render-fragment-0.1.1.tgz", + "integrity": "sha512-+DnAcalJYR8GE5VRuQGGu78Q0GDe8EXnkuk4DF8gbAhIeS6LRt4j+aaggLLj4PtQVfXNC61McXvXI58WqmRleQ==", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + } + }, + "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 + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "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==", + "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" + }, + "dependencies": { + "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-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "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 + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "rsvp": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", + "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.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 + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "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" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "scheduler": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", + "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "dependencies": { + "ajv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.0.tgz", + "integrity": "sha1-r6wpW7qgFSRJ5SJ0LkVHwa6TKNI=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + } + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", + "requires": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", + "dev": true, + "requires": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "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 + } + } + }, + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "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==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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=" + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sisteransi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", + "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slugify": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.4.tgz", + "integrity": "sha512-KP0ZYk5hJNBS8/eIjGkFDCzGQIoZ1mnfQRYS5WM3273z+fxGWXeN0fkwf2ebEweydv9tioZIHGZKoF21U07/nw==" + }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", + "requires": { + "no-case": "^2.2.0" + } + }, + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "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" + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "dev": true, + "requires": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "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-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "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==" + } + } + }, + "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 + }, + "space-separated-tokens": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.2.tgz", + "integrity": "sha512-G3jprCEw+xFEs0ORweLmblJ3XLymGGr6hxZYTYZjIlvDti9vOBUjRQa1Rzjt012aRrocKstHwdNi+F7HguPsEA==", + "dev": true, + "requires": { + "trim": "0.0.1" + } + }, + "spawn-promise": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/spawn-promise/-/spawn-promise-0.1.8.tgz", + "integrity": "sha512-pTkEOFxvYLq9SaI1d8bwepj0yD9Yyz65+4e979YZLv/L3oYPxZpDTabcm6e+KIZniGK9mQ+LGrwB5s1v2z67nQ==", + "dev": true, + "requires": { + "co": "^4.6.0" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "spdy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "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.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.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.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.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.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.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=" + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "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", + "tweetnacl": "~0.14.0" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "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.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-similarity": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.0.tgz", + "integrity": "sha1-11FTyzg4RjGLejmo2SkrtNtOnDA=", + "requires": { + "lodash": "^4.13.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.matchall": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-3.0.1.tgz", + "integrity": "sha512-NSiU0ILQr9PQ1SZmM1X327U5LsM+KfDTassJfqN1al1+0iNpKzmQ4BfXOJwRnTEqv8nKJ67mFpqRoPaGWwvy5A==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "regexp.prototype.flags": "^1.2.0" + }, + "dependencies": { + "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" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "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" + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + } + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string.prototype.padstart": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz", + "integrity": "sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string.prototype.trim": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", + "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.0", + "function-bind": "^1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "style-loader": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "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-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "subscriptions-transport-ws": { + "version": "0.9.16", + "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.16.tgz", + "integrity": "sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw==", + "requires": { + "backo2": "^1.0.2", + "eventemitter3": "^3.1.0", + "iterall": "^1.2.1", + "symbol-observable": "^1.0.4", + "ws": "^5.2.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", + "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", + "requires": { + "has-flag": "^2.0.0", + "supports-color": "^5.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + } + } + }, + "svg-injector": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svg-injector/-/svg-injector-1.1.3.tgz", + "integrity": "sha1-j7oY10GeX4GOcSxPgtg+41dhDmE=" + }, + "svg-url-loader": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-2.3.2.tgz", + "integrity": "sha1-3YaybBn+O5FPBOoQ7zlZTq3gRGQ=", + "dev": true, + "requires": { + "file-loader": "1.1.11", + "loader-utils": "1.1.0" + } + }, + "swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "requires": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "symbol.prototype.description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/symbol.prototype.description/-/symbol.prototype.description-1.0.0.tgz", + "integrity": "sha512-I9mrbZ5M96s7QeJDv95toF1svkUjeBybe8ydhY7foPaBmr0SPJMFupArmMkDrOKTTj0sJVr+nvQNxWLziQ7nDQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "terser": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.11.0.tgz", + "integrity": "sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.6" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "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.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz", + "integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", + "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-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "cacache": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", + "integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "figgy-pudding": "^3.1.0", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.0", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "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 + }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "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 + }, + "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" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "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 + } + } + }, + "test-exclude": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", + "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + } + } + }, + "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 + }, + "theming": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/theming/-/theming-1.3.0.tgz", + "integrity": "sha512-ya5Ef7XDGbTPBv5ENTwrwkPUexrlPeiAg/EI9kdlUAZhNlRbCdhMKRgjNX1IcmsmiPcqDQZE6BpSaH+cr31FKw==", + "requires": { + "brcast": "^3.0.1", + "is-function": "^1.0.1", + "is-plain-object": "^2.0.1", + "prop-types": "^15.5.8" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "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.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-invariant": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.3.tgz", + "integrity": "sha512-ytQx8T4DL8PjlX53yYzcIC0WhIZbpR0p1qcYjw2pHu3w6UtgWwFJQ/02cnhOnBBhlFx/edUIfcagCaQSe3KMWg==" + }, + "tiny-warning": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz", + "integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==" + }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "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" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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 + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "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 + } + } + }, + "treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "trough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", + "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==", + "dev": true + }, + "ts-invariant": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.3.2.tgz", + "integrity": "sha512-QsY8BCaRnHiB5T6iE4DPlJMAKEG3gzMiUco9FEt1jUXQf0XP6zi0idT0i0rMTu8A326JqNSDsmlkA9dRSh1TRg==", + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "ts-jest": { + "version": "23.10.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-23.10.5.tgz", + "integrity": "sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "make-error": "1.x", + "mkdirp": "0.x", + "resolve": "1.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "dependencies": { + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "ts-loader": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.2.tgz", + "integrity": "sha512-TPeXFkdPjOrVEawY4xUgRnzlHEmKQF1DclJghPGq67jKnroVvs6mEGHWYtbUczgeWTvTaqUjSSaMmp1k5do4vw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + } + } + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "tsconfig-paths": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.8.0.tgz", + "integrity": "sha512-zZEYFo4sjORK8W58ENkRn9s+HmQFkkwydDG7My5s/fnfr2YYCaiyXe/HBUcIgU8epEKOXwiahOO+KZYjiXlWyQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "deepmerge": "^2.0.1", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tsconfig-paths-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-S/gOOPOkV8rIL4LurZ1vUdYCVgo15iX9ZMJ6wx6w2OgcpT/G4wMyHB6WM+xheSqGMrWKuxFul+aXpCju3wmj/g==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "tsconfig-paths": "^3.4.0" + } + }, + "tslib": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz", + "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==" + }, + "tslint": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", + "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + } + }, + "tslint-config-prettier": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.15.0.tgz", + "integrity": "sha512-06CgrHJxJmNYVgsmeMoa1KXzQRoOdvfkqnJth6XUkNeOz707qxN0WfxfhYwhL5kXHHbYJRby2bqAPKwThlZPhw==", + "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" + } + }, + "tty": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tty/-/tty-1.0.1.tgz", + "integrity": "sha1-5ECayYsN0cULWf846G6sPwdk7kU=" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.0.tgz", + "integrity": "sha512-fg3sfdDdJDtdHLUpeGsf/fLyG1aapk6zgFiYG5+MDUPybGrJemH4SLk5tP7hGRe8ntxjg0q5LYW53b6YpJIQ9Q==" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "~1.33.0" + } + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==" + }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "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 + } + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", + "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.0.2", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "dev": true + }, + "unified": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", + "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "@types/vfile": "^3.0.0", + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^3.0.0", + "x-is-string": "^0.1.0" + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "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" + } + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "dev": true + }, + "universal-cookie": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-2.1.2.tgz", + "integrity": "sha512-F/rsGtceIw9hR5cHCckluI2wO2CmEe4hb3jGC+EJ+1feeFmc5byaenW/1Cg/bUggJ11qNFSTVqnocP5Y0HwNeg==", + "requires": { + "cookie": "^0.3.1", + "object-assign": "^4.1.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "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 + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "requires": { + "upper-case": "^1.1.1" + } + }, + "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-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=" + }, + "url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "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-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "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 + }, + "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 + }, + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "url-parse": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", + "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", + "dev": true, + "requires": { + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + } + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "urllite": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/urllite/-/urllite-0.5.0.tgz", + "integrity": "sha1-G3u5yj+w25Ug3hE0ZrvPfMNBRRo=", + "requires": { + "xtend": "~4.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.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "use-force-update": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/use-force-update/-/use-force-update-1.0.4.tgz", + "integrity": "sha512-/tF1kH4p4KwuJeA9De0hzPXi48JTk9fEwlBnZ8fUOTcDYwKuLiMPVOFrN0RzbcKLgcVog/74kTRCiHfu93ju+g==" + }, + "use-react-router": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/use-react-router/-/use-react-router-1.0.4.tgz", + "integrity": "sha512-KYtW6OxvdqQYO2jINUHH0f8ax4dHTbLj7sqFlUPQosG64tVhmFvjEsLC1p91g7/L6nKQ4R+tslc9X+WKCDULdA==", + "requires": { + "use-force-update": "^1.0.4" + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "^1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "velocity-animate": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.5.2.tgz", + "integrity": "sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg==", + "dev": true + }, + "velocity-react": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.4.1.tgz", + "integrity": "sha512-ZyXBm+9C/6kNUNyc+aeNKEhtTu/Mn+OfpsNBGuTxU8S2DUcis/KQL0rTN6jWL+7ygdOrun18qhheNZTA7YERmg==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "react-transition-group": "^2.0.0", + "velocity-animate": "^1.4.0" + } + }, + "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" + } + }, + "vfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", + "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "dev": true, + "requires": { + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } + } + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "dev": true, + "requires": { + "unist-util-stringify-position": "^1.1.1" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "vscode-jsonrpc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", + "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" + }, + "vscode-languageserver": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", + "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", + "requires": { + "vscode-languageserver-protocol": "3.14.1", + "vscode-uri": "^1.0.6" + } + }, + "vscode-languageserver-protocol": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", + "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", + "requires": { + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.14.0" + } + }, + "vscode-languageserver-types": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", + "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" + }, + "vscode-uri": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.6.tgz", + "integrity": "sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww==" + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + }, + "dependencies": { + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + } + } + }, + "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" + } + }, + "web-namespaces": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.2.tgz", + "integrity": "sha512-II+n2ms4mPxK+RnIxRPOw3zwF2jRscdJIUE9BfkKHm4FYEg9+biIoTMnaZF5MpemE3T+VhMLrhbyD4ilkPCSbg==", + "dev": true + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.27.0.tgz", + "integrity": "sha512-y77EQNIlsB9fUGgpLv/ZzmH+Yd9DgyIF9omX9RFavR5ZFM6HxFm6sqkbBXYxpjbKej9K6hD+Y8qEVg2rWdI2gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "ajv": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", + "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-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "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 + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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 + }, + "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" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "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 + }, + "tapable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "dev": true + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "webpack-bundle-tracker": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-tracker/-/webpack-bundle-tracker-0.3.0.tgz", + "integrity": "sha512-I0Gwkug8QX8xZS14SvmfWin1AmZDoZp/0AGvlgKqNxyw20DgkFkq1jTQ/Ml73YgjFTmQ5bATyQM7TjtYMP1nFA==", + "dev": true, + "requires": { + "deep-extend": "^0.4.1", + "mkdirp": "^0.5.1", + "strip-ansi": "^2.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", + "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "strip-ansi": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", + "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", + "dev": true, + "requires": { + "ansi-regex": "^1.0.0" + } + } + } + }, + "webpack-cli": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", + "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "global-modules-path": "^2.3.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.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.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "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" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + } + } + }, + "webpack-dev-server": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", + "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.20", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.1.1", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.5" + }, + "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" + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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 + }, + "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" + } + }, + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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" + } + }, + "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 + }, + "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 + }, + "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.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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "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 + }, + "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.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 + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + }, + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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 + } + } + }, + "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" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "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" + } + }, + "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" + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + } + } + }, + "webpack-hot-middleware": { + "version": "2.24.3", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.24.3.tgz", + "integrity": "sha512-pPlmcdoR2Fn6UhYjAhp1g/IJy1Yc9hD+T6O9mjRcWV2pFbBjIFoJXhP0CoD0xPOhWJuWXuZXGBga9ybbOdzXpg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.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": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + }, + "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" + } + } + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "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 + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "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.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "^1.0.2" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "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" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + } + } + }, + "yarn": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.15.2.tgz", + "integrity": "sha512-DhqaGe2FcYKduO42d2hByXk7y8k2k42H3uzYdWBMTvcNcgWKx7xCkJWsVAQikXvaEQN2GyJNrz8CboqUmaBRrw==" + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.12.tgz", + "integrity": "sha512-wwqbD6K6CqDd1T67UFg4hgDqnu2YAnFJDCPYmwN/N6Yfa+2QgoSp+nJomh+FWUdOc1A+553/ElvfoW8Vc/vsLg==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..3ed7dec43 --- /dev/null +++ b/package.json @@ -0,0 +1,177 @@ +{ + "name": "saleor", + "version": "0.0.0", + "main": "Gruntfile.js", + "repository": { + "type": "git", + "url": "git://github.com/mirumee/saleor-dashboard.git" + }, + "author": "Mirumee Software", + "license": "BSD-3-Clause", + "bugs": { + "url": "https://github.com/mirumee/saleor-dashboard/issues" + }, + "homepage": "http://getsaleor.com/", + "engines": { + "node": ">=10.6.0", + "npm": ">=6.1.0" + }, + "dependencies": { + "@material-ui/core": "^3.9.3", + "@material-ui/icons": "^3.0.1", + "@material-ui/styles": "^3.0.0-alpha.10", + "@types/classnames": "^2.2.6", + "@types/enzyme": "^3.1.15", + "@types/fuzzaldrin": "^2.1.1", + "@types/moment-timezone": "^0.5.9", + "@types/react-dropzone": "^4.2.2", + "@types/react-helmet": "^5.0.7", + "@types/react-infinite-scroller": "^1.2.0", + "@types/react-sortable-tree": "^0.3.6", + "@types/storybook__addon-storyshots": "^3.4.3", + "@types/string-similarity": "^1.2.0", + "@types/url-join": "^0.8.2", + "apollo": "^2.8.1", + "apollo-cache-inmemory": "^1.3.11", + "apollo-client": "^2.4.7", + "apollo-client-preset": "^1.0.6", + "apollo-link": "^1.2.5", + "apollo-link-batch-http": "^1.2.5", + "apollo-link-context": "^1.0.10", + "apollo-link-error": "^1.1.2", + "apollo-upload-client": "^9.1.0", + "classnames": "^2.2.6", + "crc-32": "^1.2.0", + "downshift": "^1.31.14", + "draft-js": "^0.10.5", + "draftail": "^1.1.0", + "draftjs-to-html": "^0.8.4", + "fast-array-diff": "^0.2.0", + "fuzzaldrin": "^2.1.0", + "graphql": "^14.0.2", + "graphql-tag": "^2.10.0", + "i18next": "^11.2.2", + "i18next-browser-languagedetector": "^2.2.0", + "i18next-xhr-backend": "^1.5.1", + "is-url": "^1.2.4", + "keycode": "^2.2.0", + "lodash": "^4.17.11", + "moment-timezone": "^0.5.21", + "qs": "^6.5.2", + "react": "^16.8.3", + "react-apollo": "^2.5.1", + "react-dom": "^16.8.3", + "react-dropzone": "^8.0.3", + "react-helmet": "^5.2.0", + "react-infinite-scroller": "^1.2.4", + "react-inlinesvg": "^0.8.1", + "react-jss": "^8.4.0", + "react-moment": "^0.7.7", + "react-router": "^5.0.0", + "react-router-dom": "^5.0.0", + "react-router-navigation-prompt": "^1.8.2", + "react-sortable-hoc": "^0.6.8", + "react-sortable-tree": "^2.6.2", + "react-svg": "^2.2.11", + "slugify": "^1.3.4", + "string-similarity": "^1.2.0", + "typescript": "^3.2.2", + "universal-cookie": "^2.1.2", + "url-join": "^4.0.0", + "use-react-router": "^1.0.4" + }, + "devDependencies": { + "@babel/core": "^7.2.0", + "@babel/plugin-proposal-class-properties": "^7.2.1", + "@babel/plugin-proposal-decorators": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.2.0", + "@babel/preset-env": "^7.2.0", + "@babel/preset-react": "^7.0.0", + "@babel/runtime": "^7.2.0", + "@storybook/addon-storyshots": "^4.1.4", + "@storybook/react": "^4.1.4", + "@types/draft-js": "^0.10.27", + "@types/i18next": "^8.4.3", + "@types/jest": "^23.3.1", + "@types/react": "^16.8.6", + "@types/react-dom": "^16.8.2", + "@types/react-router-dom": "^4.2.6", + "@types/react-test-renderer": "^16.8.1", + "@types/storybook__react": "^4.0.0", + "babel-core": "^7.0.0-bridge.0", + "babel-jest": "^23.6.0", + "babel-loader": "^8.0.4", + "enzyme": "^3.7.0", + "enzyme-adapter-react-16": "^1.7.0", + "enzyme-to-json": "^3.3.5", + "file-loader": "^1.1.11", + "fork-ts-checker-webpack-plugin": "^0.5.2", + "fsevents": "^1.2.9", + "html-webpack-plugin": "^3.2.0", + "jest": "^24.7.1", + "jest-file": "^1.0.0", + "plop": "^2.2.0", + "react-test-renderer": "^16.8.6", + "regenerator-runtime": "^0.11.1", + "ts-jest": "^23.10.5", + "ts-loader": "^5.3.2", + "tsconfig-paths-webpack-plugin": "^3.2.0", + "tslint": "^5.11.0", + "tslint-config-prettier": "^1.15.0", + "webpack": "^4.27.0", + "webpack-bundle-tracker": "^0.3.0", + "webpack-cli": "^3.1.2", + "webpack-dev-server": "^3.7.2" + }, + "babel": { + "presets": [ + "@babel/preset-env", + "@babel/preset-react" + ], + "plugins": [ + "@babel/plugin-proposal-class-properties", + [ + "@babel/plugin-proposal-decorators", + { + "decoratorsBeforeExport": true + } + ], + "@babel/plugin-proposal-object-rest-spread" + ] + }, + "jest": { + "globals": { + "ts-jest": { + "tsConfig": "tsconfig.json" + } + }, + "transform": { + "^.+\\.tsx?$": "ts-jest", + "^.+\\.(png|svg|jpe?g)$": "jest-file" + }, + "testRegex": ".*\\.test\\.tsx?$", + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "jsx", + "json", + "node" + ], + "moduleNameMapper": { + "@assets(.*)$": "/assets/$1", + "@saleor(.*)$": "/src/$1" + } + }, + "scripts": { + "build": "webpack -p", + "build-types": "apollo client:codegen --target=typescript types --globalTypesFile=src/types/globalTypes.ts", + "generate-component": "plop --plopfile .plop/plopfile.js", + "lint": "tslint 'src/**/*.{ts,tsx}'", + "lint-fix": "tslint 'src/**/*.{ts,tsx}' --fix", + "start": "webpack-dev-server --open", + "storybook": "start-storybook -p 3000 -c src/storybook/", + "build-storybook": "build-storybook -c src/storybook/ -o storybook", + "test": "jest src/" + } +} diff --git a/src/Baseline.tsx b/src/Baseline.tsx new file mode 100644 index 000000000..5babc7ade --- /dev/null +++ b/src/Baseline.tsx @@ -0,0 +1,16 @@ +import CssBaseline from "@material-ui/core/CssBaseline"; +import { createStyles, withStyles } from "@material-ui/core/styles"; +import * as React from "react"; + +const styles = createStyles({ + "@global": { + "@import": "url('https://rsms.me/inter/inter.css')" + } +}); + +const Baseline = withStyles(styles, { + name: "Baseline" +})(() => ); +Baseline.displayName = "Baseline"; + +export default Baseline; diff --git a/src/NotFound.tsx b/src/NotFound.tsx new file mode 100644 index 000000000..075e7d4d7 --- /dev/null +++ b/src/NotFound.tsx @@ -0,0 +1,11 @@ +import * as React from "react"; + +import NotFoundPage from "./components/NotFoundPage"; +import useNavigator from "./hooks/useNavigator"; + +export const NotFound: React.StatelessComponent = () => { + const navigate = useNavigator(); + + return navigate("/")} />; +}; +export default NotFound; diff --git a/src/auth/AuthProvider.tsx b/src/auth/AuthProvider.tsx new file mode 100644 index 000000000..64da58a5c --- /dev/null +++ b/src/auth/AuthProvider.tsx @@ -0,0 +1,135 @@ +import * as React from "react"; + +import { getMutationProviderData } from "../misc"; +import { PartialMutationProviderOutput } from "../types"; +import { getAuthToken, removeAuthToken, setAuthToken, UserContext } from "./"; +import { TypedTokenAuthMutation, TypedVerifyTokenMutation } from "./mutations"; +import { TokenAuth, TokenAuthVariables } from "./types/TokenAuth"; +import { User } from "./types/User"; +import { VerifyToken, VerifyTokenVariables } from "./types/VerifyToken"; + +interface AuthProviderOperationsProps { + children: ( + props: { + hasToken: boolean; + isAuthenticated: boolean; + tokenAuthLoading: boolean; + tokenVerifyLoading: boolean; + user: User; + } + ) => React.ReactNode; +} +const AuthProviderOperations: React.StatelessComponent< + AuthProviderOperationsProps +> = ({ children }) => { + return ( + + {(...tokenAuth) => ( + + {(...tokenVerify) => ( + + {children} + + )} + + )} + + ); +}; + +interface AuthProviderProps { + children: ( + props: { + hasToken: boolean; + isAuthenticated: boolean; + tokenAuthLoading: boolean; + tokenVerifyLoading: boolean; + user: User; + } + ) => React.ReactNode; + tokenAuth: PartialMutationProviderOutput; + tokenVerify: PartialMutationProviderOutput; +} + +interface AuthProviderState { + user: User; + persistToken: boolean; +} + +class AuthProvider extends React.Component< + AuthProviderProps, + AuthProviderState +> { + constructor(props) { + super(props); + this.state = { user: undefined, persistToken: false }; + } + + componentWillReceiveProps(props: AuthProviderProps) { + const { tokenAuth, tokenVerify } = props; + if (tokenAuth.opts.error || tokenVerify.opts.error) { + this.logout(); + } + if (tokenAuth.opts.data) { + const user = tokenAuth.opts.data.tokenCreate.user; + // FIXME: Now we set state also when auth fails and returned user is + // `null`, because the LoginView uses this `null` to display error. + this.setState({ user }); + if (user) { + setAuthToken( + tokenAuth.opts.data.tokenCreate.token, + this.state.persistToken + ); + } + } else { + if (tokenVerify.opts.data && tokenVerify.opts.data.tokenVerify.user) { + const user = tokenVerify.opts.data.tokenVerify.user; + this.setState({ user }); + } + } + } + + componentDidMount() { + const { user } = this.state; + const { tokenVerify } = this.props; + const token = getAuthToken(); + if (!!token && !user) { + tokenVerify.mutate({ token }); + } + } + + login = (email: string, password: string, persistToken: boolean) => { + const { tokenAuth } = this.props; + this.setState({ persistToken }); + tokenAuth.mutate({ email, password }); + }; + + logout = () => { + this.setState({ user: undefined }); + removeAuthToken(); + }; + + render() { + const { children, tokenAuth, tokenVerify } = this.props; + const { user } = this.state; + const isAuthenticated = !!user; + return ( + + {children({ + hasToken: !!getAuthToken(), + isAuthenticated, + tokenAuthLoading: tokenAuth.opts.loading, + tokenVerifyLoading: tokenVerify.opts.loading, + user + })} + + ); + } +} + +export default AuthProviderOperations; diff --git a/src/auth/components/LoginLoading/LoginLoading.tsx b/src/auth/components/LoginLoading/LoginLoading.tsx new file mode 100644 index 000000000..99ad30b76 --- /dev/null +++ b/src/auth/components/LoginLoading/LoginLoading.tsx @@ -0,0 +1,21 @@ +import CircularProgress from "@material-ui/core/CircularProgress"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import * as React from "react"; + +const styles = createStyles({ + root: { + alignItems: "center", + display: "flex", + height: "100vh", + justifyContent: "center" + } +}); +const LoginLoading = withStyles(styles, { name: "LoginLoading" })( + ({ classes }: WithStyles) => ( +

    + ) +); +LoginLoading.displayName = "LoginLoading"; +export default LoginLoading; diff --git a/src/auth/components/LoginLoading/index.ts b/src/auth/components/LoginLoading/index.ts new file mode 100644 index 000000000..eaeb4c412 --- /dev/null +++ b/src/auth/components/LoginLoading/index.ts @@ -0,0 +1,2 @@ +export { default } from "./LoginLoading"; +export * from "./LoginLoading"; diff --git a/src/auth/components/LoginPage/LoginPage.tsx b/src/auth/components/LoginPage/LoginPage.tsx new file mode 100644 index 000000000..42860b4ea --- /dev/null +++ b/src/auth/components/LoginPage/LoginPage.tsx @@ -0,0 +1,201 @@ +import Button from "@material-ui/core/Button"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; +import SVG from "react-inlinesvg"; + +import * as backgroundArt from "@assets/images/login-background.svg"; +import * as saleorDarkLogo from "@assets/images/logo-dark.svg"; +import * as saleorLightLogo from "@assets/images/logo-light.svg"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import Form from "@saleor/components/Form"; +import { FormSpacer } from "@saleor/components/FormSpacer"; +import useTheme from "@saleor/hooks/useTheme"; +import i18n from "../../../i18n"; + +export interface FormData { + email: string; + loading: boolean; + password: string; + rememberMe: boolean; +} + +const styles = (theme: Theme) => + createStyles({ + buttonContainer: { + display: "flex", + justifyContent: "space-between" + }, + link: { + color: theme.palette.primary.main, + cursor: "pointer", + textAlign: "center" + }, + loginButton: { + width: 140 + }, + logo: { + "& svg": { + display: "block", + height: 40, + marginBottom: theme.spacing.unit * 4 + } + }, + mainPanel: { + [theme.breakpoints.down("sm")]: { + padding: theme.spacing.unit * 2 + }, + background: theme.palette.background.paper, + display: "flex", + flexDirection: "column", + height: "100vh", + justifyContent: "center", + padding: theme.spacing.unit * 6, + width: "100%" + }, + mainPanelContent: { + [theme.breakpoints.up("xs")]: { + width: "100%" + }, + [theme.breakpoints.up("sm")]: { + width: 328 + }, + "@media (min-width: 1440px)": { + width: 464 + }, + margin: "auto", + width: "100%" + }, + panel: { + "& span": { + color: theme.palette.error.contrastText + }, + background: theme.palette.error.main, + borderRadius: theme.spacing.unit, + marginBottom: theme.spacing.unit * 3, + padding: theme.spacing.unit * 1.5 + }, + root: { + [theme.breakpoints.up("lg")]: { + gridTemplateColumns: "376px 1fr" + }, + "@media (min-width: 1440px)": { + gridTemplateColumns: "520px 1fr" + }, + display: "grid", + gridTemplateColumns: "1fr", + height: "100vh", + overflow: "hidden", + width: "100vw" + }, + sidebar: { + [theme.breakpoints.up("lg")]: { + display: "block" + }, + display: "none" + }, + sidebarArt: { + "& svg": { + width: "100%" + } + } + }); + +export interface LoginCardProps extends WithStyles { + error: boolean; + disableLoginButton: boolean; + onPasswordRecovery: () => void; + onSubmit?(event: FormData); +} + +const LoginCard = withStyles(styles, { name: "LoginCard" })( + ({ classes, error, disableLoginButton, onSubmit }: LoginCardProps) => { + const { isDark } = useTheme(); + + return ( +
    + {({ change: handleChange, data, submit: handleSubmit }) => ( +
    +
    + +
    +
    +
    + + {error && ( +
    + Please try again." + ) + }} + /> +
    + )} + + + + +
    + + + +
    + {/* + + {i18n.t("Reset your password")} + */} +
    +
    +
    + )} +
    + ); + } +); +LoginCard.displayName = "LoginCard"; +export default LoginCard; diff --git a/src/auth/components/LoginPage/index.ts b/src/auth/components/LoginPage/index.ts new file mode 100644 index 000000000..358f81bd4 --- /dev/null +++ b/src/auth/components/LoginPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./LoginPage"; +export * from "./LoginPage"; diff --git a/src/auth/components/SectionRoute.tsx b/src/auth/components/SectionRoute.tsx new file mode 100644 index 000000000..c5c97d315 --- /dev/null +++ b/src/auth/components/SectionRoute.tsx @@ -0,0 +1,34 @@ +import * as React from "react"; +import { Route, RouteProps } from "react-router-dom"; + +import AppLayout from "@saleor/components/AppLayout"; +import { UserContext } from ".."; +import NotFound from "../../NotFound"; +import { PermissionEnum } from "../../types/globalTypes"; +import { hasPermission } from "../misc"; + +interface SectionRouteProps extends RouteProps { + permissions?: PermissionEnum[]; +} + +export const SectionRoute: React.StatelessComponent = ({ + permissions, + ...props +}) => ( + + {({ user }) => + !permissions || + permissions + .map(permission => hasPermission(permission, user)) + .reduce((prev, curr) => prev && curr) ? ( + + + + ) : ( + + ) + } + +); +SectionRoute.displayName = "Route"; +export default SectionRoute; diff --git a/src/auth/index.tsx b/src/auth/index.tsx new file mode 100644 index 000000000..a38347d30 --- /dev/null +++ b/src/auth/index.tsx @@ -0,0 +1,30 @@ +import * as React from "react"; + +import { User } from "./types/User"; + +const TOKEN_STORAGE_KEY = "dashboardAuth"; + +interface UserContext { + login: (username: string, password: string, persist: boolean) => void; + logout: () => void; + user?: User; +} + +export const UserContext = React.createContext({ + login: undefined, + logout: undefined +}); + +export const getAuthToken = () => + localStorage.getItem(TOKEN_STORAGE_KEY) || + sessionStorage.getItem(TOKEN_STORAGE_KEY); + +export const setAuthToken = (token: string, persist: boolean) => + persist + ? localStorage.setItem(TOKEN_STORAGE_KEY, token) + : sessionStorage.setItem(TOKEN_STORAGE_KEY, token); + +export const removeAuthToken = () => { + localStorage.removeItem(TOKEN_STORAGE_KEY); + sessionStorage.removeItem(TOKEN_STORAGE_KEY); +}; diff --git a/src/auth/misc.ts b/src/auth/misc.ts new file mode 100644 index 000000000..497d8a650 --- /dev/null +++ b/src/auth/misc.ts @@ -0,0 +1,5 @@ +import { PermissionEnum } from '../types/globalTypes' +import { User } from "./types/User"; + +export const hasPermission = (permission: PermissionEnum, user: User) => + user.permissions.map(perm => perm.code).includes(permission); diff --git a/src/auth/mutations.ts b/src/auth/mutations.ts new file mode 100644 index 000000000..8d4007ba7 --- /dev/null +++ b/src/auth/mutations.ts @@ -0,0 +1,58 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { TokenAuth, TokenAuthVariables } from "./types/TokenAuth"; +import { VerifyToken, VerifyTokenVariables } from "./types/VerifyToken"; + +export const fragmentUser = gql` + fragment User on User { + id + email + firstName + lastName + isStaff + note + permissions { + code + name + } + } +`; + +export const tokenAuthMutation = gql` + ${fragmentUser} + mutation TokenAuth($email: String!, $password: String!) { + tokenCreate(email: $email, password: $password) { + token + errors { + field + message + } + user { + ...User + } + } + } +`; + +export const TypedTokenAuthMutation = TypedMutation< + TokenAuth, + TokenAuthVariables +>(tokenAuthMutation); + +export const tokenVerifyMutation = gql` + ${fragmentUser} + mutation VerifyToken($token: String!) { + tokenVerify(token: $token) { + payload + user { + ...User + } + } + } +`; + +export const TypedVerifyTokenMutation = TypedMutation< + VerifyToken, + VerifyTokenVariables +>(tokenVerifyMutation); diff --git a/src/auth/types/TokenAuth.ts b/src/auth/types/TokenAuth.ts new file mode 100644 index 000000000..a282edc47 --- /dev/null +++ b/src/auth/types/TokenAuth.ts @@ -0,0 +1,48 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PermissionEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: TokenAuth +// ==================================================== + +export interface TokenAuth_tokenCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface TokenAuth_tokenCreate_user_permissions { + __typename: "PermissionDisplay"; + code: PermissionEnum; + name: string; +} + +export interface TokenAuth_tokenCreate_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + isStaff: boolean; + note: string | null; + permissions: (TokenAuth_tokenCreate_user_permissions | null)[] | null; +} + +export interface TokenAuth_tokenCreate { + __typename: "CreateToken"; + token: string | null; + errors: (TokenAuth_tokenCreate_errors | null)[]; + user: TokenAuth_tokenCreate_user | null; +} + +export interface TokenAuth { + tokenCreate: TokenAuth_tokenCreate | null; +} + +export interface TokenAuthVariables { + email: string; + password: string; +} diff --git a/src/auth/types/User.ts b/src/auth/types/User.ts new file mode 100644 index 000000000..6027f7f82 --- /dev/null +++ b/src/auth/types/User.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PermissionEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: User +// ==================================================== + +export interface User_permissions { + __typename: "PermissionDisplay"; + code: PermissionEnum; + name: string; +} + +export interface User { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + isStaff: boolean; + note: string | null; + permissions: (User_permissions | null)[] | null; +} diff --git a/src/auth/types/VerifyToken.ts b/src/auth/types/VerifyToken.ts new file mode 100644 index 000000000..52dc496a4 --- /dev/null +++ b/src/auth/types/VerifyToken.ts @@ -0,0 +1,40 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PermissionEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: VerifyToken +// ==================================================== + +export interface VerifyToken_tokenVerify_user_permissions { + __typename: "PermissionDisplay"; + code: PermissionEnum; + name: string; +} + +export interface VerifyToken_tokenVerify_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + isStaff: boolean; + note: string | null; + permissions: (VerifyToken_tokenVerify_user_permissions | null)[] | null; +} + +export interface VerifyToken_tokenVerify { + __typename: "VerifyToken"; + payload: any | null; + user: VerifyToken_tokenVerify_user | null; +} + +export interface VerifyToken { + tokenVerify: VerifyToken_tokenVerify | null; +} + +export interface VerifyTokenVariables { + token: string; +} diff --git a/src/auth/views/Login.tsx b/src/auth/views/Login.tsx new file mode 100644 index 000000000..508f4e8c9 --- /dev/null +++ b/src/auth/views/Login.tsx @@ -0,0 +1,27 @@ +import * as React from "react"; + +import LoginPage, { FormData } from "../components/LoginPage"; +import { UserContext } from "../index"; + +interface LoginViewProps { + loading: boolean; +} + +const LoginView: React.StatelessComponent = ({ loading }) => ( + + {({ login, user }) => { + const handleSubmit = (data: FormData) => + login(data.email, data.password, data.rememberMe); + return ( + + ); + }} + +); +LoginView.displayName = "LoginView"; +export default LoginView; diff --git a/src/categories/components/CategoryBackground/CategoryBackground.tsx b/src/categories/components/CategoryBackground/CategoryBackground.tsx new file mode 100644 index 000000000..a90674bdc --- /dev/null +++ b/src/categories/components/CategoryBackground/CategoryBackground.tsx @@ -0,0 +1,133 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardTitle from "@saleor/components/CardTitle"; +import Hr from "@saleor/components/Hr"; +import ImageTile from "@saleor/components/ImageTile"; +import ImageUpload from "@saleor/components/ImageUpload"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { CategoryDetails_category_backgroundImage } from "../../types/CategoryDetails"; +import { FormData } from "../CategoryUpdatePage"; + +const styles = (theme: Theme) => + createStyles({ + fileField: { + display: "none" + }, + image: { + height: "100%", + objectFit: "contain", + userSelect: "none", + width: "100%" + }, + imageContainer: { + background: "#ffffff", + border: "1px solid #eaeaea", + borderRadius: theme.spacing.unit, + height: 148, + justifySelf: "start", + overflow: "hidden", + padding: theme.spacing.unit * 2, + position: "relative", + width: 148 + } + }); + +export interface CategoryBackgroundProps extends WithStyles { + data: FormData; + image: CategoryDetails_category_backgroundImage; + onChange: (event: React.ChangeEvent) => void; + onImageDelete: () => void; + onImageUpload: (file: File) => void; +} + +export const CategoryBackground = withStyles(styles)( + class CategoryBackgroundComponent extends React.Component< + CategoryBackgroundProps, + {} + > { + imgInputAnchor = React.createRef(); + + clickImgInput = () => this.imgInputAnchor.current.click(); + + render() { + const { + classes, + data, + onImageUpload, + image, + onChange, + onImageDelete + } = this.props; + return ( + + + + onImageUpload(event.target.files[0])} + type="file" + ref={this.imgInputAnchor} + /> + + } + /> + {image === undefined ? ( + +
    +
    + +
    +
    +
    + ) : image === null ? ( + + ) : ( + + + + )} + + {image && ( + <> +
    + + + + + )} +
    + ); + } + } +); +CategoryBackground.displayName = "CategoryBackground"; +export default CategoryBackground; diff --git a/src/categories/components/CategoryBackground/index.ts b/src/categories/components/CategoryBackground/index.ts new file mode 100644 index 000000000..f5a59d0a3 --- /dev/null +++ b/src/categories/components/CategoryBackground/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CategoryBackground"; +export * from "./CategoryBackground"; diff --git a/src/categories/components/CategoryCreatePage/CategoryCreatePage.tsx b/src/categories/components/CategoryCreatePage/CategoryCreatePage.tsx new file mode 100644 index 000000000..0177f68e2 --- /dev/null +++ b/src/categories/components/CategoryCreatePage/CategoryCreatePage.tsx @@ -0,0 +1,92 @@ +import { ContentState, convertToRaw, RawDraftContentState } from "draft-js"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import { CardSpacer } from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import SeoForm from "@saleor/components/SeoForm"; +import i18n from "../../../i18n"; +import { UserError } from "../../../types"; +import CategoryDetailsForm from "../../components/CategoryDetailsForm"; + +interface FormData { + description: RawDraftContentState; + name: string; + seoTitle: string; + seoDescription: string; +} + +const initialData: FormData = { + description: convertToRaw(ContentState.createFromText("")), + name: "", + seoDescription: "", + seoTitle: "" +}; + +export interface CategoryCreatePageProps { + errors: UserError[]; + disabled: boolean; + saveButtonBarState: ConfirmButtonTransitionState; + onSubmit(data: FormData); + onBack(); +} + +export const CategoryCreatePage: React.StatelessComponent< + CategoryCreatePageProps +> = ({ + disabled, + onSubmit, + onBack, + errors: userErrors, + saveButtonBarState +}) => ( +
    + {({ data, change, errors, submit, hasChanged }) => ( + + {i18n.t("Categories")} + +
    + + + + +
    +
    + )} +
    +); +CategoryCreatePage.displayName = "CategoryCreatePage"; +export default CategoryCreatePage; diff --git a/src/categories/components/CategoryCreatePage/index.ts b/src/categories/components/CategoryCreatePage/index.ts new file mode 100644 index 000000000..1624a6ddb --- /dev/null +++ b/src/categories/components/CategoryCreatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CategoryCreatePage"; +export * from "./CategoryCreatePage"; diff --git a/src/categories/components/CategoryDeleteDialog/CategoryDeleteDialog.tsx b/src/categories/components/CategoryDeleteDialog/CategoryDeleteDialog.tsx new file mode 100644 index 000000000..0dd8a1e29 --- /dev/null +++ b/src/categories/components/CategoryDeleteDialog/CategoryDeleteDialog.tsx @@ -0,0 +1,65 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + deleteButton: { + "&:hover": { + backgroundColor: theme.palette.error.main + }, + backgroundColor: theme.palette.error.main, + color: theme.palette.error.contrastText + } + }); + +export interface CategoryDeleteDialogProps extends WithStyles { + open: boolean; + name: string; + onClose(); + onConfirm(); +} + +const CategoryDeleteDialog = withStyles(styles, { + name: "CategoryDeleteDialog" +})(({ classes, name, open, onConfirm, onClose }: CategoryDeleteDialogProps) => ( + + {i18n.t("Delete category", { context: "title" })} + + {{name}}?", + { name } + ) + }} + /> + + + + + + +)); +CategoryDeleteDialog.displayName = "CategoryDeleteDialog"; +export default CategoryDeleteDialog; diff --git a/src/categories/components/CategoryDeleteDialog/index.ts b/src/categories/components/CategoryDeleteDialog/index.ts new file mode 100644 index 000000000..31957694a --- /dev/null +++ b/src/categories/components/CategoryDeleteDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CategoryDeleteDialog"; +export * from "./CategoryDeleteDialog"; diff --git a/src/categories/components/CategoryDetailsForm/CategoryDetailsForm.tsx b/src/categories/components/CategoryDetailsForm/CategoryDetailsForm.tsx new file mode 100644 index 000000000..74e41a6c3 --- /dev/null +++ b/src/categories/components/CategoryDetailsForm/CategoryDetailsForm.tsx @@ -0,0 +1,77 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import { RawDraftContentState } from "draft-js"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import FormSpacer from "@saleor/components/FormSpacer"; +import RichTextEditor from "@saleor/components/RichTextEditor"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { CategoryDetails_category } from "../../types/CategoryDetails"; + +const styles = createStyles({ + root: { + width: "50%" + } +}); + +interface CategoryDetailsFormProps extends WithStyles { + category?: CategoryDetails_category; + data: { + name: string; + description: RawDraftContentState; + }; + disabled: boolean; + errors: { [key: string]: string }; + onChange: (event: React.ChangeEvent) => void; +} + +export const CategoryDetailsForm = withStyles(styles, { + name: "CategoryDetailsForm" +})( + ({ + category, + classes, + disabled, + data, + onChange, + errors + }: CategoryDetailsFormProps) => { + return ( + + + + <> +
    + +
    + + JSON.parse(category.descriptionJson))} + name="description" + onChange={onChange} + /> + +
    +
    + ); + } +); +CategoryDetailsForm.displayName = "CategoryDetailsForm"; +export default CategoryDetailsForm; diff --git a/src/categories/components/CategoryDetailsForm/index.ts b/src/categories/components/CategoryDetailsForm/index.ts new file mode 100644 index 000000000..33c5482ba --- /dev/null +++ b/src/categories/components/CategoryDetailsForm/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CategoryDetailsForm"; +export * from "./CategoryDetailsForm"; diff --git a/src/categories/components/CategoryList/CategoryList.tsx b/src/categories/components/CategoryList/CategoryList.tsx new file mode 100644 index 000000000..232509160 --- /dev/null +++ b/src/categories/components/CategoryList/CategoryList.tsx @@ -0,0 +1,190 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colName: { + width: 840 + }, + colProducts: { + width: 160 + }, + colSubcategories: { + width: 160 + } + }, + colName: { + paddingLeft: "0 !important" + }, + colProducts: { + textAlign: "center" + }, + colSubcategories: { + textAlign: "center" + }, + tableRow: { + cursor: "pointer" + } + }); + +interface CategoryListProps + extends ListProps, + ListActions, + WithStyles { + categories?: Array<{ + id: string; + name: string; + children: { + totalCount: number; + }; + products: { + totalCount: number; + }; + }>; + isRoot: boolean; + onAdd?(); +} + +const CategoryList = withStyles(styles, { name: "CategoryList" })( + ({ + categories, + classes, + disabled, + isRoot, + pageInfo, + isChecked, + selected, + toggle, + toggleAll, + toolbar, + onAdd, + onNextPage, + onPreviousPage, + onRowClick + }: CategoryListProps) => ( + + {!isRoot && ( + + {i18n.t("Add subcategory")} + + } + /> + )} + + + + {i18n.t("Category Name", { context: "object" })} + + + {i18n.t("Subcategories", { context: "object" })} + + + {i18n.t("No. Products", { context: "object" }).replace(" ", "\xa0")} + + + + + + + + + {renderCollection( + categories, + category => { + const isSelected = category ? isChecked(category.id) : false; + + return ( + + + toggle(category.id)} + /> + + + {category && category.name ? category.name : } + + + {category && + category.children && + category.children.totalCount !== undefined ? ( + category.children.totalCount + ) : ( + + )} + + + {category && + category.products && + category.products.totalCount !== undefined ? ( + category.products.totalCount + ) : ( + + )} + + + ); + }, + () => ( + + + {isRoot + ? i18n.t("No categories found") + : i18n.t("No subcategories found")} + + + ) + )} + +
    +
    + ) +); +CategoryList.displayName = "CategoryList"; +export default CategoryList; diff --git a/src/categories/components/CategoryList/index.ts b/src/categories/components/CategoryList/index.ts new file mode 100644 index 000000000..52c4017ff --- /dev/null +++ b/src/categories/components/CategoryList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CategoryList"; +export * from "./CategoryList"; diff --git a/src/categories/components/CategoryListPage/CategoryListPage.tsx b/src/categories/components/CategoryListPage/CategoryListPage.tsx new file mode 100644 index 000000000..38acf31eb --- /dev/null +++ b/src/categories/components/CategoryListPage/CategoryListPage.tsx @@ -0,0 +1,62 @@ +import Button from "@material-ui/core/Button"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import CategoryList from "../CategoryList"; + +export interface CategoryTableProps extends PageListProps, ListActions { + categories: Array<{ + id: string; + name: string; + children: { + totalCount: number; + }; + products: { + totalCount: number; + }; + }>; +} + +export const CategoryListPage: React.StatelessComponent = ({ + categories, + disabled, + onAdd, + onNextPage, + onPreviousPage, + onRowClick, + pageInfo, + isChecked, + selected, + toggle, + toggleAll, + toolbar +}) => ( + + + + + + +); +CategoryListPage.displayName = "CategoryListPage"; +export default CategoryListPage; diff --git a/src/categories/components/CategoryListPage/index.ts b/src/categories/components/CategoryListPage/index.ts new file mode 100644 index 000000000..8f685bd64 --- /dev/null +++ b/src/categories/components/CategoryListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CategoryListPage"; +export * from "./CategoryListPage"; diff --git a/src/categories/components/CategoryProducts/CategoryProducts.tsx b/src/categories/components/CategoryProducts/CategoryProducts.tsx new file mode 100644 index 000000000..5f41d6f53 --- /dev/null +++ b/src/categories/components/CategoryProducts/CategoryProducts.tsx @@ -0,0 +1,136 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; + +const styles = (theme: Theme) => + createStyles({ + link: { + color: theme.palette.primary.main, + cursor: "pointer" + }, + textLeft: { + textAlign: "left" + } + }); + +interface ProductListProps extends WithStyles { + hasNextPage?: boolean; + hasPreviousPage?: boolean; + products?: Array<{ + id: string; + name: string; + productType: { + name: string; + }; + thumbnail: { + url: string; + }; + }>; + onAddProduct?(); + onNextPage?(); + onPreviousPage?(); + onRowClick?(id: string): () => void; +} + +export const ProductList = withStyles(styles, { name: "ProductList" })( + ({ + classes, + hasNextPage, + hasPreviousPage, + products, + onAddProduct, + onNextPage, + onPreviousPage, + onRowClick + }: ProductListProps) => ( + + + {i18n.t("Add product")} + + } + /> + + + + {(products === undefined || products.length > 0) && } + + {i18n.t("Name", { context: "object" })} + + {i18n.t("Type", { context: "object" })} + + + + + + + + + {renderCollection( + products, + product => ( + + product.thumbnail.url)} + /> + + {product ? ( + + {product.name} + + ) : ( + + )} + + + {product && product.productType ? ( + product.productType.name + ) : ( + + )} + + + ), + () => ( + + {i18n.t("No products found")} + + ) + )} + +
    +
    + ) +); +ProductList.displayName = "CategoryProductList"; +export default ProductList; diff --git a/src/categories/components/CategoryProducts/index.ts b/src/categories/components/CategoryProducts/index.ts new file mode 100644 index 000000000..12cece4a6 --- /dev/null +++ b/src/categories/components/CategoryProducts/index.ts @@ -0,0 +1 @@ +export { default } from "./CategoryProducts"; diff --git a/src/categories/components/CategoryProductsCard/CategoryProductsCard.tsx b/src/categories/components/CategoryProductsCard/CategoryProductsCard.tsx new file mode 100644 index 000000000..ca0017123 --- /dev/null +++ b/src/categories/components/CategoryProductsCard/CategoryProductsCard.tsx @@ -0,0 +1,59 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import ProductList from "@saleor/components/ProductList"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { CategoryDetails_category_products_edges_node } from "../../types/CategoryDetails"; + +interface CategoryProductsCardProps extends PageListProps, ListActions { + products: CategoryDetails_category_products_edges_node[]; + categoryName: string; +} + +export const CategoryProductsCard: React.StatelessComponent< + CategoryProductsCardProps +> = ({ + products, + disabled, + pageInfo, + onAdd, + onNextPage, + onPreviousPage, + onRowClick, + categoryName, + isChecked, + selected, + toggle, + toggleAll, + toolbar +}) => ( + + + {i18n.t("Add product")} + + } + /> + + +); + +CategoryProductsCard.displayName = "CategoryProductsCard"; +export default CategoryProductsCard; diff --git a/src/categories/components/CategoryProductsCard/index.ts b/src/categories/components/CategoryProductsCard/index.ts new file mode 100644 index 000000000..741d2b708 --- /dev/null +++ b/src/categories/components/CategoryProductsCard/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CategoryProductsCard"; +export * from "./CategoryProductsCard"; diff --git a/src/categories/components/CategoryUpdatePage/CategoryUpdatePage.tsx b/src/categories/components/CategoryUpdatePage/CategoryUpdatePage.tsx new file mode 100644 index 000000000..03d242a9f --- /dev/null +++ b/src/categories/components/CategoryUpdatePage/CategoryUpdatePage.tsx @@ -0,0 +1,219 @@ +import { RawDraftContentState } from "draft-js"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import { CardSpacer } from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import SeoForm from "@saleor/components/SeoForm"; +import { Tab, TabContainer } from "@saleor/components/Tab"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { TabListActions, UserError } from "../../../types"; +import CategoryDetailsForm from "../../components/CategoryDetailsForm"; +import CategoryList from "../../components/CategoryList"; +import { + CategoryDetails_category, + CategoryDetails_category_children_edges_node, + CategoryDetails_category_products_edges_node +} from "../../types/CategoryDetails"; +import CategoryBackground from "../CategoryBackground"; +import CategoryProductsCard from "../CategoryProductsCard"; + +export interface FormData { + backgroundImageAlt: string; + description: RawDraftContentState; + name: string; + seoTitle: string; + seoDescription: string; +} + +export enum CategoryPageTab { + categories = "categories", + products = "products" +} + +export interface CategoryUpdatePageProps + extends TabListActions<"productListToolbar" | "subcategoryListToolbar"> { + changeTab: (index: CategoryPageTab) => void; + currentTab: CategoryPageTab; + errors: UserError[]; + disabled: boolean; + category: CategoryDetails_category; + products: CategoryDetails_category_products_edges_node[]; + subcategories: CategoryDetails_category_children_edges_node[]; + pageInfo: { + hasNextPage: boolean; + hasPreviousPage: boolean; + }; + saveButtonBarState: ConfirmButtonTransitionState; + onImageDelete: () => void; + onSubmit: (data: FormData) => void; + onImageUpload(file: File); + onNextPage(); + onPreviousPage(); + onProductClick(id: string): () => void; + onAddProduct(); + onBack(); + onDelete(); + onAddCategory(); + onCategoryClick(id: string): () => void; +} + +const CategoriesTab = Tab(CategoryPageTab.categories); +const ProductsTab = Tab(CategoryPageTab.products); + +export const CategoryUpdatePage: React.StatelessComponent< + CategoryUpdatePageProps +> = ({ + changeTab, + currentTab, + category, + disabled, + errors: userErrors, + pageInfo, + products, + saveButtonBarState, + subcategories, + onAddCategory, + onAddProduct, + onBack, + onCategoryClick, + onDelete, + onNextPage, + onPreviousPage, + onProductClick, + onSubmit, + onImageDelete, + onImageUpload, + isChecked, + productListToolbar, + selected, + subcategoryListToolbar, + toggle, + toggleAll +}: CategoryUpdatePageProps) => { + const initialData: FormData = category + ? { + backgroundImageAlt: maybe(() => category.backgroundImage.alt, ""), + description: maybe(() => JSON.parse(category.descriptionJson)), + name: category.name || "", + seoDescription: category.seoDescription || "", + seoTitle: category.seoTitle || "" + } + : { + backgroundImageAlt: "", + description: "", + name: "", + seoDescription: "", + seoTitle: "" + }; + return ( +
    + {({ data, change, errors, submit, hasChanged }) => ( + + {i18n.t("Categories")} + + + + category.backgroundImage)} + onChange={change} + /> + + + + + + {i18n.t("Subcategories")} + + + {i18n.t("Products")} + + + + {currentTab === CategoryPageTab.categories && ( + + )} + {currentTab === CategoryPageTab.products && ( + category.name)} + products={products} + disabled={disabled} + pageInfo={pageInfo} + onNextPage={onNextPage} + onPreviousPage={onPreviousPage} + onRowClick={onProductClick} + onAdd={onAddProduct} + toggle={toggle} + toggleAll={toggleAll} + selected={selected} + isChecked={isChecked} + toolbar={productListToolbar} + /> + )} + + + )} +
    + ); +}; +CategoryUpdatePage.displayName = "CategoryUpdatePage"; +export default CategoryUpdatePage; diff --git a/src/categories/components/CategoryUpdatePage/index.ts b/src/categories/components/CategoryUpdatePage/index.ts new file mode 100644 index 000000000..0b5755ef7 --- /dev/null +++ b/src/categories/components/CategoryUpdatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CategoryUpdatePage"; +export * from "./CategoryUpdatePage"; diff --git a/src/categories/fixtures.ts b/src/categories/fixtures.ts new file mode 100644 index 000000000..f7621bfa9 --- /dev/null +++ b/src/categories/fixtures.ts @@ -0,0 +1,316 @@ +import { content } from "../storybook/stories/components/RichTextEditor"; +import { CategoryDetails_category } from "./types/CategoryDetails"; + +export const categories = [ + { + children: { + totalCount: 2 + }, + id: "123123", + name: "Lorem ipsum dolor", + products: { + totalCount: 4 + } + }, + { + children: { + totalCount: 54 + }, + id: "876752", + name: "Mauris vehicula tortor vulputate", + products: { + totalCount: 3 + } + }, + { + children: { + totalCount: 2 + }, + id: "876542", + name: "Excepteur sint occaecat cupidatat non proident", + products: { + totalCount: 6 + } + }, + { + children: { + totalCount: 6 + }, + id: "875352", + name: "Ut enim ad minim veniam", + products: { + totalCount: 12 + } + }, + { + children: { + totalCount: 76 + }, + id: "865752", + name: "Duis aute irure dolor in reprehenderit", + products: { + totalCount: 43 + } + }, + { + children: { + totalCount: 11 + }, + id: "878752", + name: "Neque porro quisquam est", + products: { + totalCount: 21 + } + } +]; +export const category: ( + placeholderImage: string +) => CategoryDetails_category = (placeholderImage: string) => ({ + __typename: "Category", + backgroundImage: { + __typename: "Image", + alt: "Alt text", + url: placeholderImage + }, + children: { + __typename: "CategoryCountableConnection", + edges: [] + }, + descriptionJson: JSON.stringify(content), + id: "Q2F0ZWdvcnk6NA==", + name: "Coffees", + parent: { + __typename: "Category", + id: "Q2F0ZWdvcnk6Mw==" + }, + products: { + __typename: "ProductCountableConnection", + edges: [ + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjA=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 83.3, + currency: "USD" + }, + id: "UHJvZHVjdDoyMQ==", + isAvailable: true, + name: "Gardner-Schultz", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjE=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 68.27, + currency: "USD" + }, + id: "UHJvZHVjdDoyMg==", + isAvailable: true, + name: "James, Martinez and Murray", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjI=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 21.43, + currency: "USD" + }, + id: "UHJvZHVjdDoyMw==", + isAvailable: true, + name: "Curtis, Joyce and Turner", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjM=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 62.76, + currency: "USD" + }, + id: "UHJvZHVjdDoyNA==", + isAvailable: true, + name: "Davis, Brown and Ray", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjQ=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 7.13, + currency: "USD" + }, + id: "UHJvZHVjdDoyNQ==", + isAvailable: true, + name: "Gallegos Ltd", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjU=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 48.82, + currency: "USD" + }, + id: "UHJvZHVjdDoyNg==", + isAvailable: true, + name: "Franklin Inc", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjY=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 27.34, + currency: "USD" + }, + id: "UHJvZHVjdDoyNw==", + isAvailable: true, + name: "Williams-Taylor", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjc=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 75.42, + currency: "USD" + }, + id: "UHJvZHVjdDoyOA==", + isAvailable: true, + name: "Riddle, Evans and Hicks", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjg=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 86.62, + currency: "USD" + }, + id: "UHJvZHVjdDoyOQ==", + isAvailable: true, + name: "Hebert-Sherman", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjk=", + node: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 48.66, + currency: "USD" + }, + id: "UHJvZHVjdDozMA==", + isAvailable: true, + name: "Carter and Sons", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + } + ], + pageInfo: { + __typename: "PageInfo", + endCursor: "YXJyYXljb25uZWN0aW9uOjk=", + hasNextPage: false, + hasPreviousPage: false, + startCursor: "YXJyYXljb25uZWN0aW9uOjA=" + } + }, + seoDescription: null, + seoTitle: null +}); +export const errors = [ + { + field: "name", + message: "To pole jest wymagane." + } +]; diff --git a/src/categories/index.tsx b/src/categories/index.tsx new file mode 100644 index 000000000..12af20f0a --- /dev/null +++ b/src/categories/index.tsx @@ -0,0 +1,71 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { + categoryAddPath, + categoryListPath, + CategoryListUrlQueryParams, + categoryPath, + CategoryUrlQueryParams +} from "./urls"; +import { CategoryCreateView } from "./views/CategoryCreate"; +import CategoryDetailsView, { getActiveTab } from "./views/CategoryDetails"; +import CategoryListComponent from "./views/CategoryList"; + +interface CategoryDetailsRouteParams { + id: string; +} +const CategoryDetails: React.StatelessComponent< + RouteComponentProps +> = ({ location, match }) => { + const qs = parseQs(location.search.substr(1)); + const params: CategoryUrlQueryParams = { + ...qs, + activeTab: getActiveTab(qs.activeTab) + }; + return ( + + ); +}; + +interface CategoryCreateRouteParams { + id: string; +} +const CategoryCreate: React.StatelessComponent< + RouteComponentProps +> = ({ match }) => { + return ( + + ); +}; + +const CategoryList: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: CategoryListUrlQueryParams = qs; + return ; +}; + +const Component = () => ( + <> + + + + + + + + +); + +export default Component; diff --git a/src/categories/mutations.ts b/src/categories/mutations.ts new file mode 100644 index 000000000..715aa4bbf --- /dev/null +++ b/src/categories/mutations.ts @@ -0,0 +1,88 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { categoryDetailsFragment } from "./queries"; +import { + CategoryBulkDelete, + CategoryBulkDeleteVariables +} from "./types/CategoryBulkDelete"; +import { + CategoryCreate, + CategoryCreateVariables +} from "./types/CategoryCreate"; +import { + CategoryDelete, + CategoryDeleteVariables +} from "./types/CategoryDelete"; +import { + CategoryUpdate, + CategoryUpdateVariables +} from "./types/CategoryUpdate"; + +export const categoryDeleteMutation = gql` + mutation CategoryDelete($id: ID!) { + categoryDelete(id: $id) { + errors { + field + message + } + } + } +`; +export const TypedCategoryDeleteMutation = TypedMutation< + CategoryDelete, + CategoryDeleteVariables +>(categoryDeleteMutation); + +export const categoryCreateMutation = gql` + ${categoryDetailsFragment} + mutation CategoryCreate($parent: ID, $input: CategoryInput!) { + categoryCreate(parent: $parent, input: $input) { + errors { + field + message + } + category { + ...CategoryDetailsFragment + } + } + } +`; +export const TypedCategoryCreateMutation = TypedMutation< + CategoryCreate, + CategoryCreateVariables +>(categoryCreateMutation); + +export const categoryUpdateMutation = gql` + ${categoryDetailsFragment} + mutation CategoryUpdate($id: ID!, $input: CategoryInput!) { + categoryUpdate(id: $id, input: $input) { + errors { + field + message + } + category { + ...CategoryDetailsFragment + } + } + } +`; +export const TypedCategoryUpdateMutation = TypedMutation< + CategoryUpdate, + CategoryUpdateVariables +>(categoryUpdateMutation); + +export const categoryBulkDeleteMutation = gql` + mutation CategoryBulkDelete($ids: [ID]!) { + categoryBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedCategoryBulkDeleteMutation = TypedMutation< + CategoryBulkDelete, + CategoryBulkDeleteVariables +>(categoryBulkDeleteMutation); diff --git a/src/categories/queries.ts b/src/categories/queries.ts new file mode 100644 index 000000000..273ff7dc2 --- /dev/null +++ b/src/categories/queries.ts @@ -0,0 +1,124 @@ +import gql from "graphql-tag"; + +import { TypedQuery } from "../queries"; +import { + CategoryDetails, + CategoryDetailsVariables +} from "./types/CategoryDetails"; +import { RootCategories } from "./types/RootCategories"; + +export const categoryDetailsFragment = gql` + fragment CategoryDetailsFragment on Category { + id + backgroundImage { + alt + url + } + name + descriptionJson + seoDescription + seoTitle + parent { + id + } + } +`; + +export const rootCategories = gql` + query RootCategories( + $first: Int + $after: String + $last: Int + $before: String + ) { + categories( + level: 0 + first: $first + after: $after + last: $last + before: $before + ) { + edges { + node { + id + name + children { + totalCount + } + products { + totalCount + } + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + } + } +`; +export const TypedRootCategoriesQuery = TypedQuery( + rootCategories +); + +export const categoryDetails = gql` + ${categoryDetailsFragment} + query CategoryDetails( + $id: ID! + $first: Int + $after: String + $last: Int + $before: String + ) { + category(id: $id) { + ...CategoryDetailsFragment + children(first: 20) { + edges { + node { + id + name + children { + totalCount + } + products { + totalCount + } + } + } + } + products(first: $first, after: $after, last: $last, before: $before) { + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + edges { + cursor + node { + id + name + basePrice { + amount + currency + } + isAvailable + thumbnail { + url + } + productType { + id + name + } + } + } + } + } + } +`; +export const TypedCategoryDetailsQuery = TypedQuery< + CategoryDetails, + CategoryDetailsVariables +>(categoryDetails); diff --git a/src/categories/types/CategoryBulkDelete.ts b/src/categories/types/CategoryBulkDelete.ts new file mode 100644 index 000000000..7824cbe3f --- /dev/null +++ b/src/categories/types/CategoryBulkDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: CategoryBulkDelete +// ==================================================== + +export interface CategoryBulkDelete_categoryBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CategoryBulkDelete_categoryBulkDelete { + __typename: "CategoryBulkDelete"; + errors: CategoryBulkDelete_categoryBulkDelete_errors[] | null; +} + +export interface CategoryBulkDelete { + categoryBulkDelete: CategoryBulkDelete_categoryBulkDelete | null; +} + +export interface CategoryBulkDeleteVariables { + ids: (string | null)[]; +} diff --git a/src/categories/types/CategoryCreate.ts b/src/categories/types/CategoryCreate.ts new file mode 100644 index 000000000..0bd794be3 --- /dev/null +++ b/src/categories/types/CategoryCreate.ts @@ -0,0 +1,52 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CategoryInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: CategoryCreate +// ==================================================== + +export interface CategoryCreate_categoryCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CategoryCreate_categoryCreate_category_backgroundImage { + __typename: "Image"; + alt: string | null; + url: string; +} + +export interface CategoryCreate_categoryCreate_category_parent { + __typename: "Category"; + id: string; +} + +export interface CategoryCreate_categoryCreate_category { + __typename: "Category"; + id: string; + backgroundImage: CategoryCreate_categoryCreate_category_backgroundImage | null; + name: string; + descriptionJson: any; + seoDescription: string | null; + seoTitle: string | null; + parent: CategoryCreate_categoryCreate_category_parent | null; +} + +export interface CategoryCreate_categoryCreate { + __typename: "CategoryCreate"; + errors: CategoryCreate_categoryCreate_errors[] | null; + category: CategoryCreate_categoryCreate_category | null; +} + +export interface CategoryCreate { + categoryCreate: CategoryCreate_categoryCreate | null; +} + +export interface CategoryCreateVariables { + parent?: string | null; + input: CategoryInput; +} diff --git a/src/categories/types/CategoryDelete.ts b/src/categories/types/CategoryDelete.ts new file mode 100644 index 000000000..e68ff91b8 --- /dev/null +++ b/src/categories/types/CategoryDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: CategoryDelete +// ==================================================== + +export interface CategoryDelete_categoryDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CategoryDelete_categoryDelete { + __typename: "CategoryDelete"; + errors: CategoryDelete_categoryDelete_errors[] | null; +} + +export interface CategoryDelete { + categoryDelete: CategoryDelete_categoryDelete | null; +} + +export interface CategoryDeleteVariables { + id: string; +} diff --git a/src/categories/types/CategoryDetails.ts b/src/categories/types/CategoryDetails.ts new file mode 100644 index 000000000..5168b4606 --- /dev/null +++ b/src/categories/types/CategoryDetails.ts @@ -0,0 +1,118 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: CategoryDetails +// ==================================================== + +export interface CategoryDetails_category_backgroundImage { + __typename: "Image"; + alt: string | null; + url: string; +} + +export interface CategoryDetails_category_parent { + __typename: "Category"; + id: string; +} + +export interface CategoryDetails_category_children_edges_node_children { + __typename: "CategoryCountableConnection"; + totalCount: number | null; +} + +export interface CategoryDetails_category_children_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface CategoryDetails_category_children_edges_node { + __typename: "Category"; + id: string; + name: string; + children: CategoryDetails_category_children_edges_node_children | null; + products: CategoryDetails_category_children_edges_node_products | null; +} + +export interface CategoryDetails_category_children_edges { + __typename: "CategoryCountableEdge"; + node: CategoryDetails_category_children_edges_node; +} + +export interface CategoryDetails_category_children { + __typename: "CategoryCountableConnection"; + edges: CategoryDetails_category_children_edges[]; +} + +export interface CategoryDetails_category_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface CategoryDetails_category_products_edges_node_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface CategoryDetails_category_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface CategoryDetails_category_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface CategoryDetails_category_products_edges_node { + __typename: "Product"; + id: string; + name: string; + basePrice: CategoryDetails_category_products_edges_node_basePrice | null; + isAvailable: boolean | null; + thumbnail: CategoryDetails_category_products_edges_node_thumbnail | null; + productType: CategoryDetails_category_products_edges_node_productType; +} + +export interface CategoryDetails_category_products_edges { + __typename: "ProductCountableEdge"; + cursor: string; + node: CategoryDetails_category_products_edges_node; +} + +export interface CategoryDetails_category_products { + __typename: "ProductCountableConnection"; + pageInfo: CategoryDetails_category_products_pageInfo; + edges: CategoryDetails_category_products_edges[]; +} + +export interface CategoryDetails_category { + __typename: "Category"; + id: string; + backgroundImage: CategoryDetails_category_backgroundImage | null; + name: string; + descriptionJson: any; + seoDescription: string | null; + seoTitle: string | null; + parent: CategoryDetails_category_parent | null; + children: CategoryDetails_category_children | null; + products: CategoryDetails_category_products | null; +} + +export interface CategoryDetails { + category: CategoryDetails_category | null; +} + +export interface CategoryDetailsVariables { + id: string; + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/categories/types/CategoryDetailsFragment.ts b/src/categories/types/CategoryDetailsFragment.ts new file mode 100644 index 000000000..111a0e6c2 --- /dev/null +++ b/src/categories/types/CategoryDetailsFragment.ts @@ -0,0 +1,29 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: CategoryDetailsFragment +// ==================================================== + +export interface CategoryDetailsFragment_backgroundImage { + __typename: "Image"; + alt: string | null; + url: string; +} + +export interface CategoryDetailsFragment_parent { + __typename: "Category"; + id: string; +} + +export interface CategoryDetailsFragment { + __typename: "Category"; + id: string; + backgroundImage: CategoryDetailsFragment_backgroundImage | null; + name: string; + descriptionJson: any; + seoDescription: string | null; + seoTitle: string | null; + parent: CategoryDetailsFragment_parent | null; +} diff --git a/src/categories/types/CategoryProperties.ts b/src/categories/types/CategoryProperties.ts new file mode 100644 index 000000000..3ff2be8c5 --- /dev/null +++ b/src/categories/types/CategoryProperties.ts @@ -0,0 +1,95 @@ +/* tslint:disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: CategoryProperties +// ==================================================== + +export interface CategoryProperties_category_parent { + __typename: "Category"; + id: string; +} + +export interface CategoryProperties_category_children_edges_node_children { + __typename: "CategoryCountableConnection"; + totalCount: number | null; +} + +export interface CategoryProperties_category_children_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface CategoryProperties_category_children_edges_node { + __typename: "Category"; + id: string; + name: string; + children: CategoryProperties_category_children_edges_node_children | null; + products: CategoryProperties_category_children_edges_node_products | null; +} + +export interface CategoryProperties_category_children_edges { + __typename: "CategoryCountableEdge"; + node: CategoryProperties_category_children_edges_node; +} + +export interface CategoryProperties_category_children { + __typename: "CategoryCountableConnection"; + edges: CategoryProperties_category_children_edges[]; +} + +export interface CategoryProperties_category_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface CategoryProperties_category_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface CategoryProperties_category_products_edges_node { + __typename: "Product"; + id: string; + name: string; + thumbnailUrl: string | null; + productType: CategoryProperties_category_products_edges_node_productType; +} + +export interface CategoryProperties_category_products_edges { + __typename: "ProductCountableEdge"; + cursor: string; + node: CategoryProperties_category_products_edges_node; +} + +export interface CategoryProperties_category_products { + __typename: "ProductCountableConnection"; + pageInfo: CategoryProperties_category_products_pageInfo; + edges: CategoryProperties_category_products_edges[]; +} + +export interface CategoryProperties_category { + __typename: "Category"; + id: string; + name: string; + description: string; + parent: CategoryProperties_category_parent | null; + children: CategoryProperties_category_children | null; + products: CategoryProperties_category_products | null; +} + +export interface CategoryProperties { + category: CategoryProperties_category | null; +} + +export interface CategoryPropertiesVariables { + id: string; + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/categories/types/CategoryUpdate.ts b/src/categories/types/CategoryUpdate.ts new file mode 100644 index 000000000..c7d6e36ce --- /dev/null +++ b/src/categories/types/CategoryUpdate.ts @@ -0,0 +1,52 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CategoryInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: CategoryUpdate +// ==================================================== + +export interface CategoryUpdate_categoryUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CategoryUpdate_categoryUpdate_category_backgroundImage { + __typename: "Image"; + alt: string | null; + url: string; +} + +export interface CategoryUpdate_categoryUpdate_category_parent { + __typename: "Category"; + id: string; +} + +export interface CategoryUpdate_categoryUpdate_category { + __typename: "Category"; + id: string; + backgroundImage: CategoryUpdate_categoryUpdate_category_backgroundImage | null; + name: string; + descriptionJson: any; + seoDescription: string | null; + seoTitle: string | null; + parent: CategoryUpdate_categoryUpdate_category_parent | null; +} + +export interface CategoryUpdate_categoryUpdate { + __typename: "CategoryUpdate"; + errors: CategoryUpdate_categoryUpdate_errors[] | null; + category: CategoryUpdate_categoryUpdate_category | null; +} + +export interface CategoryUpdate { + categoryUpdate: CategoryUpdate_categoryUpdate | null; +} + +export interface CategoryUpdateVariables { + id: string; + input: CategoryInput; +} diff --git a/src/categories/types/RootCategories.ts b/src/categories/types/RootCategories.ts new file mode 100644 index 000000000..0c55c71df --- /dev/null +++ b/src/categories/types/RootCategories.ts @@ -0,0 +1,55 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: RootCategories +// ==================================================== + +export interface RootCategories_categories_edges_node_children { + __typename: "CategoryCountableConnection"; + totalCount: number | null; +} + +export interface RootCategories_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface RootCategories_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + children: RootCategories_categories_edges_node_children | null; + products: RootCategories_categories_edges_node_products | null; +} + +export interface RootCategories_categories_edges { + __typename: "CategoryCountableEdge"; + node: RootCategories_categories_edges_node; +} + +export interface RootCategories_categories_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface RootCategories_categories { + __typename: "CategoryCountableConnection"; + edges: RootCategories_categories_edges[]; + pageInfo: RootCategories_categories_pageInfo; +} + +export interface RootCategories { + categories: RootCategories_categories | null; +} + +export interface RootCategoriesVariables { + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/categories/types/RootCategoryChildren.ts b/src/categories/types/RootCategoryChildren.ts new file mode 100644 index 000000000..71f75ba20 --- /dev/null +++ b/src/categories/types/RootCategoryChildren.ts @@ -0,0 +1,39 @@ +/* tslint:disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: RootCategoryChildren +// ==================================================== + +export interface RootCategoryChildren_categories_edges_node_children { + __typename: "CategoryCountableConnection"; + totalCount: number | null; +} + +export interface RootCategoryChildren_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface RootCategoryChildren_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + children: RootCategoryChildren_categories_edges_node_children | null; + products: RootCategoryChildren_categories_edges_node_products | null; +} + +export interface RootCategoryChildren_categories_edges { + __typename: "CategoryCountableEdge"; + cursor: string; + node: RootCategoryChildren_categories_edges_node; +} + +export interface RootCategoryChildren_categories { + __typename: "CategoryCountableConnection"; + edges: RootCategoryChildren_categories_edges[]; +} + +export interface RootCategoryChildren { + categories: RootCategoryChildren_categories | null; +} diff --git a/src/categories/urls.ts b/src/categories/urls.ts new file mode 100644 index 000000000..09c92f9d2 --- /dev/null +++ b/src/categories/urls.ts @@ -0,0 +1,36 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { ActiveTab, BulkAction, Dialog, Pagination } from "../types"; +import { CategoryPageTab } from "./components/CategoryUpdatePage"; + +const categorySectionUrl = "/categories/"; + +export const categoryListPath = categorySectionUrl; +export type CategoryListUrlDialog = "delete"; +export type CategoryListUrlQueryParams = BulkAction & + Dialog & + Pagination; +export const categoryListUrl = (params?: CategoryListUrlQueryParams) => + categorySectionUrl + "?" + stringifyQs(params); + +export const categoryPath = (id: string) => urlJoin(categorySectionUrl, id); +export type CategoryUrlDialog = + | "delete" + | "delete-categories" + | "delete-products"; +export type CategoryUrlQueryParams = BulkAction & + Dialog & + Pagination & + ActiveTab; +export const categoryUrl = (id: string, params?: CategoryUrlQueryParams) => + categoryPath(encodeURIComponent(id)) + "?" + stringifyQs(params); + +export const categoryAddPath = (parentId?: string) => { + if (parentId) { + return urlJoin(categoryPath(parentId), "add"); + } + return urlJoin(categorySectionUrl, "add"); +}; +export const categoryAddUrl = (parentId?: string) => + categoryAddPath(parentId ? encodeURIComponent(parentId) : undefined); diff --git a/src/categories/views/CategoryCreate.tsx b/src/categories/views/CategoryCreate.tsx new file mode 100644 index 000000000..903bd7050 --- /dev/null +++ b/src/categories/views/CategoryCreate.tsx @@ -0,0 +1,75 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import CategoryCreatePage from "../components/CategoryCreatePage"; +import { TypedCategoryCreateMutation } from "../mutations"; +import { CategoryCreate } from "../types/CategoryCreate"; +import { categoryListUrl, categoryUrl } from "../urls"; + +interface CategoryCreateViewProps { + parentId: string; +} + +export const CategoryCreateView: React.StatelessComponent< + CategoryCreateViewProps +> = ({ parentId }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const handleSuccess = (data: CategoryCreate) => { + if (data.categoryCreate.errors.length === 0) { + notify({ text: i18n.t("Category created") }); + navigate(categoryUrl(data.categoryCreate.category.id)); + } + }; + return ( + + {(createCategory, createCategoryResult) => { + const errors = maybe( + () => createCategoryResult.data.categoryCreate.errors, + [] + ); + + const formTransitionState = getMutationState( + createCategoryResult.called, + createCategoryResult.loading, + errors + ); + + return ( + <> + + + navigate(parentId ? categoryUrl(parentId) : categoryListUrl()) + } + onSubmit={formData => + createCategory({ + variables: { + input: { + descriptionJson: JSON.stringify(formData.description), + name: formData.name, + seo: { + description: formData.seoDescription, + title: formData.seoTitle + } + }, + parent: parentId || null + } + }) + } + /> + + ); + }} + + ); +}; +export default CategoryCreateView; diff --git a/src/categories/views/CategoryDetails.tsx b/src/categories/views/CategoryDetails.tsx new file mode 100644 index 000000000..07e927fca --- /dev/null +++ b/src/categories/views/CategoryDetails.tsx @@ -0,0 +1,426 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { PAGINATE_BY } from "../../config"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import { TypedProductBulkDeleteMutation } from "../../products/mutations"; +import { productBulkDelete } from "../../products/types/productBulkDelete"; +import { productAddUrl, productUrl } from "../../products/urls"; +import { CategoryInput } from "../../types/globalTypes"; +import { + CategoryPageTab, + CategoryUpdatePage +} from "../components/CategoryUpdatePage/CategoryUpdatePage"; +import { + TypedCategoryBulkDeleteMutation, + TypedCategoryDeleteMutation, + TypedCategoryUpdateMutation +} from "../mutations"; +import { TypedCategoryDetailsQuery } from "../queries"; +import { CategoryBulkDelete } from "../types/CategoryBulkDelete"; +import { CategoryDelete } from "../types/CategoryDelete"; +import { CategoryUpdate } from "../types/CategoryUpdate"; +import { + categoryAddUrl, + categoryListUrl, + categoryUrl, + CategoryUrlDialog, + CategoryUrlQueryParams +} from "../urls"; + +export interface CategoryDetailsProps { + params: CategoryUrlQueryParams; + id: string; +} + +export function getActiveTab(tabName: string): CategoryPageTab { + return tabName === CategoryPageTab.products + ? CategoryPageTab.products + : CategoryPageTab.categories; +} + +export const CategoryDetails: React.StatelessComponent< + CategoryDetailsProps +> = ({ id, params }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const handleCategoryDelete = (data: CategoryDelete) => { + if (data.categoryDelete.errors.length === 0) { + notify({ + text: i18n.t("Category deleted", { + context: "notification" + }) + }); + navigate(categoryListUrl()); + } + }; + const handleCategoryUpdate = (data: CategoryUpdate) => { + if (data.categoryUpdate.errors.length > 0) { + const backgroundImageError = data.categoryUpdate.errors.find( + error => error.field === ("backgroundImage" as keyof CategoryInput) + ); + if (backgroundImageError) { + notify({ + text: backgroundImageError.message + }); + } + } + }; + + const changeTab = (tabName: CategoryPageTab) => { + reset(); + navigate( + categoryUrl(id, { + activeTab: tabName + }) + ); + }; + + const closeModal = () => + navigate( + categoryUrl(id, { + ...params, + action: undefined, + ids: undefined + }), + true + ); + + const openModal = (action: CategoryUrlDialog, ids?: string[]) => + navigate( + categoryUrl(id, { + ...params, + action, + ids + }) + ); + + return ( + + {(deleteCategory, deleteResult) => ( + + {(updateCategory, updateResult) => { + const paginationState = createPaginationState(PAGINATE_BY, params); + const formTransitionState = getMutationState( + updateResult.called, + updateResult.loading, + maybe(() => updateResult.data.categoryUpdate.errors) + ); + const removeDialogTransitionState = getMutationState( + deleteResult.called, + deleteResult.loading, + maybe(() => deleteResult.data.categoryDelete.errors) + ); + return ( + + {({ data, loading, refetch }) => { + const handleBulkCategoryDelete = ( + data: CategoryBulkDelete + ) => { + if (data.categoryBulkDelete.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Categories removed") + }); + refetch(); + reset(); + } + }; + + const handleBulkProductDelete = (data: productBulkDelete) => { + if (data.productBulkDelete.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Products removed") + }); + refetch(); + reset(); + } + }; + + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.category.products.pageInfo), + paginationState, + params + ); + + return ( + <> + data.category.name)} /> + + {(categoryBulkDelete, categoryBulkDeleteOpts) => ( + + {(productBulkDelete, productBulkDeleteOpts) => { + const categoryBulkDeleteMutationState = getMutationState( + categoryBulkDeleteOpts.called, + categoryBulkDeleteOpts.loading, + maybe( + () => + categoryBulkDeleteOpts.data + .categoryBulkDelete.errors + ) + ); + const productBulkDeleteMutationState = getMutationState( + productBulkDeleteOpts.called, + productBulkDeleteOpts.loading, + maybe( + () => + productBulkDeleteOpts.data.productBulkDelete + .errors + ) + ); + + return ( + <> + data.category)} + disabled={loading} + errors={maybe( + () => + updateResult.data.categoryUpdate.errors + )} + onAddCategory={() => + navigate(categoryAddUrl(id)) + } + onAddProduct={() => navigate(productAddUrl)} + onBack={() => + navigate( + maybe( + () => + categoryUrl( + data.category.parent.id + ), + categoryListUrl() + ) + ) + } + onCategoryClick={id => () => + navigate(categoryUrl(id))} + onDelete={() => openModal("delete")} + onImageDelete={() => + updateCategory({ + variables: { + id, + input: { + backgroundImage: null + } + } + }) + } + onImageUpload={file => + updateCategory({ + variables: { + id, + input: { + backgroundImage: file + } + } + }) + } + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + pageInfo={pageInfo} + onProductClick={id => () => + navigate(productUrl(id))} + onSubmit={formData => + updateCategory({ + variables: { + id, + input: { + backgroundImageAlt: + formData.backgroundImageAlt, + descriptionJson: JSON.stringify( + formData.description + ), + name: formData.name, + seo: { + description: + formData.seoDescription, + title: formData.seoTitle + } + } + } + }) + } + products={maybe(() => + data.category.products.edges.map( + edge => edge.node + ) + )} + saveButtonBarState={formTransitionState} + subcategories={maybe(() => + data.category.children.edges.map( + edge => edge.node + ) + )} + subcategoryListToolbar={ + + openModal( + "delete-categories", + listElements + ) + } + > + + + } + productListToolbar={ + + openModal( + "delete-products", + listElements + ) + } + > + + + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + /> + + deleteCategory({ variables: { id } }) + } + open={params.action === "delete"} + title={i18n.t("Delete category", { + context: "modal title" + })} + variant="delete" + > + {{ categoryName }}?
    ", + { + categoryName: maybe( + () => data.category.name + ), + context: "modal message" + } + ) + }} + /> + + {i18n.t( + "Remember that this will also remove all products assigned to this category." + )} + +
    + + categoryBulkDelete({ + variables: { ids: params.ids } + }) + } + title={i18n.t("Remove categories")} + variant="delete" + > + {{ number }} categories?", + { + number: maybe( + () => + params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + {i18n.t( + "Remember that this will also remove all products assigned to this category." + )} + + + + productBulkDelete({ + variables: { ids: params.ids } + }) + } + title={i18n.t("Remove products")} + variant="delete" + > + {{ number }} products?", + { + number: maybe( + () => + params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} +
    + )} +
    + + ); + }} +
    + ); + }} +
    + )} +
    + ); +}; +export default CategoryDetails; diff --git a/src/categories/views/CategoryList.tsx b/src/categories/views/CategoryList.tsx new file mode 100644 index 000000000..943476702 --- /dev/null +++ b/src/categories/views/CategoryList.tsx @@ -0,0 +1,153 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { PAGINATE_BY } from "../../config"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import { CategoryListPage } from "../components/CategoryListPage/CategoryListPage"; +import { TypedCategoryBulkDeleteMutation } from "../mutations"; +import { TypedRootCategoriesQuery } from "../queries"; +import { CategoryBulkDelete } from "../types/CategoryBulkDelete"; +import { + categoryAddUrl, + categoryListUrl, + CategoryListUrlQueryParams, + categoryUrl +} from "../urls"; + +interface CategoryListProps { + params: CategoryListUrlQueryParams; +} + +export const CategoryList: React.StatelessComponent = ({ + params +}) => { + const navigate = useNavigator(); + const paginate = usePaginator(); + const { isSelected, listElements, toggle, toggleAll, reset } = useBulkActions( + params.ids + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + return ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.categories.pageInfo), + paginationState, + params + ); + + const handleCategoryBulkDelete = (data: CategoryBulkDelete) => { + if (data.categoryBulkDelete.errors.length === 0) { + navigate(categoryListUrl(), true); + refetch(); + reset(); + } + }; + return ( + + {(categoryBulkDelete, categoryBulkDeleteOpts) => { + const bulkDeleteState = getMutationState( + categoryBulkDeleteOpts.called, + categoryBulkDeleteOpts.loading, + maybe( + () => categoryBulkDeleteOpts.data.categoryBulkDelete.errors + ) + ); + + return ( + <> + data.categories.edges.map(edge => edge.node), + [] + )} + onAdd={() => navigate(categoryAddUrl())} + onRowClick={id => () => navigate(categoryUrl(id))} + disabled={loading} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + pageInfo={pageInfo} + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + toolbar={ + + navigate( + categoryListUrl({ + ...params, + action: "delete", + ids: listElements + }) + ) + } + > + + + } + /> + + navigate( + categoryListUrl({ + ...params, + action: undefined, + ids: undefined + }) + ) + } + onConfirm={() => + categoryBulkDelete({ + variables: { + ids: params.ids + } + }) + } + open={params.action === "delete"} + title={i18n.t("Remove categories")} + variant="delete" + > + {{ number }} categories?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + {i18n.t( + "Remember that this will also remove all products assigned to this category." + )} + + + + ); + }} + + ); + }} + + ); +}; +export default CategoryList; diff --git a/src/collections/components/CollectionCreatePage/CollectionCreatePage.tsx b/src/collections/components/CollectionCreatePage/CollectionCreatePage.tsx new file mode 100644 index 000000000..46cc82bf0 --- /dev/null +++ b/src/collections/components/CollectionCreatePage/CollectionCreatePage.tsx @@ -0,0 +1,167 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { ContentState, convertToRaw, RawDraftContentState } from "draft-js"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import { CardSpacer } from "@saleor/components/CardSpacer"; +import CardTitle from "@saleor/components/CardTitle"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import { Container } from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import SeoForm from "@saleor/components/SeoForm"; +import VisibilityCard from "@saleor/components/VisibilityCard"; +import i18n from "../../../i18n"; +import { UserError } from "../../../types"; +import CollectionDetails from "../CollectionDetails/CollectionDetails"; +import { CollectionImage } from "../CollectionImage/CollectionImage"; + +export interface CollectionCreatePageFormData { + backgroundImage: { + url: string; + value: string; + }; + backgroundImageAlt: string; + description: RawDraftContentState; + name: string; + publicationDate: string; + isPublished: boolean; + seoDescription: string; + seoTitle: string; +} + +export interface CollectionCreatePageProps { + disabled: boolean; + errors: UserError[]; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onSubmit: (data: CollectionCreatePageFormData) => void; +} + +const initialForm: CollectionCreatePageFormData = { + backgroundImage: { + url: null, + value: null + }, + backgroundImageAlt: "", + description: convertToRaw(ContentState.createFromText("")), + isPublished: false, + name: "", + publicationDate: "", + seoDescription: "", + seoTitle: "" +}; + +const CollectionCreatePage: React.StatelessComponent< + CollectionCreatePageProps +> = ({ + disabled, + errors, + saveButtonBarState, + onBack, + onSubmit +}: CollectionCreatePageProps) => ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Collections")} + + +
    + + + + change({ + target: { + name: "backgroundImage", + value: { + url: null, + value: null + } + } + } as any) + } + onImageUpload={file => + change({ + target: { + name: "backgroundImage", + value: { + url: URL.createObjectURL(file), + value: file + } + } + } as any) + } + onChange={change} + data={data} + /> + + +
    +
    +
    + + + + + + +
    +
    +
    + +
    + )} +
    +); +CollectionCreatePage.displayName = "CollectionCreatePage"; +export default CollectionCreatePage; diff --git a/src/collections/components/CollectionCreatePage/index.ts b/src/collections/components/CollectionCreatePage/index.ts new file mode 100644 index 000000000..0ab3d5aa7 --- /dev/null +++ b/src/collections/components/CollectionCreatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CollectionCreatePage"; +export * from "./CollectionCreatePage"; diff --git a/src/collections/components/CollectionDetails/CollectionDetails.tsx b/src/collections/components/CollectionDetails/CollectionDetails.tsx new file mode 100644 index 000000000..180342c9f --- /dev/null +++ b/src/collections/components/CollectionDetails/CollectionDetails.tsx @@ -0,0 +1,70 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import { RawDraftContentState } from "draft-js"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import FormSpacer from "@saleor/components/FormSpacer"; +import RichTextEditor from "@saleor/components/RichTextEditor"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { FormErrors } from "../../../types"; +import { CollectionDetails_collection } from "../../types/CollectionDetails"; + +const styles = createStyles({ + name: { + width: "80%" + } +}); + +export interface CollectionDetailsProps extends WithStyles { + collection?: CollectionDetails_collection; + data: { + description: RawDraftContentState; + name: string; + }; + disabled: boolean; + errors: FormErrors<"descriptionJson" | "name">; + onChange: (event: React.ChangeEvent) => void; +} + +const CollectionDetails = withStyles(styles, { name: "CollectionDetails" })( + ({ + classes, + collection, + disabled, + data, + onChange, + errors + }: CollectionDetailsProps) => ( + + + + + + JSON.parse(collection.descriptionJson))} + label={i18n.t("Description")} + name="description" + disabled={disabled} + onChange={onChange} + /> + + + ) +); +CollectionDetails.displayName = "CollectionDetails"; +export default CollectionDetails; diff --git a/src/collections/components/CollectionDetails/index.ts b/src/collections/components/CollectionDetails/index.ts new file mode 100644 index 000000000..5f4e124e7 --- /dev/null +++ b/src/collections/components/CollectionDetails/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CollectionDetails"; +export * from "./CollectionDetails"; diff --git a/src/collections/components/CollectionDetailsPage/CollectionDetailsPage.tsx b/src/collections/components/CollectionDetailsPage/CollectionDetailsPage.tsx new file mode 100644 index 000000000..a974ae6ad --- /dev/null +++ b/src/collections/components/CollectionDetailsPage/CollectionDetailsPage.tsx @@ -0,0 +1,152 @@ +import { RawDraftContentState } from "draft-js"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import { CardSpacer } from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import { Container } from "@saleor/components/Container"; +import { ControlledSwitch } from "@saleor/components/ControlledSwitch"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import SeoForm from "@saleor/components/SeoForm"; +import VisibilityCard from "@saleor/components/VisibilityCard"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { ListActions, PageListProps } from "../../../types"; +import { CollectionDetails_collection } from "../../types/CollectionDetails"; +import CollectionDetails from "../CollectionDetails/CollectionDetails"; +import { CollectionImage } from "../CollectionImage/CollectionImage"; +import CollectionProducts from "../CollectionProducts/CollectionProducts"; + +export interface CollectionDetailsPageFormData { + backgroundImageAlt: string; + description: RawDraftContentState; + name: string; + publicationDate: string; + seoDescription: string; + seoTitle: string; + isFeatured: boolean; + isPublished: boolean; +} + +export interface CollectionDetailsPageProps extends PageListProps, ListActions { + collection: CollectionDetails_collection; + isFeatured: boolean; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onCollectionRemove: () => void; + onImageDelete: () => void; + onImageUpload: (file: File) => void; + onProductUnassign: (id: string, event: React.MouseEvent) => void; + onSubmit: (data: CollectionDetailsPageFormData) => void; +} + +const CollectionDetailsPage: React.StatelessComponent< + CollectionDetailsPageProps +> = ({ + collection, + disabled, + isFeatured, + saveButtonBarState, + onBack, + onCollectionRemove, + onImageDelete, + onImageUpload, + onSubmit, + ...collectionProductsProps +}: CollectionDetailsPageProps) => { + return ( +
    collection.backgroundImage.alt, ""), + description: maybe(() => JSON.parse(collection.descriptionJson)), + isFeatured, + isPublished: maybe(() => collection.isPublished, false), + name: maybe(() => collection.name, ""), + publicationDate: maybe(() => collection.publicationDate, ""), + seoDescription: maybe(() => collection.seoDescription, ""), + seoTitle: maybe(() => collection.seoTitle, "") + }} + onSubmit={onSubmit} + confirmLeave + > + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Collections")} + collection.name)} /> + +
    + + + collection.backgroundImage)} + onImageDelete={onImageDelete} + onImageUpload={onImageUpload} + onChange={change} + /> + + + + collection.name)} + onChange={change} + /> +
    +
    +
    + + + +
    +
    +
    + +
    + )} +
    + ); +}; +CollectionDetailsPage.displayName = "CollectionDetailsPage"; +export default CollectionDetailsPage; diff --git a/src/collections/components/CollectionDetailsPage/index.ts b/src/collections/components/CollectionDetailsPage/index.ts new file mode 100644 index 000000000..641c72a74 --- /dev/null +++ b/src/collections/components/CollectionDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CollectionDetailsPage"; +export * from "./CollectionDetailsPage"; diff --git a/src/collections/components/CollectionImage/CollectionImage.tsx b/src/collections/components/CollectionImage/CollectionImage.tsx new file mode 100644 index 000000000..f2866483f --- /dev/null +++ b/src/collections/components/CollectionImage/CollectionImage.tsx @@ -0,0 +1,142 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardTitle from "@saleor/components/CardTitle"; +import Hr from "@saleor/components/Hr"; +import ImageTile from "@saleor/components/ImageTile"; +import ImageUpload from "@saleor/components/ImageUpload"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { CollectionDetails_collection_backgroundImage } from "../../types/CollectionDetails"; + +const styles = (theme: Theme) => + createStyles({ + PhotosIcon: { + height: "64px", + margin: "0 auto", + width: "64px" + }, + PhotosIconContainer: { + margin: `${theme.spacing.unit * 5}px 0`, + textAlign: "center" + }, + fileField: { + display: "none" + }, + image: { + height: "100%", + objectFit: "contain", + userSelect: "none", + width: "100%" + }, + imageContainer: { + background: "#ffffff", + border: "1px solid #eaeaea", + borderRadius: theme.spacing.unit, + height: 148, + justifySelf: "start", + overflow: "hidden", + padding: theme.spacing.unit * 2, + position: "relative", + width: 148 + } + }); + +export interface CollectionImageProps extends WithStyles { + data: { + backgroundImageAlt: string; + }; + image: CollectionDetails_collection_backgroundImage; + onChange: (event: React.ChangeEvent) => void; + onImageDelete: () => void; + onImageUpload: (file: File) => void; +} + +export const CollectionImage = withStyles(styles)( + class CollectionImageComponent extends React.Component< + CollectionImageProps, + {} + > { + imgInputAnchor = React.createRef(); + + clickImgInput = () => this.imgInputAnchor.current.click(); + + render() { + const { + classes, + data, + onImageUpload, + image, + onChange, + onImageDelete + } = this.props; + return ( + + + + onImageUpload(event.target.files[0])} + type="file" + ref={this.imgInputAnchor} + /> + + } + /> + {image === undefined ? ( + +
    +
    + +
    +
    +
    + ) : image === null ? ( + + ) : ( + + + + )} + {image && ( + <> +
    + + + + + )} +
    + ); + } + } +); +CollectionImage.displayName = "CollectionImage"; +export default CollectionImage; diff --git a/src/collections/components/CollectionImage/index.ts b/src/collections/components/CollectionImage/index.ts new file mode 100644 index 000000000..1d18c66cc --- /dev/null +++ b/src/collections/components/CollectionImage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CollectionImage"; +export * from "./CollectionImage"; diff --git a/src/collections/components/CollectionList/CollectionList.tsx b/src/collections/components/CollectionList/CollectionList.tsx new file mode 100644 index 000000000..ce8b61550 --- /dev/null +++ b/src/collections/components/CollectionList/CollectionList.tsx @@ -0,0 +1,166 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { CollectionList_collections_edges_node } from "../../types/CollectionList"; + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colAvailability: { + width: 240 + }, + colName: {}, + colProducts: { + width: 240 + } + }, + colAvailability: {}, + colName: {}, + colProducts: { + textAlign: "center" + }, + tableRow: { + cursor: "pointer" as "pointer" + } + }); + +interface CollectionListProps + extends ListProps, + ListActions, + WithStyles { + collections: CollectionList_collections_edges_node[]; +} + +const CollectionList = withStyles(styles, { name: "CollectionList" })( + ({ + classes, + collections, + disabled, + onNextPage, + onPreviousPage, + onRowClick, + pageInfo, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: CollectionListProps) => ( + + + + + {i18n.t("Category Name", { context: "table cell" })} + + + {i18n + .t("No. Products", { context: "table cell" }) + .replace(" ", "\xa0")} + + + {i18n.t("Availability", { context: "table cell" })} + + + + + + + + + {renderCollection( + collections, + collection => { + const isSelected = collection ? isChecked(collection.id) : false; + return ( + + + toggle(collection.id)} + /> + + + {maybe( + () => collection.name, + + )} + + + {maybe( + () => collection.products.totalCount, + + )} + + + {maybe( + () => ( + + ), + + )} + + + ); + }, + () => ( + + + {i18n.t("No collections found")} + + + ) + )} + +
    +
    + ) +); +CollectionList.displayName = "CollectionList"; +export default CollectionList; diff --git a/src/collections/components/CollectionList/index.ts b/src/collections/components/CollectionList/index.ts new file mode 100644 index 000000000..4f5db2333 --- /dev/null +++ b/src/collections/components/CollectionList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CollectionList"; +export * from "./CollectionList"; diff --git a/src/collections/components/CollectionListPage/CollectionListPage.tsx b/src/collections/components/CollectionListPage/CollectionListPage.tsx new file mode 100644 index 000000000..4fd39fe3c --- /dev/null +++ b/src/collections/components/CollectionListPage/CollectionListPage.tsx @@ -0,0 +1,37 @@ +import Button from "@material-ui/core/Button"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import { Container } from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { CollectionList_collections_edges_node } from "../../types/CollectionList"; +import CollectionList from "../CollectionList/CollectionList"; + +export interface CollectionListPageProps extends PageListProps, ListActions { + collections: CollectionList_collections_edges_node[]; +} + +const CollectionListPage: React.StatelessComponent = ({ + disabled, + onAdd, + ...listProps +}) => ( + + + + + + +); +CollectionListPage.displayName = "CollectionListPage"; +export default CollectionListPage; diff --git a/src/collections/components/CollectionListPage/index.ts b/src/collections/components/CollectionListPage/index.ts new file mode 100644 index 000000000..3324e1926 --- /dev/null +++ b/src/collections/components/CollectionListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CollectionListPage"; +export * from "./CollectionListPage"; diff --git a/src/collections/components/CollectionProducts/CollectionProducts.tsx b/src/collections/components/CollectionProducts/CollectionProducts.tsx new file mode 100644 index 000000000..fc8a420df --- /dev/null +++ b/src/collections/components/CollectionProducts/CollectionProducts.tsx @@ -0,0 +1,189 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ListActions, PageListProps } from "../../../types"; +import { CollectionDetails_collection } from "../../types/CollectionDetails"; + +const styles = (theme: Theme) => + createStyles({ + iconCell: { + "&:last-child": { + paddingRight: 0 + }, + width: 48 + theme.spacing.unit / 2 + }, + tableRow: { + cursor: "pointer" + } + }); + +export interface CollectionProductsProps + extends PageListProps, + ListActions, + WithStyles { + collection: CollectionDetails_collection; + onProductUnassign: (id: string, event: React.MouseEvent) => void; +} + +const CollectionProducts = withStyles(styles, { name: "CollectionProducts" })( + ({ + classes, + collection, + disabled, + onAdd, + onNextPage, + onPreviousPage, + onProductUnassign, + onRowClick, + pageInfo, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: CollectionProductsProps) => ( + + + ) + } + toolbar={ + + } + /> + + collection.products.edges.map(edge => edge.node))} + toggleAll={toggleAll} + toolbar={toolbar} + > + {i18n.t("Name", { context: "table header" })} + {i18n.t("Type", { context: "table header" })} + + {i18n.t("Published", { context: "table header" })} + + + + + pageInfo.hasNextPage)} + onNextPage={onNextPage} + hasPreviousPage={maybe(() => pageInfo.hasPreviousPage)} + onPreviousPage={onPreviousPage} + /> + + + + {renderCollection( + maybe(() => collection.products.edges.map(edge => edge.node)), + product => { + const isSelected = product ? isChecked(product.id) : false; + + return ( + + + toggle(product.id)} + /> + + product.thumbnail.url)} + /> + + {maybe(() => product.name, )} + + + {maybe( + () => product.productType.name, + + )} + + + {maybe( + () => ( + + ), + + )} + + + onProductUnassign(product.id, event)} + > + + + + + ); + }, + () => ( + + + {i18n.t("No products found")} + + ) + )} + +
    +
    + ) +); +CollectionProducts.displayName = "CollectionProducts"; +export default CollectionProducts; diff --git a/src/collections/components/CollectionProducts/index.ts b/src/collections/components/CollectionProducts/index.ts new file mode 100644 index 000000000..3f37d0ff8 --- /dev/null +++ b/src/collections/components/CollectionProducts/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CollectionProducts"; +export * from "./CollectionProducts"; diff --git a/src/collections/containers/CollectionOperations.tsx b/src/collections/containers/CollectionOperations.tsx new file mode 100644 index 000000000..a9f3d8c84 --- /dev/null +++ b/src/collections/containers/CollectionOperations.tsx @@ -0,0 +1,107 @@ +import * as React from "react"; + +import { getMutationProviderData } from "../../misc"; +import { PartialMutationProviderOutput } from "../../types"; +import { + TypedCollectionAssignProductMutation, + TypedCollectionRemoveMutation, + TypedCollectionUpdateMutation, + TypedCollectionUpdateWithHomepageMutation, + TypedUnassignCollectionProductMutation +} from "../mutations"; +import { + CollectionAssignProduct, + CollectionAssignProductVariables +} from "../types/CollectionAssignProduct"; +import { + CollectionUpdate, + CollectionUpdateVariables +} from "../types/CollectionUpdate"; +import { + CollectionUpdateWithHomepage, + CollectionUpdateWithHomepageVariables +} from "../types/CollectionUpdateWithHomepage"; +import { + RemoveCollection, + RemoveCollectionVariables +} from "../types/RemoveCollection"; +import { + UnassignCollectionProduct, + UnassignCollectionProductVariables +} from "../types/UnassignCollectionProduct"; + +interface CollectionUpdateOperationsProps { + children: ( + props: { + updateCollectionWithHomepage: PartialMutationProviderOutput< + CollectionUpdateWithHomepage, + CollectionUpdateWithHomepageVariables + >; + assignProduct: PartialMutationProviderOutput< + CollectionAssignProduct, + CollectionAssignProductVariables + >; + unassignProduct: PartialMutationProviderOutput< + UnassignCollectionProduct, + UnassignCollectionProductVariables + >; + updateCollection: PartialMutationProviderOutput< + CollectionUpdate, + CollectionUpdateVariables + >; + removeCollection: PartialMutationProviderOutput< + RemoveCollection, + RemoveCollectionVariables + >; + } + ) => React.ReactNode; + onUpdate: (data: CollectionUpdate) => void; + onProductAssign: (data: CollectionAssignProduct) => void; + onProductUnassign: (data: UnassignCollectionProduct) => void; + onRemove: (data: RemoveCollection) => void; +} + +const CollectionOperations: React.StatelessComponent< + CollectionUpdateOperationsProps +> = ({ children, onUpdate, onProductAssign, onProductUnassign, onRemove }) => ( + + {(...updateCollection) => ( + + {(...removeCollection) => ( + + {(...assignProduct) => ( + + {(...updateWithHomepage) => ( + + {(...unassignProduct) => + children({ + assignProduct: getMutationProviderData( + ...assignProduct + ), + removeCollection: getMutationProviderData( + ...removeCollection + ), + unassignProduct: getMutationProviderData( + ...unassignProduct + ), + updateCollection: getMutationProviderData( + ...updateCollection + ), + updateCollectionWithHomepage: getMutationProviderData( + ...updateWithHomepage + ) + }) + } + + )} + + )} + + )} + + )} + +); +export default CollectionOperations; diff --git a/src/collections/fixtures.ts b/src/collections/fixtures.ts new file mode 100644 index 000000000..423cf82fc --- /dev/null +++ b/src/collections/fixtures.ts @@ -0,0 +1,123 @@ +import { content } from "../storybook/stories/components/RichTextEditor"; +import { CollectionDetails_collection } from "./types/CollectionDetails"; +import { CollectionList_collections_edges_node } from "./types/CollectionList"; + +export const collections: CollectionList_collections_edges_node[] = [ + { + __typename: "Collection", + id: "Q29sbGVjdGlvbjox", + isPublished: true, + name: "Summer collection", + products: { + __typename: "ProductCountableConnection", + totalCount: 4 + } + }, + { + __typename: "Collection", + id: "Q29sbGVjdGlvbjoy", + isPublished: true, + name: "Winter sale", + products: { + __typename: "ProductCountableConnection", + totalCount: 4 + } + } +]; +export const collection: ( + placeholderCollectionImage: string, + placeholderProductImage: string +) => CollectionDetails_collection = ( + placeholderCollectionImage, + placeholderImage +) => ({ + __typename: "Collection", + backgroundImage: { + __typename: "Image", + alt: "Alt text", + url: placeholderCollectionImage + }, + descriptionJson: JSON.stringify(content), + id: "Q29sbGVjdGlvbjox", + isPublished: true, + name: "Summer collection", + products: { + __typename: "ProductCountableConnection", + edges: [ + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjA=", + node: { + __typename: "Product", + id: "UHJvZHVjdDoxNw==", + isPublished: true, + name: "Murray Inc", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mg==", + name: "Mugs" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjE=", + node: { + __typename: "Product", + id: "UHJvZHVjdDoyNw==", + isPublished: true, + name: "Williams-Taylor", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjI=", + node: { + __typename: "Product", + id: "UHJvZHVjdDoyOQ==", + isPublished: true, + name: "Hebert-Sherman", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Mw==", + name: "Coffee" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + }, + { + __typename: "ProductCountableEdge", + cursor: "YXJyYXljb25uZWN0aW9uOjM=", + node: { + __typename: "Product", + id: "UHJvZHVjdDo1Mw==", + isPublished: true, + name: "Estes, Johnson and Graham", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6Ng==", + name: "Books" + }, + thumbnail: { __typename: "Image", url: placeholderImage } + } + } + ], + pageInfo: { + __typename: "PageInfo", + endCursor: "", + hasNextPage: false, + hasPreviousPage: false, + startCursor: "" + } + }, + publicationDate: "2018-08-25T18:45:54.125Z", + seoDescription: "", + seoTitle: "" +}); diff --git a/src/collections/index.tsx b/src/collections/index.tsx new file mode 100644 index 000000000..9706de5ce --- /dev/null +++ b/src/collections/index.tsx @@ -0,0 +1,52 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { + collectionAddPath, + collectionListPath, + CollectionListUrlQueryParams, + collectionPath, + CollectionUrlQueryParams +} from "./urls"; +import CollectionCreate from "./views/CollectionCreate"; +import CollectionDetailsView from "./views/CollectionDetails"; +import CollectionListView from "./views/CollectionList"; + +const CollectionList: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: CollectionListUrlQueryParams = qs; + return ; +}; + +interface CollectionDetailsRouteProps { + id: string; +} +const CollectionDetails: React.StatelessComponent< + RouteComponentProps +> = ({ location, match }) => { + const qs = parseQs(location.search.substr(1)); + const params: CollectionUrlQueryParams = qs; + return ( + + ); +}; + +const Component = () => ( + <> + + + + + + + +); +export default Component; diff --git a/src/collections/mutations.ts b/src/collections/mutations.ts new file mode 100644 index 000000000..94623492f --- /dev/null +++ b/src/collections/mutations.ts @@ -0,0 +1,245 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { + collectionDetailsFragment, + collectionProductFragment +} from "./queries"; +import { + CollectionAssignProduct, + CollectionAssignProductVariables +} from "./types/CollectionAssignProduct"; +import { + CollectionBulkDelete, + CollectionBulkDeleteVariables +} from "./types/CollectionBulkDelete"; +import { + CollectionBulkPublish, + CollectionBulkPublishVariables +} from "./types/CollectionBulkPublish"; +import { + CollectionUpdate, + CollectionUpdateVariables +} from "./types/CollectionUpdate"; +import { + CollectionUpdateWithHomepage, + CollectionUpdateWithHomepageVariables +} from "./types/CollectionUpdateWithHomepage"; +import { + CreateCollection, + CreateCollectionVariables +} from "./types/CreateCollection"; +import { + RemoveCollection, + RemoveCollectionVariables +} from "./types/RemoveCollection"; +import { + UnassignCollectionProduct, + UnassignCollectionProductVariables +} from "./types/UnassignCollectionProduct"; + +const collectionUpdate = gql` + ${collectionDetailsFragment} + mutation CollectionUpdate($id: ID!, $input: CollectionInput!) { + collectionUpdate(id: $id, input: $input) { + errors { + field + message + } + collection { + ...CollectionDetailsFragment + } + } + } +`; +export const TypedCollectionUpdateMutation = TypedMutation< + CollectionUpdate, + CollectionUpdateVariables +>(collectionUpdate); + +const collectionUpdateWithHomepage = gql` + ${collectionDetailsFragment} + mutation CollectionUpdateWithHomepage( + $id: ID! + $input: CollectionInput! + $homepageId: ID + ) { + homepageCollectionUpdate(collection: $homepageId) { + errors { + field + message + } + shop { + homepageCollection { + id + } + } + } + collectionUpdate(id: $id, input: $input) { + errors { + field + message + } + collection { + ...CollectionDetailsFragment + } + } + } +`; +export const TypedCollectionUpdateWithHomepageMutation = TypedMutation< + CollectionUpdateWithHomepage, + CollectionUpdateWithHomepageVariables +>(collectionUpdateWithHomepage); + +const assignCollectionProduct = gql` + ${collectionProductFragment} + mutation CollectionAssignProduct( + $collectionId: ID! + $productIds: [ID!]! + $first: Int + $after: String + $last: Int + $before: String + ) { + collectionAddProducts(collectionId: $collectionId, products: $productIds) { + errors { + field + message + } + collection { + id + products(first: $first, after: $after, before: $before, last: $last) { + edges { + node { + ...CollectionProductFragment + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + } + } + } + } +`; +export const TypedCollectionAssignProductMutation = TypedMutation< + CollectionAssignProduct, + CollectionAssignProductVariables +>(assignCollectionProduct); + +const createCollection = gql` + ${collectionDetailsFragment} + mutation CreateCollection($input: CollectionCreateInput!) { + collectionCreate(input: $input) { + errors { + field + message + } + collection { + ...CollectionDetailsFragment + } + } + } +`; +export const TypedCollectionCreateMutation = TypedMutation< + CreateCollection, + CreateCollectionVariables +>(createCollection); + +const removeCollection = gql` + mutation RemoveCollection($id: ID!) { + collectionDelete(id: $id) { + errors { + field + message + } + } + } +`; +export const TypedCollectionRemoveMutation = TypedMutation< + RemoveCollection, + RemoveCollectionVariables +>(removeCollection); + +const unassignCollectionProduct = gql` + mutation UnassignCollectionProduct( + $collectionId: ID! + $productIds: [ID]! + $first: Int + $after: String + $last: Int + $before: String + ) { + collectionRemoveProducts( + collectionId: $collectionId + products: $productIds + ) { + errors { + field + message + } + collection { + id + products(first: $first, after: $after, before: $before, last: $last) { + edges { + node { + id + isPublished + name + productType { + id + name + } + thumbnail { + url + } + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + } + } + } + } +`; +export const TypedUnassignCollectionProductMutation = TypedMutation< + UnassignCollectionProduct, + UnassignCollectionProductVariables +>(unassignCollectionProduct); + +const collectionBulkDelete = gql` + mutation CollectionBulkDelete($ids: [ID]!) { + collectionBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedCollectionBulkDelete = TypedMutation< + CollectionBulkDelete, + CollectionBulkDeleteVariables +>(collectionBulkDelete); + +const collectionBulkPublish = gql` + mutation CollectionBulkPublish($ids: [ID]!, $isPublished: Boolean!) { + collectionBulkPublish(ids: $ids, isPublished: $isPublished) { + errors { + field + message + } + } + } +`; +export const TypedCollectionBulkPublish = TypedMutation< + CollectionBulkPublish, + CollectionBulkPublishVariables +>(collectionBulkPublish); diff --git a/src/collections/queries.ts b/src/collections/queries.ts new file mode 100644 index 000000000..f13bcc24e --- /dev/null +++ b/src/collections/queries.ts @@ -0,0 +1,123 @@ +import gql from "graphql-tag"; + +import { TypedQuery } from "../queries"; +import { + CollectionDetails, + CollectionDetailsVariables +} from "./types/CollectionDetails"; +import { + CollectionList, + CollectionListVariables +} from "./types/CollectionList"; + +export const collectionFragment = gql` + fragment CollectionFragment on Collection { + id + isPublished + name + } +`; + +export const collectionDetailsFragment = gql` + ${collectionFragment} + fragment CollectionDetailsFragment on Collection { + ...CollectionFragment + backgroundImage { + alt + url + } + descriptionJson + publicationDate + seoDescription + seoTitle + isPublished + } +`; + +// This fragment is used to make sure that product's fields that are returned +// are always the same - fixes apollo cache +// https://github.com/apollographql/apollo-client/issues/2496 +// https://github.com/apollographql/apollo-client/issues/3468 +export const collectionProductFragment = gql` + fragment CollectionProductFragment on Product { + id + isPublished + name + productType { + id + name + } + thumbnail { + url + } + } +`; + +export const collectionList = gql` + ${collectionFragment} + query CollectionList( + $first: Int + $after: String + $last: Int + $before: String + ) { + collections(first: $first, after: $after, before: $before, last: $last) { + edges { + node { + ...CollectionFragment + products { + totalCount + } + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + } + } +`; +export const TypedCollectionListQuery = TypedQuery< + CollectionList, + CollectionListVariables +>(collectionList); + +export const collectionDetails = gql` + ${collectionDetailsFragment} + ${collectionProductFragment} + query CollectionDetails( + $id: ID! + $first: Int + $after: String + $last: Int + $before: String + ) { + collection(id: $id) { + ...CollectionDetailsFragment + products(first: $first, after: $after, before: $before, last: $last) { + edges { + node { + ...CollectionProductFragment + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + } + } + shop { + homepageCollection { + id + } + } + } +`; +export const TypedCollectionDetailsQuery = TypedQuery< + CollectionDetails, + CollectionDetailsVariables +>(collectionDetails); diff --git a/src/collections/types/AssignHomepageCollection.ts b/src/collections/types/AssignHomepageCollection.ts new file mode 100644 index 000000000..48c912009 --- /dev/null +++ b/src/collections/types/AssignHomepageCollection.ts @@ -0,0 +1,36 @@ +/* tslint:disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: AssignHomepageCollection +// ==================================================== + +export interface AssignHomepageCollection_homepageCollectionUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface AssignHomepageCollection_homepageCollectionUpdate_shop_homepageCollection { + __typename: "Collection"; + id: string; +} + +export interface AssignHomepageCollection_homepageCollectionUpdate_shop { + __typename: "Shop"; + homepageCollection: AssignHomepageCollection_homepageCollectionUpdate_shop_homepageCollection | null; +} + +export interface AssignHomepageCollection_homepageCollectionUpdate { + __typename: "HomepageCollectionUpdate"; + errors: AssignHomepageCollection_homepageCollectionUpdate_errors[] | null; + shop: AssignHomepageCollection_homepageCollectionUpdate_shop | null; +} + +export interface AssignHomepageCollection { + homepageCollectionUpdate: AssignHomepageCollection_homepageCollectionUpdate | null; +} + +export interface AssignHomepageCollectionVariables { + id?: string | null; +} diff --git a/src/collections/types/CollectionAssignProduct.ts b/src/collections/types/CollectionAssignProduct.ts new file mode 100644 index 000000000..dc8fd3839 --- /dev/null +++ b/src/collections/types/CollectionAssignProduct.ts @@ -0,0 +1,77 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: CollectionAssignProduct +// ==================================================== + +export interface CollectionAssignProduct_collectionAddProducts_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CollectionAssignProduct_collectionAddProducts_collection_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface CollectionAssignProduct_collectionAddProducts_collection_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface CollectionAssignProduct_collectionAddProducts_collection_products_edges_node { + __typename: "Product"; + id: string; + isPublished: boolean; + name: string; + productType: CollectionAssignProduct_collectionAddProducts_collection_products_edges_node_productType; + thumbnail: CollectionAssignProduct_collectionAddProducts_collection_products_edges_node_thumbnail | null; +} + +export interface CollectionAssignProduct_collectionAddProducts_collection_products_edges { + __typename: "ProductCountableEdge"; + node: CollectionAssignProduct_collectionAddProducts_collection_products_edges_node; +} + +export interface CollectionAssignProduct_collectionAddProducts_collection_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface CollectionAssignProduct_collectionAddProducts_collection_products { + __typename: "ProductCountableConnection"; + edges: CollectionAssignProduct_collectionAddProducts_collection_products_edges[]; + pageInfo: CollectionAssignProduct_collectionAddProducts_collection_products_pageInfo; +} + +export interface CollectionAssignProduct_collectionAddProducts_collection { + __typename: "Collection"; + id: string; + products: CollectionAssignProduct_collectionAddProducts_collection_products | null; +} + +export interface CollectionAssignProduct_collectionAddProducts { + __typename: "CollectionAddProducts"; + errors: CollectionAssignProduct_collectionAddProducts_errors[] | null; + collection: CollectionAssignProduct_collectionAddProducts_collection | null; +} + +export interface CollectionAssignProduct { + collectionAddProducts: CollectionAssignProduct_collectionAddProducts | null; +} + +export interface CollectionAssignProductVariables { + collectionId: string; + productIds: string[]; + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/collections/types/CollectionBulkDelete.ts b/src/collections/types/CollectionBulkDelete.ts new file mode 100644 index 000000000..3afafab50 --- /dev/null +++ b/src/collections/types/CollectionBulkDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: CollectionBulkDelete +// ==================================================== + +export interface CollectionBulkDelete_collectionBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CollectionBulkDelete_collectionBulkDelete { + __typename: "CollectionBulkDelete"; + errors: CollectionBulkDelete_collectionBulkDelete_errors[] | null; +} + +export interface CollectionBulkDelete { + collectionBulkDelete: CollectionBulkDelete_collectionBulkDelete | null; +} + +export interface CollectionBulkDeleteVariables { + ids: (string | null)[]; +} diff --git a/src/collections/types/CollectionBulkPublish.ts b/src/collections/types/CollectionBulkPublish.ts new file mode 100644 index 000000000..9cb56e743 --- /dev/null +++ b/src/collections/types/CollectionBulkPublish.ts @@ -0,0 +1,27 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: CollectionBulkPublish +// ==================================================== + +export interface CollectionBulkPublish_collectionBulkPublish_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CollectionBulkPublish_collectionBulkPublish { + __typename: "CollectionBulkPublish"; + errors: CollectionBulkPublish_collectionBulkPublish_errors[] | null; +} + +export interface CollectionBulkPublish { + collectionBulkPublish: CollectionBulkPublish_collectionBulkPublish | null; +} + +export interface CollectionBulkPublishVariables { + ids: (string | null)[]; + isPublished: boolean; +} diff --git a/src/collections/types/CollectionDetails.ts b/src/collections/types/CollectionDetails.ts new file mode 100644 index 000000000..bfbc9441c --- /dev/null +++ b/src/collections/types/CollectionDetails.ts @@ -0,0 +1,88 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: CollectionDetails +// ==================================================== + +export interface CollectionDetails_collection_backgroundImage { + __typename: "Image"; + alt: string | null; + url: string; +} + +export interface CollectionDetails_collection_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface CollectionDetails_collection_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface CollectionDetails_collection_products_edges_node { + __typename: "Product"; + id: string; + isPublished: boolean; + name: string; + productType: CollectionDetails_collection_products_edges_node_productType; + thumbnail: CollectionDetails_collection_products_edges_node_thumbnail | null; +} + +export interface CollectionDetails_collection_products_edges { + __typename: "ProductCountableEdge"; + node: CollectionDetails_collection_products_edges_node; +} + +export interface CollectionDetails_collection_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface CollectionDetails_collection_products { + __typename: "ProductCountableConnection"; + edges: CollectionDetails_collection_products_edges[]; + pageInfo: CollectionDetails_collection_products_pageInfo; +} + +export interface CollectionDetails_collection { + __typename: "Collection"; + id: string; + isPublished: boolean; + name: string; + backgroundImage: CollectionDetails_collection_backgroundImage | null; + descriptionJson: any; + publicationDate: any | null; + seoDescription: string | null; + seoTitle: string | null; + products: CollectionDetails_collection_products | null; +} + +export interface CollectionDetails_shop_homepageCollection { + __typename: "Collection"; + id: string; +} + +export interface CollectionDetails_shop { + __typename: "Shop"; + homepageCollection: CollectionDetails_shop_homepageCollection | null; +} + +export interface CollectionDetails { + collection: CollectionDetails_collection | null; + shop: CollectionDetails_shop | null; +} + +export interface CollectionDetailsVariables { + id: string; + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/collections/types/CollectionDetailsFragment.ts b/src/collections/types/CollectionDetailsFragment.ts new file mode 100644 index 000000000..24ae24d14 --- /dev/null +++ b/src/collections/types/CollectionDetailsFragment.ts @@ -0,0 +1,25 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: CollectionDetailsFragment +// ==================================================== + +export interface CollectionDetailsFragment_backgroundImage { + __typename: "Image"; + alt: string | null; + url: string; +} + +export interface CollectionDetailsFragment { + __typename: "Collection"; + id: string; + isPublished: boolean; + name: string; + backgroundImage: CollectionDetailsFragment_backgroundImage | null; + descriptionJson: any; + publicationDate: any | null; + seoDescription: string | null; + seoTitle: string | null; +} diff --git a/src/collections/types/CollectionFragment.ts b/src/collections/types/CollectionFragment.ts new file mode 100644 index 000000000..0dfb0475a --- /dev/null +++ b/src/collections/types/CollectionFragment.ts @@ -0,0 +1,14 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: CollectionFragment +// ==================================================== + +export interface CollectionFragment { + __typename: "Collection"; + id: string; + isPublished: boolean; + name: string; +} diff --git a/src/collections/types/CollectionList.ts b/src/collections/types/CollectionList.ts new file mode 100644 index 000000000..c17574dc0 --- /dev/null +++ b/src/collections/types/CollectionList.ts @@ -0,0 +1,50 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: CollectionList +// ==================================================== + +export interface CollectionList_collections_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface CollectionList_collections_edges_node { + __typename: "Collection"; + id: string; + isPublished: boolean; + name: string; + products: CollectionList_collections_edges_node_products | null; +} + +export interface CollectionList_collections_edges { + __typename: "CollectionCountableEdge"; + node: CollectionList_collections_edges_node; +} + +export interface CollectionList_collections_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface CollectionList_collections { + __typename: "CollectionCountableConnection"; + edges: CollectionList_collections_edges[]; + pageInfo: CollectionList_collections_pageInfo; +} + +export interface CollectionList { + collections: CollectionList_collections | null; +} + +export interface CollectionListVariables { + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/collections/types/CollectionProductFragment.ts b/src/collections/types/CollectionProductFragment.ts new file mode 100644 index 000000000..987f310e0 --- /dev/null +++ b/src/collections/types/CollectionProductFragment.ts @@ -0,0 +1,27 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: CollectionProductFragment +// ==================================================== + +export interface CollectionProductFragment_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface CollectionProductFragment_thumbnail { + __typename: "Image"; + url: string; +} + +export interface CollectionProductFragment { + __typename: "Product"; + id: string; + isPublished: boolean; + name: string; + productType: CollectionProductFragment_productType; + thumbnail: CollectionProductFragment_thumbnail | null; +} diff --git a/src/collections/types/CollectionUpdate.ts b/src/collections/types/CollectionUpdate.ts new file mode 100644 index 000000000..91453df7d --- /dev/null +++ b/src/collections/types/CollectionUpdate.ts @@ -0,0 +1,48 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CollectionInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: CollectionUpdate +// ==================================================== + +export interface CollectionUpdate_collectionUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CollectionUpdate_collectionUpdate_collection_backgroundImage { + __typename: "Image"; + alt: string | null; + url: string; +} + +export interface CollectionUpdate_collectionUpdate_collection { + __typename: "Collection"; + id: string; + isPublished: boolean; + name: string; + backgroundImage: CollectionUpdate_collectionUpdate_collection_backgroundImage | null; + descriptionJson: any; + publicationDate: any | null; + seoDescription: string | null; + seoTitle: string | null; +} + +export interface CollectionUpdate_collectionUpdate { + __typename: "CollectionUpdate"; + errors: CollectionUpdate_collectionUpdate_errors[] | null; + collection: CollectionUpdate_collectionUpdate_collection | null; +} + +export interface CollectionUpdate { + collectionUpdate: CollectionUpdate_collectionUpdate | null; +} + +export interface CollectionUpdateVariables { + id: string; + input: CollectionInput; +} diff --git a/src/collections/types/CollectionUpdateWithHomepage.ts b/src/collections/types/CollectionUpdateWithHomepage.ts new file mode 100644 index 000000000..f378cc904 --- /dev/null +++ b/src/collections/types/CollectionUpdateWithHomepage.ts @@ -0,0 +1,72 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CollectionInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: CollectionUpdateWithHomepage +// ==================================================== + +export interface CollectionUpdateWithHomepage_homepageCollectionUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CollectionUpdateWithHomepage_homepageCollectionUpdate_shop_homepageCollection { + __typename: "Collection"; + id: string; +} + +export interface CollectionUpdateWithHomepage_homepageCollectionUpdate_shop { + __typename: "Shop"; + homepageCollection: CollectionUpdateWithHomepage_homepageCollectionUpdate_shop_homepageCollection | null; +} + +export interface CollectionUpdateWithHomepage_homepageCollectionUpdate { + __typename: "HomepageCollectionUpdate"; + errors: CollectionUpdateWithHomepage_homepageCollectionUpdate_errors[] | null; + shop: CollectionUpdateWithHomepage_homepageCollectionUpdate_shop | null; +} + +export interface CollectionUpdateWithHomepage_collectionUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CollectionUpdateWithHomepage_collectionUpdate_collection_backgroundImage { + __typename: "Image"; + alt: string | null; + url: string; +} + +export interface CollectionUpdateWithHomepage_collectionUpdate_collection { + __typename: "Collection"; + id: string; + isPublished: boolean; + name: string; + backgroundImage: CollectionUpdateWithHomepage_collectionUpdate_collection_backgroundImage | null; + descriptionJson: any; + publicationDate: any | null; + seoDescription: string | null; + seoTitle: string | null; +} + +export interface CollectionUpdateWithHomepage_collectionUpdate { + __typename: "CollectionUpdate"; + errors: CollectionUpdateWithHomepage_collectionUpdate_errors[] | null; + collection: CollectionUpdateWithHomepage_collectionUpdate_collection | null; +} + +export interface CollectionUpdateWithHomepage { + homepageCollectionUpdate: CollectionUpdateWithHomepage_homepageCollectionUpdate | null; + collectionUpdate: CollectionUpdateWithHomepage_collectionUpdate | null; +} + +export interface CollectionUpdateWithHomepageVariables { + id: string; + input: CollectionInput; + homepageId?: string | null; +} diff --git a/src/collections/types/CreateCollection.ts b/src/collections/types/CreateCollection.ts new file mode 100644 index 000000000..25987de78 --- /dev/null +++ b/src/collections/types/CreateCollection.ts @@ -0,0 +1,47 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CollectionCreateInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: CreateCollection +// ==================================================== + +export interface CreateCollection_collectionCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CreateCollection_collectionCreate_collection_backgroundImage { + __typename: "Image"; + alt: string | null; + url: string; +} + +export interface CreateCollection_collectionCreate_collection { + __typename: "Collection"; + id: string; + isPublished: boolean; + name: string; + backgroundImage: CreateCollection_collectionCreate_collection_backgroundImage | null; + descriptionJson: any; + publicationDate: any | null; + seoDescription: string | null; + seoTitle: string | null; +} + +export interface CreateCollection_collectionCreate { + __typename: "CollectionCreate"; + errors: CreateCollection_collectionCreate_errors[] | null; + collection: CreateCollection_collectionCreate_collection | null; +} + +export interface CreateCollection { + collectionCreate: CreateCollection_collectionCreate | null; +} + +export interface CreateCollectionVariables { + input: CollectionCreateInput; +} diff --git a/src/collections/types/RemoveCollection.ts b/src/collections/types/RemoveCollection.ts new file mode 100644 index 000000000..de2c96483 --- /dev/null +++ b/src/collections/types/RemoveCollection.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: RemoveCollection +// ==================================================== + +export interface RemoveCollection_collectionDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface RemoveCollection_collectionDelete { + __typename: "CollectionDelete"; + errors: RemoveCollection_collectionDelete_errors[] | null; +} + +export interface RemoveCollection { + collectionDelete: RemoveCollection_collectionDelete | null; +} + +export interface RemoveCollectionVariables { + id: string; +} diff --git a/src/collections/types/SearchProducts.ts b/src/collections/types/SearchProducts.ts new file mode 100644 index 000000000..495338a8e --- /dev/null +++ b/src/collections/types/SearchProducts.ts @@ -0,0 +1,44 @@ +/* tslint:disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: SearchProducts +// ==================================================== + +export interface SearchProducts_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface SearchProducts_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface SearchProducts_products_edges_node { + __typename: "Product"; + id: string; + isPublished: boolean; + name: string; + productType: SearchProducts_products_edges_node_productType; + thumbnail: SearchProducts_products_edges_node_thumbnail | null; +} + +export interface SearchProducts_products_edges { + __typename: "ProductCountableEdge"; + node: SearchProducts_products_edges_node; +} + +export interface SearchProducts_products { + __typename: "ProductCountableConnection"; + edges: SearchProducts_products_edges[]; +} + +export interface SearchProducts { + products: SearchProducts_products | null; +} + +export interface SearchProductsVariables { + query: string; +} diff --git a/src/collections/types/UnassignCollectionProduct.ts b/src/collections/types/UnassignCollectionProduct.ts new file mode 100644 index 000000000..d5bbfc650 --- /dev/null +++ b/src/collections/types/UnassignCollectionProduct.ts @@ -0,0 +1,77 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: UnassignCollectionProduct +// ==================================================== + +export interface UnassignCollectionProduct_collectionRemoveProducts_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface UnassignCollectionProduct_collectionRemoveProducts_collection_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface UnassignCollectionProduct_collectionRemoveProducts_collection_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface UnassignCollectionProduct_collectionRemoveProducts_collection_products_edges_node { + __typename: "Product"; + id: string; + isPublished: boolean; + name: string; + productType: UnassignCollectionProduct_collectionRemoveProducts_collection_products_edges_node_productType; + thumbnail: UnassignCollectionProduct_collectionRemoveProducts_collection_products_edges_node_thumbnail | null; +} + +export interface UnassignCollectionProduct_collectionRemoveProducts_collection_products_edges { + __typename: "ProductCountableEdge"; + node: UnassignCollectionProduct_collectionRemoveProducts_collection_products_edges_node; +} + +export interface UnassignCollectionProduct_collectionRemoveProducts_collection_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface UnassignCollectionProduct_collectionRemoveProducts_collection_products { + __typename: "ProductCountableConnection"; + edges: UnassignCollectionProduct_collectionRemoveProducts_collection_products_edges[]; + pageInfo: UnassignCollectionProduct_collectionRemoveProducts_collection_products_pageInfo; +} + +export interface UnassignCollectionProduct_collectionRemoveProducts_collection { + __typename: "Collection"; + id: string; + products: UnassignCollectionProduct_collectionRemoveProducts_collection_products | null; +} + +export interface UnassignCollectionProduct_collectionRemoveProducts { + __typename: "CollectionRemoveProducts"; + errors: UnassignCollectionProduct_collectionRemoveProducts_errors[] | null; + collection: UnassignCollectionProduct_collectionRemoveProducts_collection | null; +} + +export interface UnassignCollectionProduct { + collectionRemoveProducts: UnassignCollectionProduct_collectionRemoveProducts | null; +} + +export interface UnassignCollectionProductVariables { + collectionId: string; + productIds: (string | null)[]; + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/collections/urls.ts b/src/collections/urls.ts new file mode 100644 index 000000000..305fadbee --- /dev/null +++ b/src/collections/urls.ts @@ -0,0 +1,29 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { BulkAction, Dialog, Pagination } from "../types"; + +const collectionSectionUrl = "/collections/"; + +export const collectionListPath = collectionSectionUrl; +export type CollectionListUrlDialog = "publish" | "unpublish" | "remove"; +export type CollectionListUrlQueryParams = BulkAction & + Dialog & + Pagination; +export const collectionListUrl = (params?: CollectionListUrlQueryParams) => + collectionSectionUrl + "?" + stringifyQs(params); + +export const collectionPath = (id: string) => urlJoin(collectionSectionUrl, id); +export type CollectionUrlDialog = + | "remove" + | "removeImage" + | "assign" + | "unassign"; +export type CollectionUrlQueryParams = BulkAction & + Pagination & + Dialog; +export const collectionUrl = (id: string, params?: CollectionUrlQueryParams) => + collectionPath(encodeURIComponent(id)) + "?" + stringifyQs(params); + +export const collectionAddPath = urlJoin(collectionSectionUrl, "add"); +export const collectionAddUrl = collectionAddPath; diff --git a/src/collections/views/CollectionCreate.tsx b/src/collections/views/CollectionCreate.tsx new file mode 100644 index 000000000..24c4eb73f --- /dev/null +++ b/src/collections/views/CollectionCreate.tsx @@ -0,0 +1,78 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import { CollectionCreateInput } from "../../types/globalTypes"; +import CollectionCreatePage from "../components/CollectionCreatePage/CollectionCreatePage"; +import { TypedCollectionCreateMutation } from "../mutations"; +import { CreateCollection } from "../types/CreateCollection"; +import { collectionListUrl, collectionUrl } from "../urls"; + +export const CollectionCreate: React.StatelessComponent<{}> = () => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const handleCollectionCreateSuccess = (data: CreateCollection) => { + if (data.collectionCreate.errors.length === 0) { + notify({ + text: i18n.t("Created collection", { + context: "notification" + }) + }); + navigate(collectionUrl(data.collectionCreate.collection.id)); + } else { + const backgroundImageError = data.collectionCreate.errors.find( + error => + error.field === ("backgroundImage" as keyof CollectionCreateInput) + ); + if (backgroundImageError) { + notify({ + text: backgroundImageError.message + }); + } + } + }; + return ( + + {(createCollection, { called, data, loading }) => { + const formTransitionState = getMutationState( + called, + loading, + maybe(() => data.collectionCreate.errors) + ); + return ( + <> + + data.collectionCreate.errors, [])} + onBack={() => navigate(collectionListUrl())} + disabled={loading} + onSubmit={formData => + createCollection({ + variables: { + input: { + backgroundImage: formData.backgroundImage.value, + backgroundImageAlt: formData.backgroundImageAlt, + descriptionJson: JSON.stringify(formData.description), + isPublished: formData.isPublished, + name: formData.name, + seo: { + description: formData.seoDescription, + title: formData.seoTitle + } + } + } + }) + } + saveButtonBarState={formTransitionState} + /> + + ); + }} + + ); +}; +export default CollectionCreate; diff --git a/src/collections/views/CollectionDetails.tsx b/src/collections/views/CollectionDetails.tsx new file mode 100644 index 000000000..f9e8c7a3c --- /dev/null +++ b/src/collections/views/CollectionDetails.tsx @@ -0,0 +1,395 @@ +import Button from "@material-ui/core/Button"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import AssignProductDialog from "@saleor/components/AssignProductDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { DEFAULT_INITIAL_SEARCH_DATA, PAGINATE_BY } from "../../config"; +import SearchProducts from "../../containers/SearchProducts"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import { productUrl } from "../../products/urls"; +import { CollectionInput } from "../../types/globalTypes"; +import CollectionDetailsPage, { + CollectionDetailsPageFormData +} from "../components/CollectionDetailsPage/CollectionDetailsPage"; +import CollectionOperations from "../containers/CollectionOperations"; +import { TypedCollectionDetailsQuery } from "../queries"; +import { CollectionAssignProduct } from "../types/CollectionAssignProduct"; +import { CollectionUpdate } from "../types/CollectionUpdate"; +import { RemoveCollection } from "../types/RemoveCollection"; +import { UnassignCollectionProduct } from "../types/UnassignCollectionProduct"; +import { + collectionListUrl, + collectionUrl, + CollectionUrlDialog, + CollectionUrlQueryParams +} from "../urls"; + +interface CollectionDetailsProps { + id: string; + params: CollectionUrlQueryParams; +} + +export const CollectionDetails: React.StatelessComponent< + CollectionDetailsProps +> = ({ id, params }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + const paginate = usePaginator(); + + const closeModal = () => + navigate( + collectionUrl(id, { + ...params, + action: undefined + }), + true + ); + const openModal = (action: CollectionUrlDialog) => + navigate( + collectionUrl(id, { + ...params, + action + }), + false + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + + return ( + + {({ data, loading }) => { + const handleCollectionUpdate = (data: CollectionUpdate) => { + if (data.collectionUpdate.errors.length === 0) { + notify({ + text: i18n.t("Updated collection", { + context: "notification" + }) + }); + navigate(collectionUrl(id)); + } else { + const backgroundImageError = data.collectionUpdate.errors.find( + error => + error.field === ("backgroundImage" as keyof CollectionInput) + ); + if (backgroundImageError) { + notify({ + text: backgroundImageError.message + }); + } + } + }; + + const handleProductAssign = (data: CollectionAssignProduct) => { + if (data.collectionAddProducts.errors.length === 0) { + notify({ + text: i18n.t("Added product to collection", { + context: "notification" + }) + }); + navigate(collectionUrl(id), true); + } + }; + + const handleProductUnassign = (data: UnassignCollectionProduct) => { + if (data.collectionRemoveProducts.errors.length === 0) { + notify({ + text: i18n.t("Removed product from collection", { + context: "notification" + }) + }); + reset(); + closeModal(); + } + }; + + const handleCollectionRemove = (data: RemoveCollection) => { + if (data.collectionDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed collection", { + context: "notification" + }) + }); + navigate(collectionListUrl()); + } + }; + return ( + + {({ + updateCollection, + updateCollectionWithHomepage, + assignProduct, + unassignProduct, + removeCollection + }) => { + const handleSubmit = ( + formData: CollectionDetailsPageFormData + ) => { + const input: CollectionInput = { + backgroundImageAlt: formData.backgroundImageAlt, + descriptionJson: JSON.stringify(formData.description), + isPublished: formData.isPublished, + name: formData.name, + publicationDate: formData.publicationDate, + seo: { + description: formData.seoDescription, + title: formData.seoTitle + } + }; + const isFeatured = data.shop.homepageCollection + ? data.shop.homepageCollection.id === data.collection.id + : false; + + if (formData.isFeatured !== isFeatured) { + updateCollectionWithHomepage.mutate({ + homepageId: formData.isFeatured ? id : null, + id, + input + }); + } else { + updateCollection.mutate({ + id, + input + }); + } + }; + + const formTransitionState = getMutationState( + updateCollection.opts.called || + updateCollectionWithHomepage.opts.called, + updateCollection.opts.loading || + updateCollectionWithHomepage.opts.loading, + maybe(() => updateCollection.opts.data.collectionUpdate.errors), + maybe( + () => + updateCollectionWithHomepage.opts.data.collectionUpdate + .errors + ), + maybe( + () => + updateCollectionWithHomepage.opts.data + .homepageCollectionUpdate.errors + ) + ); + const assignTransitionState = getMutationState( + assignProduct.opts.called, + assignProduct.opts.loading, + maybe( + () => assignProduct.opts.data.collectionAddProducts.errors + ) + ); + const unassignTransitionState = getMutationState( + unassignProduct.opts.called, + unassignProduct.opts.loading, + maybe( + () => + unassignProduct.opts.data.collectionRemoveProducts.errors + ) + ); + const removeTransitionState = getMutationState( + removeCollection.opts.called, + removeCollection.opts.loading, + maybe(() => removeCollection.opts.data.collectionDelete.errors) + ); + const imageRemoveTransitionState = getMutationState( + updateCollection.opts.called, + updateCollection.opts.loading, + maybe(() => updateCollection.opts.data.collectionUpdate.errors) + ); + + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.collection.products.pageInfo), + paginationState, + params + ); + + return ( + <> + data.collection.name)} /> + openModal("assign")} + onBack={() => navigate(collectionListUrl())} + disabled={loading} + collection={data.collection} + isFeatured={maybe( + () => + data.shop.homepageCollection.id === data.collection.id, + false + )} + onCollectionRemove={() => openModal("remove")} + onImageDelete={() => openModal("removeImage")} + onImageUpload={file => + updateCollection.mutate({ + id, + input: { + backgroundImage: file + } + }) + } + onSubmit={handleSubmit} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + pageInfo={pageInfo} + onProductUnassign={(productId, event) => { + event.stopPropagation(); + unassignProduct.mutate({ + collectionId: id, + productIds: [productId], + ...paginationState + }); + }} + onRowClick={id => () => navigate(productUrl(id))} + saveButtonBarState={formTransitionState} + toolbar={ + + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + /> + + {({ search, result }) => ( + navigate(collectionUrl(id), true, true)} + onSubmit={formData => + assignProduct.mutate({ + ...paginationState, + collectionId: id, + productIds: formData.products.map( + product => product.id + ) + }) + } + products={maybe(() => + result.data.products.edges + .map(edge => edge.node) + .filter(suggestedProduct => suggestedProduct.id) + )} + /> + )} + + removeCollection.mutate({ id })} + open={params.action === "remove"} + title={i18n.t("Remove collection", { + context: "modal title" + })} + variant="delete" + > + {{ collectionName }}?", + { + collectionName: maybe( + () => data.collection.name, + "..." + ), + context: "modal" + } + ) + }} + /> + + + unassignProduct.mutate({ + ...paginationState, + collectionId: id, + productIds: params.ids + }) + } + open={params.action === "unassign"} + title={i18n.t("Unassign products from collection", { + context: "modal title" + })} + > + {{ number }} products?", + { + context: "modal", + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + updateCollection.mutate({ + id, + input: { + backgroundImage: null + } + }) + } + open={params.action === "removeImage"} + title={i18n.t("Remove image", { + context: "modal title" + })} + variant="delete" + > + + {i18n.t( + "Are you sure you want to remove collection's image?" + )} + + + + ); + }} + + ); + }} + + ); +}; +export default CollectionDetails; diff --git a/src/collections/views/CollectionList.tsx b/src/collections/views/CollectionList.tsx new file mode 100644 index 000000000..4914dbbaf --- /dev/null +++ b/src/collections/views/CollectionList.tsx @@ -0,0 +1,262 @@ +import Button from "@material-ui/core/Button"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { PAGINATE_BY } from "../../config"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import CollectionListPage from "../components/CollectionListPage/CollectionListPage"; +import { + TypedCollectionBulkDelete, + TypedCollectionBulkPublish +} from "../mutations"; +import { TypedCollectionListQuery } from "../queries"; +import { CollectionBulkDelete } from "../types/CollectionBulkDelete"; +import { CollectionBulkPublish } from "../types/CollectionBulkPublish"; +import { + collectionAddUrl, + collectionListUrl, + CollectionListUrlDialog, + CollectionListUrlQueryParams, + collectionUrl +} from "../urls"; + +interface CollectionListProps { + params: CollectionListUrlQueryParams; +} + +export const CollectionList: React.StatelessComponent = ({ + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const closeModal = () => + navigate( + collectionListUrl({ + ...params, + action: undefined, + ids: undefined + }), + true + ); + + const openModal = (action: CollectionListUrlDialog, ids: string[]) => + navigate( + collectionListUrl({ + action, + ids + }) + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + return ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.collections.pageInfo), + paginationState, + params + ); + + const handleCollectionBulkDelete = (data: CollectionBulkDelete) => { + if (data.collectionBulkDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed collections") + }); + refetch(); + reset(); + closeModal(); + } + }; + + const handleCollectionBulkPublish = (data: CollectionBulkPublish) => { + if (data.collectionBulkPublish.errors.length === 0) { + notify({ + text: i18n.t("Changed publication status") + }); + refetch(); + reset(); + closeModal(); + } + }; + + return ( + + {(collectionBulkDelete, collectionBulkDeleteOpts) => ( + + {(collectionBulkPublish, collectionBulkPublishOpts) => { + const bulkDeleteTransitionState = getMutationState( + collectionBulkDeleteOpts.called, + collectionBulkDeleteOpts.loading, + maybe( + () => + collectionBulkDeleteOpts.data.collectionBulkDelete + .errors + ) + ); + + const bulkPublishTransitionState = getMutationState( + collectionBulkPublishOpts.called, + collectionBulkPublishOpts.loading, + maybe( + () => + collectionBulkPublishOpts.data.collectionBulkPublish + .errors + ) + ); + + return ( + <> + navigate(collectionAddUrl)} + disabled={loading} + collections={maybe(() => + data.collections.edges.map(edge => edge.node) + )} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + pageInfo={pageInfo} + onRowClick={id => () => navigate(collectionUrl(id))} + toolbar={ + <> + + + openModal("remove", listElements)} + > + + + + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + /> + + collectionBulkPublish({ + variables: { + ids: params.ids, + isPublished: true + } + }) + } + variant="default" + title={i18n.t("Publish collections")} + > + {{ number }} collections?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + collectionBulkPublish({ + variables: { + ids: params.ids, + isPublished: false + } + }) + } + variant="default" + title={i18n.t("Unpublish collections")} + > + {{ number }} collections?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + collectionBulkDelete({ + variables: { + ids: params.ids + } + }) + } + variant="delete" + title={i18n.t("Remove collections")} + > + {{ number }} collections?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + )} + + ); + }} + + ); +}; +export default CollectionList; diff --git a/src/components/ActionDialog/ActionDialog.tsx b/src/components/ActionDialog/ActionDialog.tsx new file mode 100644 index 000000000..ef4e4786f --- /dev/null +++ b/src/components/ActionDialog/ActionDialog.tsx @@ -0,0 +1,80 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as classNames from "classnames"; +import * as React from "react"; + +import i18n from "../../i18n"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "../ConfirmButton/ConfirmButton"; + +const styles = (theme: Theme) => + createStyles({ + deleteButton: { + "&:hover": { + backgroundColor: theme.palette.error.main + }, + backgroundColor: theme.palette.error.main, + color: theme.palette.error.contrastText + } + }); + +interface ActionDialogProps extends WithStyles { + children?: React.ReactNode; + confirmButtonLabel?: string; + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + title: string; + variant?: "default" | "delete"; + onClose?(); + onConfirm(); +} + +const ActionDialog = withStyles(styles, { name: "ActionDialog" })( + ({ + children, + classes, + confirmButtonLabel, + confirmButtonState, + open, + title, + variant, + onConfirm, + onClose + }: ActionDialogProps) => ( + + {title} + {children} + + + + {confirmButtonLabel || + (variant === "delete" + ? i18n.t("Delete", { context: "button" }) + : i18n.t("Confirm", { context: "button" }))} + + + + ) +); +ActionDialog.displayName = "ActionDialog"; +export default ActionDialog; diff --git a/src/components/ActionDialog/index.ts b/src/components/ActionDialog/index.ts new file mode 100644 index 000000000..1b7746fa0 --- /dev/null +++ b/src/components/ActionDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ActionDialog"; +export * from "./ActionDialog"; diff --git a/src/components/AddressEdit/AddressEdit.tsx b/src/components/AddressEdit/AddressEdit.tsx new file mode 100644 index 000000000..0e93fd823 --- /dev/null +++ b/src/components/AddressEdit/AddressEdit.tsx @@ -0,0 +1,187 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import { AddressTypeInput } from "../../customers/types"; +import i18n from "../../i18n"; +import { maybe } from "../../misc"; +import { FormErrors } from "../../types"; +import FormSpacer from "../FormSpacer"; +import SingleAutocompleteSelectField from "../SingleAutocompleteSelectField"; + +const styles = (theme: Theme) => + createStyles({ + root: { + display: "grid", + gridColumnGap: `${theme.spacing.unit * 2}px`, + gridTemplateColumns: "1fr 1fr" + } + }); + +interface AddressEditProps extends WithStyles { + countries?: Array<{ + code: string; + label: string; + }>; + data: AddressTypeInput; + disabled?: boolean; + errors: FormErrors; + onChange(event: React.ChangeEvent); +} + +const AddressEdit = withStyles(styles, { name: "AddressEdit" })( + ({ + classes, + countries, + data, + disabled, + errors, + onChange + }: AddressEditProps) => ( + <> +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + countries.map(c => ({ ...c, value: c.code })), + [] + )} + InputProps={{ + autoComplete: "off" + }} + /> +
    +
    + +
    +
    + + ) +); +AddressEdit.displayName = "AddressEdit"; +export default AddressEdit; diff --git a/src/components/AddressEdit/index.ts b/src/components/AddressEdit/index.ts new file mode 100644 index 000000000..677fa7730 --- /dev/null +++ b/src/components/AddressEdit/index.ts @@ -0,0 +1,2 @@ +export { default } from "./AddressEdit"; +export * from "./AddressEdit"; diff --git a/src/components/AddressFormatter/AddressFormatter.tsx b/src/components/AddressFormatter/AddressFormatter.tsx new file mode 100644 index 000000000..db16de1a4 --- /dev/null +++ b/src/components/AddressFormatter/AddressFormatter.tsx @@ -0,0 +1,48 @@ +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import { AddressType } from "../../customers/types"; +import Skeleton from "../Skeleton"; + +interface AddressFormatterProps { + address?: AddressType; +} + +const AddressFormatter: React.StatelessComponent = ({ + address +}) => { + if (!address) { + return ; + } + return ( +
    + + {address.firstName} {address.lastName} + + {address.companyName && ( + {address.companyName} + )} + + {address.streetAddress1} +
    + {address.streetAddress2} +
    + + {" "} + {address.postalCode} {address.city} + {address.cityArea ? ", " + address.cityArea : ""} + + + {address.countryArea + ? address.countryArea + ", " + address.country.country + : address.country.country} + +
    + ); +}; +AddressFormatter.displayName = "AddressFormatter"; +export default AddressFormatter; diff --git a/src/components/AddressFormatter/index.ts b/src/components/AddressFormatter/index.ts new file mode 100644 index 000000000..43c84b55e --- /dev/null +++ b/src/components/AddressFormatter/index.ts @@ -0,0 +1,2 @@ +export { default } from "./AddressFormatter"; +export * from "./AddressFormatter"; diff --git a/src/components/AppHeader/AppHeader.tsx b/src/components/AppHeader/AppHeader.tsx new file mode 100644 index 000000000..1cd32ed5a --- /dev/null +++ b/src/components/AppHeader/AppHeader.tsx @@ -0,0 +1,74 @@ +import Portal from "@material-ui/core/Portal"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import ArrowBackIcon from "@material-ui/icons/ArrowBack"; +import * as React from "react"; +import AppHeaderContext from "../AppLayout/AppHeaderContext"; +import Skeleton from "../Skeleton"; + +export interface AppHeaderProps { + children: React.ReactNode; + onBack(); +} + +const styles = (theme: Theme) => + createStyles({ + menuButton: { + flex: "0 0 auto", + marginLeft: theme.spacing.unit * -2, + marginRight: theme.spacing.unit, + marginTop: -theme.spacing.unit * 2 + }, + root: { + "&:hover": { + color: theme.typography.body2.color + }, + alignItems: "center", + color: theme.palette.grey[500], + cursor: "pointer", + display: "flex", + marginTop: theme.spacing.unit / 2, + transition: theme.transitions.duration.standard + "ms" + }, + skeleton: { + marginBottom: theme.spacing.unit * 2, + width: "10rem" + }, + title: { + color: "inherit", + flex: 1, + marginLeft: theme.spacing.unit, + textTransform: "uppercase" + } + }); +const AppHeader = withStyles(styles, { name: "AppHeader" })( + ({ + children, + classes, + onBack + }: AppHeaderProps & WithStyles) => ( + + {anchor => + anchor ? ( + +
    + + {children ? ( + {children} + ) : ( + + )} +
    +
    + ) : null + } +
    + ) +); +AppHeader.displayName = "AppHeader"; +export default AppHeader; diff --git a/src/components/AppHeader/index.ts b/src/components/AppHeader/index.ts new file mode 100644 index 000000000..a17981843 --- /dev/null +++ b/src/components/AppHeader/index.ts @@ -0,0 +1,2 @@ +export { default } from './AppHeader'; +export * from './AppHeader'; \ No newline at end of file diff --git a/src/components/AppLayout/AppActionContext.tsx b/src/components/AppLayout/AppActionContext.tsx new file mode 100644 index 000000000..31e3de50d --- /dev/null +++ b/src/components/AppLayout/AppActionContext.tsx @@ -0,0 +1,7 @@ +import * as React from "react"; + +const AppActionContext = React.createContext>( + undefined +); + +export default AppActionContext; diff --git a/src/components/AppLayout/AppHeaderContext.tsx b/src/components/AppLayout/AppHeaderContext.tsx new file mode 100644 index 000000000..73255b665 --- /dev/null +++ b/src/components/AppLayout/AppHeaderContext.tsx @@ -0,0 +1,7 @@ +import * as React from "react"; + +const AppHeaderContext = React.createContext>( + undefined +); + +export default AppHeaderContext; diff --git a/src/components/AppLayout/AppLayout.tsx b/src/components/AppLayout/AppLayout.tsx new file mode 100644 index 000000000..ed7759580 --- /dev/null +++ b/src/components/AppLayout/AppLayout.tsx @@ -0,0 +1,355 @@ +import Chip from "@material-ui/core/Chip"; +import ClickAwayListener from "@material-ui/core/ClickAwayListener"; +import Grow from "@material-ui/core/Grow"; +import LinearProgress from "@material-ui/core/LinearProgress"; +import MenuItem from "@material-ui/core/MenuItem"; +import Menu from "@material-ui/core/MenuList"; +import Paper from "@material-ui/core/Paper"; +import Popper from "@material-ui/core/Popper"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as classNames from "classnames"; +import * as React from "react"; +import SVG from "react-inlinesvg"; +import { RouteComponentProps, withRouter } from "react-router"; + +import * as saleorDarkLogo from "@assets/images/logo-dark.svg"; +import * as saleorLightLogo from "@assets/images/logo-light.svg"; +import AppProgressProvider from "@saleor/components/AppProgress"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useTheme from "@saleor/hooks/useTheme"; +import useUser from "@saleor/hooks/useUser"; +import i18n from "../../i18n"; +import ArrowDropdown from "../../icons/ArrowDropdown"; +import Container from "../Container"; +import AppActionContext from "./AppActionContext"; +import AppHeaderContext from "./AppHeaderContext"; +import { appLoaderHeight, drawerWidth } from "./consts"; +import MenuList from "./MenuList"; +import menuStructure from "./menuStructure"; +import ResponsiveDrawer from "./ResponsiveDrawer"; +import ThemeSwitch from "./ThemeSwitch"; + +const styles = (theme: Theme) => + createStyles({ + appAction: { + bottom: 0, + gridColumn: 2, + position: "sticky", + zIndex: 1 + }, + appLoader: { + height: appLoaderHeight, + zIndex: 1201 + }, + arrow: { + marginLeft: theme.spacing.unit * 2, + transition: theme.transitions.duration.standard + "ms" + }, + content: { + display: "flex", + flexDirection: "column", + minHeight: `calc(100vh - ${appLoaderHeight}px)` + }, + darkThemeSwitch: { + marginRight: theme.spacing.unit * 2 + }, + header: { + display: "flex", + height: 40, + marginBottom: theme.spacing.unit * 3, + marginTop: theme.spacing.unit * 2 + }, + hide: { + opacity: 0 + }, + logo: { + "& svg": { + height: "100%" + }, + display: "block", + height: 28 + }, + menu: { + marginTop: theme.spacing.unit * 4 + }, + menuIcon: { + [theme.breakpoints.up("md")]: { + display: "none" + }, + "& span": { + "&:nth-child(1)": { + top: 15 + }, + "&:nth-child(2), &:nth-child(3)": { + top: 20 + }, + "&:nth-child(4)": { + top: 25 + }, + background: theme.palette.secondary.light, + display: "block", + height: 1, + left: "20%", + opacity: 1, + position: "absolute", + transform: "rotate(0deg)", + transition: ".25s ease-in-out", + width: "60%" + }, + background: theme.palette.background.paper, + borderRadius: "50%", + cursor: "pointer", + height: 42, + left: theme.spacing.unit, + marginRight: theme.spacing.unit * 2, + position: "relative", + transform: "rotate(0deg)", + transition: ".2s ease-in-out", + width: 42 + }, + menuIconDark: { + "& span": { + background: theme.palette.common.white + } + }, + menuIconOpen: { + "& span": { + "&:nth-child(1), &:nth-child(4)": { + left: "50%", + top: 20, + width: 0 + }, + "&:nth-child(2)": { + transform: "rotate(45deg)" + }, + "&:nth-child(3)": { + transform: "rotate(-45deg)" + } + }, + left: 280, + position: "absolute", + zIndex: 1999 + }, + popover: { + zIndex: 1 + }, + root: { + [theme.breakpoints.down("sm")]: { + gridTemplateColumns: "1fr" + }, + display: "grid", + gridTemplateColumns: `${drawerWidth}px 1fr` + }, + rotate: { + transform: "rotate(180deg)" + }, + sideBar: { + [theme.breakpoints.down("sm")]: { + padding: 0 + }, + background: theme.palette.background.paper, + padding: `${theme.spacing.unit * 2}px ${theme.spacing.unit * 4}px` + }, + spacer: { + flex: 1 + }, + userBar: { + alignItems: "center", + display: "flex" + }, + userChip: { + backgroundColor: theme.palette.common.white, + border: `1px solid ${theme.palette.grey[200]}` + }, + userMenuContainer: { + position: "relative" + }, + userMenuItem: { + textAlign: "right" + }, + view: { + backgroundColor: theme.palette.background.default, + flex: 1, + flexGrow: 1, + marginLeft: 0, + paddingBottom: theme.spacing.unit, + [theme.breakpoints.up("sm")]: { + paddingBottom: theme.spacing.unit * 3 + } + } + }); + +interface AppLayoutProps { + children: React.ReactNode; +} + +const AppLayout = withStyles(styles, { + name: "AppLayout" +})( + withRouter>( + ({ + classes, + children, + location + }: AppLayoutProps & + WithStyles & + RouteComponentProps) => { + const { isDark, toggleTheme } = useTheme(); + const [isDrawerOpened, setDrawerState] = React.useState(false); + const [isMenuOpened, setMenuState] = React.useState(false); + const appActionAnchor = React.useRef(); + const appHeaderAnchor = React.useRef(); + const anchor = React.useRef(); + const { logout, user } = useUser(); + const navigate = useNavigator(); + + const handleLogout = () => { + close(); + logout(); + }; + + const handleMenuItemClick = ( + url: string, + event: React.MouseEvent + ) => { + event.stopPropagation(); + event.preventDefault(); + setDrawerState(false); + navigate(url); + }; + + return ( + + {({ isProgress }) => ( + + + +
    +
    + setDrawerState(false)} + open={isDrawerOpened} + > + + + +
    +
    +
    + +
    +
    setDrawerState(!isDrawerOpened)} + > + + + + +
    +
    +
    +
    + +
    + + {user.email} + + + } + onClick={() => setMenuState(!isMenuOpened)} + /> + + {({ TransitionProps, placement }) => ( + + + setMenuState(false)} + mouseEvent="onClick" + > + + + {i18n.t("Log out", { + context: "button" + })} + + + + + + )} + +
    +
    +
    + +
    +
    {children}
    +
    +
    +
    + + + )} + + ); + } + ) +); + +export default AppLayout; diff --git a/src/components/AppLayout/MenuList.tsx b/src/components/AppLayout/MenuList.tsx new file mode 100644 index 000000000..b875a8a9f --- /dev/null +++ b/src/components/AppLayout/MenuList.tsx @@ -0,0 +1,176 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import classNames from "classnames"; +import * as React from "react"; +import { matchPath } from "react-router"; + +import { User } from "../../auth/types/User"; +import { configurationMenu, configurationMenuUrl } from "../../configuration"; +import i18n from "../../i18n"; +import { createHref } from "../../misc"; +import { orderDraftListUrl, orderListUrl } from "../../orders/urls"; +import MenuNested from "./MenuNested"; +import { IMenuItem } from "./menuStructure"; + +const styles = (theme: Theme) => + createStyles({ + menuList: { + display: "flex", + flexDirection: "column", + height: "100%", + marginLeft: theme.spacing.unit * 4, + marginTop: theme.spacing.unit * 2, + paddingBottom: theme.spacing.unit * 3 + }, + menuListItem: { + "&:hover": { + color: theme.palette.primary.main + }, + alignItems: "center", + display: "block", + marginTop: theme.spacing.unit * 2, + paddingLeft: 0, + textDecoration: "none", + transition: theme.transitions.duration.standard + "ms" + }, + menuListItemActive: { + "&:before": { + background: theme.palette.primary.main, + content: "''", + height: "100%", + left: -32, + position: "absolute", + width: 5 + }, + position: "relative" + }, + menuListItemText: { + "&:hover": { + color: theme.palette.primary.main + }, + cursor: "pointer", + fontSize: "1rem", + fontWeight: 500, + textTransform: "uppercase", + transition: theme.transitions.duration.standard + "ms" + }, + menuListNested: { + "& $menuListItemActive": { + "& $menuListItemText": { + color: theme.palette.primary.main + }, + "&:before": { + borderRadius: "100%", + height: 8, + marginLeft: 9, + marginTop: 7, + width: 8 + } + }, + "& $menuListItemText": { + textTransform: "none" + }, + marginLeft: theme.spacing.unit * 3 + } + }); + +interface MenuListProps { + className?: string; + menuItems: IMenuItem[]; + location: string; + user: User; + renderConfigure: boolean; + onMenuItemClick: (url: string, event: React.MouseEvent) => void; +} +const MenuList = withStyles(styles, { name: "MenuList" })( + ({ + classes, + className, + menuItems, + location, + user, + renderConfigure, + onMenuItemClick + }: MenuListProps & WithStyles) => ( +
    + {/* FIXME: this .split("?")[0] looks gross */} + {menuItems.map(menuItem => { + const isActive = (menuItem: IMenuItem) => + location.split("?")[0] === orderDraftListUrl().split("?")[0] && + menuItem.url.split("?")[0] === orderListUrl().split("?")[0] + ? false + : !!matchPath(location.split("?")[0], { + exact: menuItem.url.split("?")[0] === "/", + path: menuItem.url.split("?")[0] + }); + + if ( + menuItem.permission && + !user.permissions.map(perm => perm.code).includes(menuItem.permission) + ) { + return null; + } + + if (!menuItem.url) { + const isAnyChildActive = menuItem.children.reduce( + (acc, child) => acc || isActive(child), + false + ); + + return ( + + ); + } + + return ( + onMenuItemClick(menuItem.url, event)} + key={menuItem.label} + > + + {menuItem.label} + + + ); + })} + {renderConfigure && + configurationMenu.filter(menuItem => + user.permissions.map(perm => perm.code).includes(menuItem.permission) + ).length > 0 && ( + onMenuItemClick(configurationMenuUrl, event)} + > + + {i18n.t("Configure")} + + + )} +
    + ) +); +export default MenuList; diff --git a/src/components/AppLayout/MenuNested.tsx b/src/components/AppLayout/MenuNested.tsx new file mode 100644 index 000000000..44f69ed88 --- /dev/null +++ b/src/components/AppLayout/MenuNested.tsx @@ -0,0 +1,61 @@ +import Typography from "@material-ui/core/Typography"; +import classNames from "classnames"; +import * as React from "react"; + +import { User } from "../../auth/types/User"; +import MenuList from "./MenuList"; +import { IMenuItem } from "./menuStructure"; + +export interface MenuNestedProps { + classes: Record< + | "menuListItem" + | "menuListItemActive" + | "menuListItemText" + | "menuListNested", + string + >; + isAnyChildActive: boolean; + menuItem: IMenuItem; + location: string; + user: User; + onMenuItemClick: (url: string, event: React.MouseEvent) => void; +} + +const MenuNested: React.FC = ({ + classes, + isAnyChildActive, + location, + menuItem, + onMenuItemClick, + user +}) => { + const [isOpened, setOpenStatus] = React.useState(false); + + return ( +
    setOpenStatus(!isOpened)} + className={classNames(classes.menuListItem, { + [classes.menuListItemActive]: isAnyChildActive + })} + > + + {menuItem.label} + + {isOpened && ( +
    + +
    + )} +
    + ); +}; +export default MenuNested; diff --git a/src/components/AppLayout/ResponsiveDrawer.tsx b/src/components/AppLayout/ResponsiveDrawer.tsx new file mode 100644 index 000000000..224149999 --- /dev/null +++ b/src/components/AppLayout/ResponsiveDrawer.tsx @@ -0,0 +1,61 @@ +import Drawer from "@material-ui/core/Drawer"; +import Hidden from "@material-ui/core/Hidden"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; +import { drawerWidth } from "./consts"; + +const styles = (theme: Theme) => + createStyles({ + drawerDesktop: { + backgroundColor: theme.palette.background.paper, + border: "none", + height: "100vh", + padding: `${theme.spacing.unit * 2}px ${theme.spacing.unit * 4}px`, + position: "fixed" as "fixed", + width: drawerWidth + }, + drawerMobile: { + padding: `${theme.spacing.unit * 2}px ${theme.spacing.unit * 4}px`, + width: drawerWidth, + } + }); + +interface ResponsiveDrawerProps extends WithStyles { + children?: React.ReactNode; + open: boolean; + onClose?(); +} + +const ResponsiveDrawer = withStyles(styles, { name: "ResponsiveDrawer" })( + ({ children, classes, onClose, open }: ResponsiveDrawerProps) => ( + <> + + + {children} + + + + + {children} + + + + ) +); +export default ResponsiveDrawer; diff --git a/src/components/AppLayout/ThemeSwitch.tsx b/src/components/AppLayout/ThemeSwitch.tsx new file mode 100644 index 000000000..4292f1c73 --- /dev/null +++ b/src/components/AppLayout/ThemeSwitch.tsx @@ -0,0 +1,43 @@ +import { Theme, withStyles } from "@material-ui/core/styles"; +import Switch, { SwitchProps } from "@material-ui/core/Switch"; +import * as React from "react"; + +import MoonIcon from "../../icons/Moon"; +import SunIcon from "../../icons/Sun"; + +const switchStyles = (theme: Theme) => ({ + bar: { + "$colorPrimary$checked + &": { + backgroundColor: theme.palette.background.paper + }, + background: theme.palette.background.paper + }, + checked: { + "& svg": { + background: theme.palette.primary.main, + color: theme.palette.background.paper + } + }, + colorPrimary: {}, + root: { + "& svg": { + background: theme.palette.primary.main, + borderRadius: "100%", + height: 20, + width: 20 + }, + width: 58 + } +}); +const ThemeSwitch = withStyles(switchStyles, { + name: "ThemeSwitch" +})((props: SwitchProps) => ( + } + checkedIcon={} + /> +)); +ThemeSwitch.displayName = "ThemeSwitch"; +export default ThemeSwitch; diff --git a/src/components/AppLayout/consts.ts b/src/components/AppLayout/consts.ts new file mode 100644 index 000000000..eb1ecfeef --- /dev/null +++ b/src/components/AppLayout/consts.ts @@ -0,0 +1,3 @@ +export const drawerWidth = 256; +export const navigationBarHeight = 64; +export const appLoaderHeight = 4; diff --git a/src/components/AppLayout/index.ts b/src/components/AppLayout/index.ts new file mode 100644 index 000000000..41632b30c --- /dev/null +++ b/src/components/AppLayout/index.ts @@ -0,0 +1,2 @@ +export { default } from './AppLayout'; +export * from './AppLayout'; \ No newline at end of file diff --git a/src/components/AppLayout/menuStructure.ts b/src/components/AppLayout/menuStructure.ts new file mode 100644 index 000000000..1ff572241 --- /dev/null +++ b/src/components/AppLayout/menuStructure.ts @@ -0,0 +1,97 @@ +import { categoryListUrl } from "../../categories/urls"; +import { collectionListUrl } from "../../collections/urls"; +import { customerListUrl } from "../../customers/urls"; +import { saleListUrl, voucherListUrl } from "../../discounts/urls"; +import i18n from "../../i18n"; +import { orderDraftListUrl, orderListUrl } from "../../orders/urls"; +import { productListUrl } from "../../products/urls"; +import { languageListUrl } from "../../translations/urls"; +import { PermissionEnum } from "../../types/globalTypes"; + +export interface IMenuItem { + ariaLabel: string; + children?: IMenuItem[]; + label: string; + permission?: PermissionEnum; + url?: string; +} + +const menuStructure: IMenuItem[] = [ + { + ariaLabel: "home", + label: i18n.t("Home", { context: "Menu label" }), + url: "/" + }, + { + ariaLabel: "catalogue", + children: [ + { + ariaLabel: "products", + label: i18n.t("Products", { context: "Menu label" }), + url: productListUrl() + }, + { + ariaLabel: "categories", + label: i18n.t("Categories", { context: "Menu label" }), + url: categoryListUrl() + }, + { + ariaLabel: "collections", + label: i18n.t("Collections", { context: "Menu label" }), + url: collectionListUrl() + } + ], + label: i18n.t("Catalog", { context: "Menu label" }), + permission: PermissionEnum.MANAGE_PRODUCTS + }, + { + ariaLabel: "orders", + children: [ + { + ariaLabel: "orders", + label: i18n.t("Orders", { context: "Menu label" }), + permission: PermissionEnum.MANAGE_ORDERS, + url: orderListUrl() + }, + { + ariaLabel: "order drafts", + label: i18n.t("Drafts", { context: "Menu label" }), + permission: PermissionEnum.MANAGE_ORDERS, + url: orderDraftListUrl() + } + ], + label: i18n.t("Orders", { context: "Menu label" }), + permission: PermissionEnum.MANAGE_ORDERS + }, + { + ariaLabel: "customers", + label: i18n.t("Customers", { context: "Menu label" }), + permission: PermissionEnum.MANAGE_USERS, + url: customerListUrl() + }, + + { + ariaLabel: "discounts", + children: [ + { + ariaLabel: "sales", + label: i18n.t("Sales", { context: "Menu label" }), + url: saleListUrl() + }, + { + ariaLabel: "vouchers", + label: i18n.t("Vouchers", { context: "Menu label" }), + url: voucherListUrl() + } + ], + label: i18n.t("Discounts", { context: "Menu label" }), + permission: PermissionEnum.MANAGE_DISCOUNTS + }, + { + ariaLabel: "translations", + label: i18n.t("Translations", { context: "Menu label" }), + permission: PermissionEnum.MANAGE_TRANSLATIONS, + url: languageListUrl + } +]; +export default menuStructure; diff --git a/src/components/AppProgress/index.tsx b/src/components/AppProgress/index.tsx new file mode 100644 index 000000000..7be0c2132 --- /dev/null +++ b/src/components/AppProgress/index.tsx @@ -0,0 +1,30 @@ +import * as React from "react"; + +interface IAppProgressContext { + isProgress: boolean; + setProgressState: (isOpened: boolean) => void; +} + +export const AppProgressContext = React.createContext( + undefined +); + +export const AppProgressProvider: React.StatelessComponent<{}> = ({ + children +}) => { + const [isProgress, setProgressState] = React.useState(false); + + return ( + + {children} + + ); +}; + +export const AppProgress = AppProgressContext.Consumer; +export default AppProgress; diff --git a/src/components/AssignCategoryDialog/AssignCategoryDialog.tsx b/src/components/AssignCategoryDialog/AssignCategoryDialog.tsx new file mode 100644 index 000000000..656c63905 --- /dev/null +++ b/src/components/AssignCategoryDialog/AssignCategoryDialog.tsx @@ -0,0 +1,172 @@ +import Button from "@material-ui/core/Button"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import FormSpacer from "@saleor/components/FormSpacer"; +import { SearchCategories_categories_edges_node } from "../../containers/SearchCategories/types/SearchCategories"; +import i18n from "../../i18n"; +import Checkbox from "../Checkbox"; + +export interface FormData { + categories: SearchCategories_categories_edges_node[]; + query: string; +} + +const styles = createStyles({ + avatar: { + "&:first-child": { + paddingLeft: 0 + } + }, + checkboxCell: { + paddingLeft: 0 + }, + overflow: { + overflowY: "visible" + }, + wideCell: { + width: "100%" + } +}); + +interface AssignCategoriesDialogProps extends WithStyles { + categories: SearchCategories_categories_edges_node[]; + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + loading: boolean; + onClose: () => void; + onFetch: (value: string) => void; + onSubmit: (data: FormData) => void; +} + +const initialForm: FormData = { + categories: [], + query: "" +}; +const AssignCategoriesDialog = withStyles(styles, { + name: "AssignCategoriesDialog" +})( + ({ + classes, + confirmButtonState, + open, + loading, + categories: categories, + onClose, + onFetch, + onSubmit + }: AssignCategoriesDialogProps) => ( + +
    + {({ data, change }) => ( + <> + {i18n.t("Assign Categories")} + + change(event, () => onFetch(data.query))} + label={i18n.t("Search Categories", { + context: "product search input label" + })} + placeholder={i18n.t( + "Search by product name, attribute, product type etc...", + { + context: "product search input placeholder" + } + )} + fullWidth + InputProps={{ + autoComplete: "off", + endAdornment: loading && + }} + /> + + + + {categories && + categories.map(category => { + const isChecked = !!data.categories.find( + selectedCategories => + selectedCategories.id === category.id + ); + + return ( + + + + isChecked + ? change({ + target: { + name: "categories", + value: data.categories.filter( + selectedCategories => + selectedCategories.id !== + category.id + ) + } + } as any) + : change({ + target: { + name: "categories", + value: [...data.categories, category] + } + } as any) + } + /> + + + {category.name} + + + ); + })} + +
    +
    + + + + {i18n.t("Assign categories", { context: "button" })} + + + + )} +
    +
    + ) +); +AssignCategoriesDialog.displayName = "AssignCategoriesDialog"; +export default AssignCategoriesDialog; diff --git a/src/components/AssignCategoryDialog/index.ts b/src/components/AssignCategoryDialog/index.ts new file mode 100644 index 000000000..b3790ef8d --- /dev/null +++ b/src/components/AssignCategoryDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./AssignCategoryDialog"; +export * from "./AssignCategoryDialog"; diff --git a/src/components/AssignCollectionDialog/AssignCollectionDialog.tsx b/src/components/AssignCollectionDialog/AssignCollectionDialog.tsx new file mode 100644 index 000000000..bd4cd2dbd --- /dev/null +++ b/src/components/AssignCollectionDialog/AssignCollectionDialog.tsx @@ -0,0 +1,172 @@ +import Button from "@material-ui/core/Button"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import { SearchCollections_collections_edges_node } from "../../containers/SearchCollections/types/SearchCollections"; +import i18n from "../../i18n"; +import Checkbox from "../Checkbox"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "../ConfirmButton/ConfirmButton"; +import Form from "../Form"; +import FormSpacer from "../FormSpacer"; + +export interface FormData { + collections: SearchCollections_collections_edges_node[]; + query: string; +} + +const styles = createStyles({ + avatar: { + "&:first-child": { + paddingLeft: 0 + } + }, + checkboxCell: { + paddingLeft: 0 + }, + overflow: { + overflowY: "visible" + }, + wideCell: { + width: "100%" + } +}); + +interface AssignCollectionDialogProps extends WithStyles { + collections: SearchCollections_collections_edges_node[]; + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + loading: boolean; + onClose: () => void; + onFetch: (value: string) => void; + onSubmit: (data: FormData) => void; +} + +const initialForm: FormData = { + collections: [], + query: "" +}; +const AssignCollectionDialog = withStyles(styles, { + name: "AssignCollectionDialog" +})( + ({ + classes, + confirmButtonState, + open, + loading, + collections, + onClose, + onFetch, + onSubmit + }: AssignCollectionDialogProps) => ( + +
    + {({ data, change }) => ( + <> + {i18n.t("Assign Collection")} + + change(event, () => onFetch(data.query))} + label={i18n.t("Search Collection", { + context: "product search input label" + })} + placeholder={i18n.t( + "Search by product name, attribute, product type etc...", + { + context: "product search input placeholder" + } + )} + fullWidth + InputProps={{ + autoComplete: "off", + endAdornment: loading && + }} + /> + + + + {collections && + collections.map(category => { + const isChecked = !!data.collections.find( + selectedCollection => + selectedCollection.id === category.id + ); + + return ( + + + + isChecked + ? change({ + target: { + name: "collections", + value: data.collections.filter( + selectedCollection => + selectedCollection.id !== + category.id + ) + } + } as any) + : change({ + target: { + name: "collections", + value: [...data.collections, category] + } + } as any) + } + /> + + + {category.name} + + + ); + })} + +
    +
    + + + + {i18n.t("Assign collections", { context: "button" })} + + + + )} +
    +
    + ) +); +AssignCollectionDialog.displayName = "AssignCollectionDialog"; +export default AssignCollectionDialog; diff --git a/src/components/AssignCollectionDialog/index.ts b/src/components/AssignCollectionDialog/index.ts new file mode 100644 index 000000000..8484530c8 --- /dev/null +++ b/src/components/AssignCollectionDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./AssignCollectionDialog"; +export * from "./AssignCollectionDialog"; diff --git a/src/components/AssignProductDialog/AssignProductDialog.tsx b/src/components/AssignProductDialog/AssignProductDialog.tsx new file mode 100644 index 000000000..a675a6d47 --- /dev/null +++ b/src/components/AssignProductDialog/AssignProductDialog.tsx @@ -0,0 +1,176 @@ +import Button from "@material-ui/core/Button"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import FormSpacer from "@saleor/components/FormSpacer"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import { SearchProducts_products_edges_node } from "../../containers/SearchProducts/types/SearchProducts"; +import i18n from "../../i18n"; +import { maybe } from "../../misc"; +import Checkbox from "../Checkbox"; + +export interface FormData { + products: SearchProducts_products_edges_node[]; + query: string; +} + +const styles = createStyles({ + avatar: { + "&:first-child": { + paddingLeft: 0 + } + }, + checkboxCell: { + paddingLeft: 0 + }, + overflow: { + overflowY: "visible" + }, + wideCell: { + width: "100%" + } +}); + +interface AssignProductDialogProps extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + products: SearchProducts_products_edges_node[]; + loading: boolean; + onClose: () => void; + onFetch: (value: string) => void; + onSubmit: (data: FormData) => void; +} + +const initialForm: FormData = { + products: [], + query: "" +}; +const AssignProductDialog = withStyles(styles, { + name: "AssignProductDialog" +})( + ({ + classes, + confirmButtonState, + open, + loading, + products, + onClose, + onFetch, + onSubmit + }: AssignProductDialogProps) => ( + +
    + {({ data, change }) => ( + <> + {i18n.t("Assign Product")} + + change(event, () => onFetch(data.query))} + label={i18n.t("Search Products", { + context: "product search input label" + })} + placeholder={i18n.t( + "Search by product name, attribute, product type etc...", + { + context: "product search input placeholder" + } + )} + fullWidth + InputProps={{ + autoComplete: "off", + endAdornment: loading && + }} + /> + + + + {products && + products.map(product => { + const isChecked = !!data.products.find( + selectedProduct => selectedProduct.id === product.id + ); + + return ( + + product.thumbnail.url)} + /> + + {product.name} + + + + isChecked + ? change({ + target: { + name: "products", + value: data.products.filter( + selectedProduct => + selectedProduct.id !== product.id + ) + } + } as any) + : change({ + target: { + name: "products", + value: [...data.products, product] + } + } as any) + } + /> + + + ); + })} + +
    +
    + + + + {i18n.t("Assign products", { context: "button" })} + + + + )} +
    +
    + ) +); +AssignProductDialog.displayName = "AssignProductDialog"; +export default AssignProductDialog; diff --git a/src/components/AssignProductDialog/index.ts b/src/components/AssignProductDialog/index.ts new file mode 100644 index 000000000..52e20ebb1 --- /dev/null +++ b/src/components/AssignProductDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./AssignProductDialog"; +export * from "./AssignProductDialog"; diff --git a/src/components/AutocompleteSelectMenu/AutocompleteSelectMenu.tsx b/src/components/AutocompleteSelectMenu/AutocompleteSelectMenu.tsx new file mode 100644 index 000000000..d00ca186f --- /dev/null +++ b/src/components/AutocompleteSelectMenu/AutocompleteSelectMenu.tsx @@ -0,0 +1,194 @@ +import CircularProgress from "@material-ui/core/CircularProgress"; +import MenuItem from "@material-ui/core/MenuItem"; +import Paper from "@material-ui/core/Paper"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import ArrowBack from "@material-ui/icons/ArrowBack"; +import Downshift from "downshift"; +import * as React from "react"; + +import i18n from "../../i18n"; +import { + getMenuItemByPath, + IMenu, + validateMenuOptions +} from "../../utils/menu"; +import Debounce, { DebounceProps } from "../Debounce"; + +export interface AutocompleteSelectMenuProps { + disabled: boolean; + displayValue: string; + error: boolean; + helperText: string; + label: string; + loading: boolean; + name: string; + options: IMenu; + placeholder: string; + onChange: (event: React.ChangeEvent) => void; + onInputChange?: (value: string) => void; +} + +const validationError: Error = new Error( + "Values supplied to AutocompleteSelectMenu should be unique" +); + +const DebounceAutocomplete: React.ComponentType< + DebounceProps +> = Debounce; + +const styles = (theme: Theme) => + createStyles({ + container: { + flexGrow: 1, + position: "relative" + }, + menuBack: { + marginLeft: -theme.spacing.unit / 2, + marginRight: theme.spacing.unit + }, + paper: { + left: 0, + marginTop: theme.spacing.unit, + padding: theme.spacing.unit, + position: "absolute", + right: 0, + zIndex: 2 + }, + root: {} + }); +const AutocompleteSelectMenu = withStyles(styles, { + name: "AutocompleteSelectMenu" +})( + ({ + classes, + disabled, + displayValue, + error, + helperText, + label, + loading, + name, + options, + placeholder, + onChange, + onInputChange + }: AutocompleteSelectMenuProps & WithStyles) => { + const [inputValue, setInputValue] = React.useState(displayValue || ""); + const [menuPath, setMenuPath] = React.useState([]); + + const handleChange = (value: string) => + onChange({ + target: { + name, + value + } + } as any); + + // Validate if option values are duplicated + React.useEffect(() => { + if (!validateMenuOptions(options)) { + throw validationError; + } + }, []); + + // Navigate back to main menu after input field change + React.useEffect(() => setMenuPath([]), [options]); + + // Reset input value after displayValue change + React.useEffect(() => setInputValue(displayValue), [displayValue]); + + return ( + + {debounceFn => ( + (item ? item.label : "")} + onSelect={handleChange} + > + {({ getItemProps, isOpen, openMenu, closeMenu, selectItem }) => { + return ( +
    + , + id: undefined, + onBlur: () => { + closeMenu(); + setMenuPath([]); + setInputValue(displayValue); + }, + onChange: event => { + debounceFn(event.target.value); + setInputValue(event.target.value); + }, + onFocus: () => openMenu(), + placeholder + }} + disabled={disabled} + error={error} + helperText={helperText} + label={label} + fullWidth={true} + value={inputValue} + /> + {isOpen && ( + + {options.length ? ( + <> + {menuPath.length > 0 && ( + + setMenuPath( + menuPath.slice(0, menuPath.length - 2) + ) + } + > + + {i18n.t("Back")} + + )} + {(menuPath.length + ? getMenuItemByPath(options, menuPath).children + : options + ).map((suggestion, index) => ( + + suggestion.value + ? selectItem(suggestion.value) + : setMenuPath([...menuPath, index]) + } + > + {suggestion.label} + + ))} + + ) : ( + + {i18n.t("No results")} + + )} + + )} +
    + ); + }} +
    + )} +
    + ); + } +); +AutocompleteSelectMenu.displayName = "AutocompleteSelectMenu"; +export default AutocompleteSelectMenu; diff --git a/src/components/AutocompleteSelectMenu/index.ts b/src/components/AutocompleteSelectMenu/index.ts new file mode 100644 index 000000000..3a0e4e0d2 --- /dev/null +++ b/src/components/AutocompleteSelectMenu/index.ts @@ -0,0 +1,2 @@ +export { default } from './AutocompleteSelectMenu'; +export * from './AutocompleteSelectMenu'; \ No newline at end of file diff --git a/src/components/CardMenu/CardMenu.tsx b/src/components/CardMenu/CardMenu.tsx new file mode 100644 index 000000000..4135ce418 --- /dev/null +++ b/src/components/CardMenu/CardMenu.tsx @@ -0,0 +1,102 @@ +import IconButton from "@material-ui/core/IconButton"; +import Menu from "@material-ui/core/Menu"; +import MenuItem from "@material-ui/core/MenuItem"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import MoreVertIcon from "@material-ui/icons/MoreVert"; +import * as React from "react"; + +const ITEM_HEIGHT = 48; + +export interface CardMenuItem { + label: string; + onSelect: () => void; +} + +export interface CardMenuProps { + className?: string; + disabled?: boolean; + menuItems: CardMenuItem[]; +} + +const styles = (theme: Theme) => + createStyles({ + iconButton: { + background: theme.palette.background.paper, + borderRadius: "100%", + height: 32, + padding: 0, + width: 32 + } + }); + +const CardMenu = withStyles(styles, { + name: "CardMenu" +})( + ({ + className, + classes, + disabled, + menuItems + }: CardMenuProps & WithStyles) => { + const [anchorEl, setAnchor] = React.useState(null); + + const handleClick = (event: React.MouseEvent) => { + setAnchor(event.currentTarget); + }; + + const handleClose = () => { + setAnchor(null); + }; + + const handleMenuClick = (menuItemIndex: number) => { + menuItems[menuItemIndex].onSelect(); + handleClose(); + }; + + const open = !!anchorEl; + + return ( +
    + + + + + {menuItems.map((menuItem, menuItemIndex) => ( + handleMenuClick(menuItemIndex)} + key={menuItem.label} + > + {menuItem.label} + + ))} + +
    + ); + } +); +CardMenu.displayName = "CardMenu"; +export default CardMenu; diff --git a/src/components/CardMenu/index.ts b/src/components/CardMenu/index.ts new file mode 100644 index 000000000..69518dc40 --- /dev/null +++ b/src/components/CardMenu/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CardMenu"; +export * from "./CardMenu"; diff --git a/src/components/CardSpacer.tsx b/src/components/CardSpacer.tsx new file mode 100644 index 000000000..98d70f95a --- /dev/null +++ b/src/components/CardSpacer.tsx @@ -0,0 +1,29 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + spacer: { + [theme.breakpoints.down("sm")]: { + marginTop: theme.spacing.unit + }, + marginTop: theme.spacing.unit * 3 + } + }); + +interface CardSpacerProps extends WithStyles { + children?: React.ReactNode; +} + +export const CardSpacer = withStyles(styles, { name: "CardSpacer" })( + ({ classes, children }: CardSpacerProps) => ( +
    {children}
    + ) +); +CardSpacer.displayName = "CardSpacer"; +export default CardSpacer; diff --git a/src/components/CardTitle/CardTitle.tsx b/src/components/CardTitle/CardTitle.tsx new file mode 100644 index 000000000..92c061f0a --- /dev/null +++ b/src/components/CardTitle/CardTitle.tsx @@ -0,0 +1,83 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + children: theme.mixins.gutters({}), + constantHeight: { + height: 56 + }, + hr: { + border: "none", + borderTop: `1px solid ${theme.overrides.MuiCard.root.borderColor}`, + height: 0, + marginBottom: 0, + marginTop: 0, + width: "100%" + }, + root: theme.mixins.gutters({ + alignItems: "center", + display: "flex", + minHeight: 56 + }), + title: { + flex: 1, + lineHeight: 1 + }, + toolbar: { + marginRight: -theme.spacing.unit * 2 + } + }); + +interface CardTitleProps extends WithStyles { + children?: React.ReactNode; + className?: string; + height?: "default" | "const"; + title: string | React.ReactNode; + toolbar?: React.ReactNode; + onClick?: (event: React.MouseEvent) => void; +} + +const CardTitle = withStyles(styles, { name: "CardTitle" })( + ({ + classes, + className, + children, + height, + title, + toolbar, + onClick, + ...props + }: CardTitleProps) => ( + <> +
    + + {title} + +
    {toolbar}
    +
    +
    {children}
    +
    + + ) +); +CardTitle.displayName = "CardTitle"; +export default CardTitle; diff --git a/src/components/CardTitle/index.ts b/src/components/CardTitle/index.ts new file mode 100644 index 000000000..0adbc156d --- /dev/null +++ b/src/components/CardTitle/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CardTitle"; +export * from "./CardTitle"; diff --git a/src/components/Checkbox/Checkbox.tsx b/src/components/Checkbox/Checkbox.tsx new file mode 100644 index 000000000..a82a63d7c --- /dev/null +++ b/src/components/Checkbox/Checkbox.tsx @@ -0,0 +1,121 @@ +import { Omit } from "@material-ui/core"; +import ButtonBase from "@material-ui/core/ButtonBase"; +import { CheckboxProps as MuiCheckboxProps } from "@material-ui/core/Checkbox"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import classNames from "classnames"; +import * as React from "react"; +import { stopPropagation } from "../../misc"; + +export type CheckboxProps = Omit< + MuiCheckboxProps, + | "checkedIcon" + | "color" + | "icon" + | "indeterminateIcon" + | "classes" + | "onChange" +> & { + onChange?: (event: React.ChangeEvent) => void; +}; + +const styles = (theme: Theme) => + createStyles({ + box: { + "&$checked": { + "&:before": { + background: theme.palette.primary.main + }, + borderColor: theme.palette.primary.main + }, + "&$disabled": { + borderColor: theme.palette.grey[200] + }, + "&$indeterminate": { + "&:before": { + background: theme.palette.primary.main, + height: 2, + top: 5 + }, + borderColor: theme.palette.primary.main + }, + "&:before": { + background: "rgba(0, 0, 0, 0)", + borderRadius: 2, + content: '""', + height: 8, + left: 2, + position: "absolute", + top: 2, + transition: theme.transitions.duration.short + "ms", + width: 8 + }, + WebkitAppearance: "none", + border: `1px solid ${theme.palette.grey[500]}`, + borderRadius: 4, + boxSizing: "border-box", + cursor: "pointer", + height: 14, + outline: "0", + position: "relative", + userSelect: "none", + width: 14 + }, + checked: {}, + disabled: {}, + indeterminate: {}, + root: { + alignItems: "center", + borderRadius: "100%", + cursor: "pointer", + display: "flex", + height: 48, + justifyContent: "center", + width: 48 + } + }); +const Checkbox = withStyles(styles, { name: "Checkbox" })( + ({ + checked, + className, + classes, + disabled, + indeterminate, + onChange, + onClick, + value, + name, + ...props + }: CheckboxProps & WithStyles) => { + const inputRef = React.useRef(null); + return ( + inputRef.current.click())} + > + + + ); + } +); +Checkbox.displayName = "Checkbox"; +export default Checkbox; diff --git a/src/components/Checkbox/index.ts b/src/components/Checkbox/index.ts new file mode 100644 index 000000000..3d46e4f82 --- /dev/null +++ b/src/components/Checkbox/index.ts @@ -0,0 +1,2 @@ +export { default } from './Checkbox'; +export * from './Checkbox'; \ No newline at end of file diff --git a/src/components/Chip/Chip.tsx b/src/components/Chip/Chip.tsx new file mode 100644 index 000000000..f003b16b0 --- /dev/null +++ b/src/components/Chip/Chip.tsx @@ -0,0 +1,56 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import { fade } from "@material-ui/core/styles/colorManipulator"; +import Typography from "@material-ui/core/Typography"; +import CloseIcon from "@material-ui/icons/Close"; +import classNames from "classnames"; +import * as React from "react"; + +export interface ChipProps { + className?: string; + label: React.ReactNode; + onClose?: () => void; +} + +const styles = (theme: Theme) => + createStyles({ + closeIcon: { + cursor: "pointer", + fontSize: 16, + marginLeft: theme.spacing.unit, + verticalAlign: "middle" + }, + label: { + color: theme.palette.common.white + }, + root: { + background: fade(theme.palette.secondary.main, 0.6), + borderRadius: 8, + display: "inline-block", + marginRight: theme.spacing.unit * 2, + padding: "6px 12px" + } + }); +const Chip = withStyles(styles, { name: "Chip" })( + ({ + classes, + className, + label, + onClose + }: ChipProps & WithStyles) => ( +
    + + {label} + {onClose && ( + + )} + +
    + ) +); +Chip.displayName = "Chip"; +export default Chip; diff --git a/src/components/Chip/index.ts b/src/components/Chip/index.ts new file mode 100644 index 000000000..6de8518ff --- /dev/null +++ b/src/components/Chip/index.ts @@ -0,0 +1,2 @@ +export { default } from './Chip'; +export * from './Chip'; \ No newline at end of file diff --git a/src/components/ConfirmButton/ConfirmButton.tsx b/src/components/ConfirmButton/ConfirmButton.tsx new file mode 100644 index 000000000..b1a1c7b91 --- /dev/null +++ b/src/components/ConfirmButton/ConfirmButton.tsx @@ -0,0 +1,188 @@ +import { Omit } from "@material-ui/core"; +import Button, { ButtonProps } from "@material-ui/core/Button"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import CheckIcon from "@material-ui/icons/Check"; +import classNames from "classnames"; +import * as React from "react"; + +import i18n from "../../i18n"; + +export type ConfirmButtonTransitionState = + | "loading" + | "success" + | "error" + | "default"; + +const styles = (theme: Theme) => + createStyles({ + error: { + "&:hover": { + backgroundColor: theme.palette.error.main + }, + backgroundColor: theme.palette.error.main, + color: theme.palette.error.contrastText + }, + icon: { + marginLeft: "0 !important", + position: "absolute", + transitionDuration: theme.transitions.duration.standard + "ms" + }, + invisible: { + opacity: 0 + }, + label: { + alignItems: "center", + display: "flex", + transitionDuration: theme.transitions.duration.standard + "ms" + }, + progress: { + "& svg": { + color: theme.palette.common.white, + margin: 0 + }, + position: "absolute", + transitionDuration: theme.transitions.duration.standard + "ms" + }, + success: { + "&:hover": { + backgroundColor: theme.palette.primary.main + }, + backgroundColor: theme.palette.primary.main, + color: theme.palette.primary.contrastText + } + }); + +export interface ConfirmButtonProps + extends Omit, + WithStyles { + transitionState: ConfirmButtonTransitionState; +} + +interface ConfirmButtonState { + displayCompletedActionState: boolean; +} + +const ConfirmButton = withStyles(styles)( + class ConfirmButtonComponent extends React.Component< + ConfirmButtonProps & + WithStyles< + "error" | "icon" | "invisible" | "label" | "progress" | "success" + >, + ConfirmButtonState + > { + static getDerivedStateFromProps( + nextProps: ConfirmButtonProps, + prevState: ConfirmButtonState + ): ConfirmButtonState { + if (nextProps.transitionState === "loading") { + return { + displayCompletedActionState: true + }; + } + return prevState; + } + + state: ConfirmButtonState = { + displayCompletedActionState: false + }; + timeout = null; + + componentDidUpdate(prevProps: ConfirmButtonProps) { + const { transitionState } = this.props; + if (prevProps.transitionState !== transitionState) { + if ( + (["error", "success"] as ConfirmButtonTransitionState[]).includes( + transitionState + ) + ) { + this.timeout = setTimeout( + () => + this.setState({ + displayCompletedActionState: false + }), + 2000 + ); + } else if (transitionState === "loading") { + clearTimeout(this.timeout); + } + } + } + + componentWillUnmount() { + clearTimeout(this.timeout); + } + + render() { + const { + children, + classes, + className, + disabled, + transitionState, + onClick, + ...props + } = this.props; + const { displayCompletedActionState } = this.state; + + return ( + + ); + } + } +); +ConfirmButton.displayName = "ConfirmButton"; +export default ConfirmButton; diff --git a/src/components/ConfirmButton/index.ts b/src/components/ConfirmButton/index.ts new file mode 100644 index 000000000..4fe09023d --- /dev/null +++ b/src/components/ConfirmButton/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ConfirmButton"; +export * from "./ConfirmButton"; diff --git a/src/components/ConfirmFormLeaveDialog.tsx b/src/components/ConfirmFormLeaveDialog.tsx new file mode 100644 index 000000000..41bce42b8 --- /dev/null +++ b/src/components/ConfirmFormLeaveDialog.tsx @@ -0,0 +1,62 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; +import NavigationPrompt from "react-router-navigation-prompt"; + +import i18n from "../i18n"; +import { FormContext } from "./Form"; + +const styles = (theme: Theme) => + createStyles({ + deleteButton: { + "&:hover": { + backgroundColor: theme.palette.error.main + }, + backgroundColor: theme.palette.error.main, + color: theme.palette.error.contrastText + } + }); + +export const ConfirmFormLeaveDialog = withStyles(styles, { + name: "ConfirmFormLeaveDialog" +})(({ classes }: WithStyles) => ( + + {({ hasChanged: hasFormChanged }) => ( + + {({ isActive, onCancel, onConfirm }) => ( + + {i18n.t("Unsaved changes")} + + + {i18n.t( + "If you leave this page, unsaved changes will be lost. Are you sure you want to leave?", + { + context: "form leave confirmation" + } + )} + + + + + + + + )} + + )} + +)); diff --git a/src/components/Container.tsx b/src/components/Container.tsx new file mode 100644 index 000000000..57d552d01 --- /dev/null +++ b/src/components/Container.tsx @@ -0,0 +1,35 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as classNames from "classnames"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + root: { + [theme.breakpoints.up("lg")]: { + marginLeft: "auto", + marginRight: "auto", + maxWidth: theme.breakpoints.width("lg") + }, + [theme.breakpoints.up("sm")]: { + padding: `0 ${theme.spacing.unit * 3}px` + }, + padding: `0 ${theme.spacing.unit}px` + } + }); + +interface ContainerProps extends WithStyles { + className?: string; +} + +export const Container = withStyles(styles, { + name: "Container" +})(({ classes, className, ...props }: ContainerProps) => ( +
    +)); +Container.displayName = "Container"; +export default Container; diff --git a/src/components/ControlledCheckbox.tsx b/src/components/ControlledCheckbox.tsx new file mode 100644 index 000000000..6e948e6f9 --- /dev/null +++ b/src/components/ControlledCheckbox.tsx @@ -0,0 +1,31 @@ +import FormControlLabel from "@material-ui/core/FormControlLabel"; +import * as React from "react"; + +import Checkbox from "./Checkbox"; + +interface ControlledCheckboxProps { + name: string; + label?: React.ReactNode; + checked: boolean; + disabled?: boolean; + onChange(event: any); +} + +export const ControlledCheckbox: React.StatelessComponent< + ControlledCheckboxProps +> = ({ checked, disabled, name, label, onChange }) => ( + onChange({ target: { name, value: !checked } })} + onChange={() => onChange({ target: { name, value: !checked } })} + /> + } + label={label} + /> +); +ControlledCheckbox.displayName = "ControlledCheckbox"; +export default ControlledCheckbox; diff --git a/src/components/ControlledSwitch.tsx b/src/components/ControlledSwitch.tsx new file mode 100644 index 000000000..6b0b341fd --- /dev/null +++ b/src/components/ControlledSwitch.tsx @@ -0,0 +1,58 @@ +import { createStyles, Theme, withStyles, WithStyles } from "@material-ui/core"; +import FormControlLabel from "@material-ui/core/FormControlLabel"; +import Switch from "@material-ui/core/Switch"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + label: { + marginLeft: theme.spacing.unit * 2 + } + }); + +interface ControlledSwitchProps extends WithStyles { + checked: boolean; + disabled?: boolean; + label: string | React.ReactNode; + name: string; + secondLabel?: string; + uncheckedLabel?: string | React.ReactNode; + onChange?(event: React.ChangeEvent); +} + +export const ControlledSwitch = withStyles(styles, { + name: "ControlledSwitch" +})( + ({ + classes, + checked, + disabled, + onChange, + label, + name, + secondLabel, + uncheckedLabel + }: ControlledSwitchProps) => ( + + onChange({ target: { name, value: !checked } } as any) + } + checked={checked} + color="primary" + name={name} + /> + } + label={ +
    + {uncheckedLabel ? (checked ? label : uncheckedLabel) : label} +
    {secondLabel ? secondLabel : null}
    +
    + } + disabled={disabled} + /> + ) +); +ControlledSwitch.displayName = "ControlledSwitch"; +export default ControlledSwitch; diff --git a/src/components/CountryList/CountryList.tsx b/src/components/CountryList/CountryList.tsx new file mode 100644 index 000000000..014a7db66 --- /dev/null +++ b/src/components/CountryList/CountryList.tsx @@ -0,0 +1,183 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import ArrowDropDownIcon from "@material-ui/icons/ArrowDropDown"; +import DeleteIcon from "@material-ui/icons/Delete"; +import classNames from "classnames"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../i18n"; +import { maybe, renderCollection } from "../../misc"; +import { CountryFragment } from "../../taxes/types/CountryFragment"; + +export interface CountryListProps { + countries: CountryFragment[]; + disabled: boolean; + emptyText: React.ReactNode; + title: React.ReactNode; + onCountryAssign: () => void; + onCountryUnassign: (country: string) => void; +} + +const styles = (theme: Theme) => + createStyles({ + iconCell: { + "&:last-child": { + paddingRight: 0 + }, + width: 48 + theme.spacing.unit / 2 + }, + indicator: { + color: theme.palette.text.disabled, + display: "inline-block", + left: 0, + marginRight: theme.spacing.unit * 2, + position: "absolute" + }, + offsetCell: { + "&:first-child": { + paddingLeft: theme.spacing.unit * 3 + }, + position: "relative" + }, + pointer: { + cursor: "pointer" + }, + root: { + "&:last-child": { + paddingBottom: 0 + }, + paddingTop: 0 + }, + rotate: { + transform: "rotate(180deg)" + }, + textRight: { + textAlign: "right" + }, + toLeft: { + "&:first-child": { + paddingLeft: 0 + } + }, + wideColumn: { + width: "100%" + } + }); + +const CountryList = withStyles(styles, { + name: "CountryList" +})( + ({ + classes, + countries, + disabled, + emptyText, + title, + onCountryAssign, + onCountryUnassign + }: CountryListProps & WithStyles) => { + const [isCollapsed, setCollapseStatus] = React.useState(true); + const toggleCollapse = () => setCollapseStatus(!isCollapsed); + + return ( + + + {i18n.t("Assign countries")} + + } + /> + + + + + + {i18n.t("{{ number }} Countries", { + context: "number of countries", + number: maybe(() => countries.length.toString(), "...") + })} + + + + + + + + {!isCollapsed && + renderCollection( + countries, + (country, countryIndex) => ( + + + {maybe( + () => ( + <> + {(countryIndex === 0 || + countries[countryIndex].country[0] !== + countries[countryIndex - 1].country[0]) && ( + + {country.country[0]} + + )} + {country.country} + + ), + + )} + + + onCountryUnassign(country.code)} + > + + + + + ), + () => ( + + + {emptyText} + + + ) + )} + +
    +
    +
    + ); + } +); +export default CountryList; diff --git a/src/components/CountryList/index.ts b/src/components/CountryList/index.ts new file mode 100644 index 000000000..3ad707c62 --- /dev/null +++ b/src/components/CountryList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CountryList"; +export * from "./CountryList"; diff --git a/src/components/Date/Date.test.tsx b/src/components/Date/Date.test.tsx new file mode 100644 index 000000000..a1d233515 --- /dev/null +++ b/src/components/Date/Date.test.tsx @@ -0,0 +1,44 @@ +import * as React from "react"; +import * as renderer from "react-test-renderer"; + +import { TimezoneProvider } from "../Timezone"; +import Date from "./Date"; + +const testDate = "2018-04-07"; +const expectedDate = "Apr 7, 2018"; + +test("Render plain date with timezone GMT-11", () => { + const date = renderer.create( + + + + ); + expect(date.toJSON()).toEqual(expectedDate); +}); + +test("Render plain date with timezone GMT+13", () => { + const date = renderer.create( + + + + ); + expect(date.toJSON()).toEqual(expectedDate); +}); + +test("Render humanized date with timezone GMT-11", () => { + const date = renderer.create( + + + + ); + expect(date.toJSON().props.dateTime).toEqual(testDate); +}); + +test("Render humanized date with timezone GMT+13", () => { + const date = renderer.create( + + + + ); + expect(date.toJSON().props.dateTime).toEqual(testDate); +}); diff --git a/src/components/Date/Date.tsx b/src/components/Date/Date.tsx new file mode 100644 index 000000000..f72d7a3be --- /dev/null +++ b/src/components/Date/Date.tsx @@ -0,0 +1,42 @@ +import Tooltip from "@material-ui/core/Tooltip"; +import * as moment from "moment-timezone"; +import * as React from "react"; + +import useDateLocalize from "@saleor/hooks/useDateLocalize"; +import { LocaleConsumer } from "../Locale"; +import { Consumer } from "./DateContext"; + +interface DateProps { + date: string; + plain?: boolean; +} + +export const Date: React.FC = ({ date, plain }) => { + const localizeDate = useDateLocalize(); + const getHumanized = (value: string, locale: string, currentDate: number) => + moment(value) + .locale(locale) + .from(currentDate); + + return ( + + {locale => ( + + {currentDate => + plain ? ( + localizeDate(date) + ) : ( + + + + ) + } + + )} + + ); +}; +Date.displayName = "Date"; +export default Date; diff --git a/src/components/Date/DateContext.tsx b/src/components/Date/DateContext.tsx new file mode 100644 index 000000000..449f1bc13 --- /dev/null +++ b/src/components/Date/DateContext.tsx @@ -0,0 +1,6 @@ +import * as React from "react"; + +export const DateContext = React.createContext(undefined); +const { Provider, Consumer } = DateContext; + +export { Consumer, Provider }; diff --git a/src/components/Date/DateProvider.tsx b/src/components/Date/DateProvider.tsx new file mode 100644 index 000000000..c54f779ce --- /dev/null +++ b/src/components/Date/DateProvider.tsx @@ -0,0 +1,34 @@ +import * as React from "react"; + +import { Provider } from "./DateContext"; + +interface DateProviderState { + date: number; +} + +export class DateProvider extends React.Component<{}, DateProviderState> { + static contextTypes = {}; + + intervalId: number; + + state = { + date: Date.now() + }; + + componentDidMount() { + this.intervalId = window.setInterval( + () => this.setState({ date: Date.now() }), + 10_000 + ); + } + + componentWillUnmount() { + window.clearInterval(this.intervalId); + } + + render() { + const { children } = this.props; + const { date } = this.state; + return {children}; + } +} diff --git a/src/components/Date/DateTime.tsx b/src/components/Date/DateTime.tsx new file mode 100644 index 000000000..c3199ce7c --- /dev/null +++ b/src/components/Date/DateTime.tsx @@ -0,0 +1,51 @@ +import Tooltip from "@material-ui/core/Tooltip"; +import * as moment from "moment-timezone"; +import * as React from "react"; +import ReactMoment from "react-moment"; + +import { LocaleConsumer } from "../Locale"; +import { TimezoneConsumer } from "../Timezone"; +import { Consumer } from "./DateContext"; + +interface DateTimeProps { + date: string; + plain?: boolean; +} + +export const DateTime: React.StatelessComponent = ({ + date, + plain +}) => { + const getTitle = (value: string, locale?: string, tz?: string) => { + let date = moment(value).locale(locale); + if (tz !== undefined) { + date = date.tz(tz); + } + return date.format("lll"); + }; + return ( + + {tz => ( + + {locale => ( + + {currentDate => + plain ? ( + getTitle(date, locale, tz) + ) : ( + + + {date} + + + ) + } + + )} + + )} + + ); +}; +DateTime.displayName = "DateTime"; +export default DateTime; diff --git a/src/components/Date/index.ts b/src/components/Date/index.ts new file mode 100644 index 000000000..a969a978f --- /dev/null +++ b/src/components/Date/index.ts @@ -0,0 +1,4 @@ +export { default } from "./Date"; +export * from "./Date"; +export * from "./DateTime"; +export * from "./DateProvider"; diff --git a/src/components/Debounce.tsx b/src/components/Debounce.tsx new file mode 100644 index 000000000..533c52aba --- /dev/null +++ b/src/components/Debounce.tsx @@ -0,0 +1,28 @@ +import * as React from "react"; + +export interface DebounceProps { + children: ((props: (...args: T[]) => void) => React.ReactNode); + debounceFn: (...args: T[]) => void; + time?: number; +} + +export class Debounce extends React.Component> { + timer = null; + + handleDebounce = (...args: T[]) => { + const { debounceFn, time } = this.props; + if (this.timer) { + clearTimeout(this.timer); + } + this.timer = setTimeout(() => debounceFn(...args), time || 200); + }; + + componentWillUnmount() { + clearTimeout(this.timer); + } + + render() { + return this.props.children(this.handleDebounce); + } +} +export default Debounce; diff --git a/src/components/DebounceForm.tsx b/src/components/DebounceForm.tsx new file mode 100644 index 000000000..0742aa50b --- /dev/null +++ b/src/components/DebounceForm.tsx @@ -0,0 +1,27 @@ +import * as React from "react"; +import Debounce from "./Debounce"; + +export interface DebounceFormProps { + change: (event: React.ChangeEvent, cb?: () => void) => void; + children: (( + props: (event: React.ChangeEvent) => void + ) => React.ReactNode); + submit: (event: React.FormEvent) => void; + time?: number; +} + +export const DebounceForm: React.StatelessComponent = ({ + change, + children, + submit, + time +}) => ( + + {debounceFn => + children(event => { + change(event, debounceFn); + }) + } + +); +export default DebounceForm; diff --git a/src/components/DeleteFilterTabDialog/DeleteFilterTabDialog.tsx b/src/components/DeleteFilterTabDialog/DeleteFilterTabDialog.tsx new file mode 100644 index 000000000..aa4fb9125 --- /dev/null +++ b/src/components/DeleteFilterTabDialog/DeleteFilterTabDialog.tsx @@ -0,0 +1,46 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import i18n from "../../i18n"; +import ActionDialog from "../ActionDialog"; +import { ConfirmButtonTransitionState } from "../ConfirmButton"; + +export interface DeleteFilterTabDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + tabName: string; + onClose: () => void; + onSubmit: () => void; +} + +const DeleteFilterTabDialog: React.FC = ({ + confirmButtonState, + onClose, + onSubmit, + open, + tabName +}) => ( + + {{ name }} search tab?", + { + name: tabName + } + ) + }} + /> + +); +DeleteFilterTabDialog.displayName = "DeleteFilterTabDialog"; +export default DeleteFilterTabDialog; diff --git a/src/components/DeleteFilterTabDialog/index.ts b/src/components/DeleteFilterTabDialog/index.ts new file mode 100644 index 000000000..3f4ef0d56 --- /dev/null +++ b/src/components/DeleteFilterTabDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from './DeleteFilterTabDialog'; +export * from './DeleteFilterTabDialog'; \ No newline at end of file diff --git a/src/components/DraftRenderer.tsx b/src/components/DraftRenderer.tsx new file mode 100644 index 000000000..d6fcd508f --- /dev/null +++ b/src/components/DraftRenderer.tsx @@ -0,0 +1,17 @@ +import { RawDraftContentState } from "draft-js"; +import * as draftToHtml from "draftjs-to-html"; +import * as React from "react"; + +interface DraftRendererProps { + content: RawDraftContentState; +} + +const DraftRenderer: React.FC = ({ content }) => ( +
    +); +DraftRenderer.displayName = "DraftRenderer"; +export default DraftRenderer; diff --git a/src/components/Dropzone.tsx b/src/components/Dropzone.tsx new file mode 100644 index 000000000..1a8c62114 --- /dev/null +++ b/src/components/Dropzone.tsx @@ -0,0 +1,3 @@ +/* tslint:disable:no-submodule-imports */ +import * as Dropzone from "react-dropzone/dist/index"; +export default Dropzone; diff --git a/src/components/EditableTableCell/EditableTableCell.tsx b/src/components/EditableTableCell/EditableTableCell.tsx new file mode 100644 index 000000000..7438e0762 --- /dev/null +++ b/src/components/EditableTableCell/EditableTableCell.tsx @@ -0,0 +1,116 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TableCell from "@material-ui/core/TableCell"; +import TextField, { TextFieldProps } from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import * as React from "react"; + +import Form from "@saleor/components/Form"; + +const styles = (theme: Theme) => + createStyles({ + card: { + border: `1px solid ${theme.overrides.MuiCard.root.borderColor}` + }, + container: { + position: "relative" + }, + overlay: { + cursor: "pointer", + height: "100vh", + left: 0, + position: "fixed", + top: 0, + width: "100vw", + zIndex: 1 + }, + root: { + left: 0, + minWidth: theme.spacing.unit * 20, + position: "absolute", + top: 0, + width: `calc(100% + ${4 * theme.spacing.unit}px)`, + zIndex: 2 + }, + text: { + cursor: "pointer", + fontSize: "0.8125rem" + } + }); + +interface EditableTableCellProps extends WithStyles { + className?: string; + defaultValue?: string; + focused?: boolean; + InputProps?: TextFieldProps; + value: string; + onConfirm(value: string): any; +} + +export const EditableTableCell = withStyles(styles, { + name: "EditableTableCell" +})( + ({ + classes, + className, + defaultValue, + focused, + InputProps, + value, + onConfirm + }: EditableTableCellProps) => { + const [opened, setOpenStatus] = React.useState(focused); + const enable = () => setOpenStatus(true); + const disable = () => setOpenStatus(false); + + const handleConfirm = (data: { value: string }) => { + disable(); + onConfirm(data.value); + }; + + return ( + + {opened &&
    } +
    + {({ change, data }) => ( + <> + + {value || defaultValue} + + {opened && ( +
    + + + + + +
    + )} + + )} +
    + + ); + } +); +EditableTableCell.displayName = "EditableTableCell"; +export default EditableTableCell; diff --git a/src/components/EditableTableCell/index.ts b/src/components/EditableTableCell/index.ts new file mode 100644 index 000000000..82c842fa9 --- /dev/null +++ b/src/components/EditableTableCell/index.ts @@ -0,0 +1,2 @@ +export { default } from "./EditableTableCell"; +export * from "./EditableTableCell"; diff --git a/src/components/ErrorMessageCard/ErrorMessageCard.tsx b/src/components/ErrorMessageCard/ErrorMessageCard.tsx new file mode 100644 index 000000000..ed64be6f2 --- /dev/null +++ b/src/components/ErrorMessageCard/ErrorMessageCard.tsx @@ -0,0 +1,25 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import i18n from "../../i18n"; + +interface ErrorMessageCardProps { + message: string; +} + +const ErrorMessageCard: React.StatelessComponent = ({ + message +}) => ( + + + + {i18n.t("Error", { context: "title" })} + + {message} + + +); +ErrorMessageCard.displayName = "ErrorMessageCard"; +export default ErrorMessageCard; diff --git a/src/components/ErrorMessageCard/index.ts b/src/components/ErrorMessageCard/index.ts new file mode 100644 index 000000000..e5e67e8be --- /dev/null +++ b/src/components/ErrorMessageCard/index.ts @@ -0,0 +1 @@ +export { default } from "./ErrorMessageCard"; diff --git a/src/components/ErrorPage/ErrorPage.tsx b/src/components/ErrorPage/ErrorPage.tsx new file mode 100644 index 000000000..299613e9b --- /dev/null +++ b/src/components/ErrorPage/ErrorPage.tsx @@ -0,0 +1,100 @@ +import Button from "@material-ui/core/Button"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; +import SVG from "react-inlinesvg"; + +import * as notFoundImage from "@assets/images/what.svg"; +import i18n from "../../i18n"; + +export interface ErrorPageProps extends WithStyles { + onBack: () => void; +} + +const styles = (theme: Theme) => + createStyles({ + bottomHeader: { + fontWeight: 600 as 600, + textTransform: "uppercase" + }, + button: { + marginTop: theme.spacing.unit * 2, + padding: 20 + }, + container: { + [theme.breakpoints.down("sm")]: { + gridTemplateColumns: "1fr", + padding: theme.spacing.unit * 3, + width: "100%" + }, + display: "grid", + gridTemplateColumns: "1fr 487px", + margin: "0 auto", + width: 830 + }, + innerContainer: { + [theme.breakpoints.down("sm")]: { + order: 1, + textAlign: "center" + }, + display: "flex", + flexDirection: "column", + justifyContent: "center" + }, + notFoundImage: { + "& svg": { + width: "100%" + } + }, + root: { + alignItems: "center", + display: "flex", + height: "calc(100vh - 88px)" + }, + upperHeader: { + fontWeight: 600 as 600 + } + }); + +const ErrorPage = withStyles(styles, { name: "NotFoundPage" })( + ({ classes, onBack }: ErrorPageProps) => ( +
    +
    +
    +
    + + {i18n.t("Ooops!...")} + + + {i18n.t("Error")} + + {i18n.t("We've encountered a problem...")} + + {i18n.t("Don't worry, everything is gonna be fine")} + +
    +
    + +
    +
    +
    + +
    +
    +
    + ) +); +ErrorPage.displayName = "ErrorPage"; +export default ErrorPage; diff --git a/src/components/ErrorPage/index.ts b/src/components/ErrorPage/index.ts new file mode 100644 index 000000000..3d294a58f --- /dev/null +++ b/src/components/ErrorPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ErrorPage"; +export * from "./ErrorPage"; diff --git a/src/components/ExtendedPageHeader/ExtendedPageHeader.tsx b/src/components/ExtendedPageHeader/ExtendedPageHeader.tsx new file mode 100644 index 000000000..52affe67f --- /dev/null +++ b/src/components/ExtendedPageHeader/ExtendedPageHeader.tsx @@ -0,0 +1,55 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as classNames from "classnames"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + action: { + flex: "0 0 auto" + }, + grid: { + padding: theme.spacing.unit * 2 + }, + menuButton: { + flex: "0 0 auto", + marginLeft: theme.spacing.unit * -2, + marginRight: theme.spacing.unit * 3, + marginTop: -theme.spacing.unit * 2 + }, + root: { + alignItems: "center", + display: "flex", + marginBottom: theme.spacing.unit * 3 + }, + subtitle: { + alignItems: "center", + display: "flex", + marginBottom: theme.spacing.unit * 2 + }, + title: { + flex: 1, + paddingBottom: theme.spacing.unit * 2 + } + }); + +interface ExtendedPageHeaderProps extends WithStyles { + children?: React.ReactNode; + className?: string; + title?: React.ReactNode; +} + +const ExtendedPageHeader = withStyles(styles, { name: "ExtendedPageHeader" })( + ({ children, classes, className, title }: ExtendedPageHeaderProps) => ( +
    + {title} +
    {children}
    +
    + ) +); +ExtendedPageHeader.displayName = "ExtendedPageHeader"; +export default ExtendedPageHeader; diff --git a/src/components/ExtendedPageHeader/index.ts b/src/components/ExtendedPageHeader/index.ts new file mode 100644 index 000000000..d1ee37996 --- /dev/null +++ b/src/components/ExtendedPageHeader/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ExtendedPageHeader"; +export * from "./ExtendedPageHeader"; diff --git a/src/components/ExternalLink/ExternalLink.tsx b/src/components/ExternalLink/ExternalLink.tsx new file mode 100644 index 000000000..d3b64db1d --- /dev/null +++ b/src/components/ExternalLink/ExternalLink.tsx @@ -0,0 +1,36 @@ +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import Typography, { TypographyProps } from "@material-ui/core/Typography"; +import * as React from "react"; + +const styles = createStyles({ + link: { + textDecoration: "none" + } +}); + +interface ExternalLinkProps + extends React.HTMLProps, + WithStyles { + href: string; + className?: string; + typographyProps?: TypographyProps; +} + +const ExternalLink = withStyles(styles, { name: "ExternalLink" })( + ({ + classes, + className, + children, + href, + typographyProps, + ...props + }: ExternalLinkProps) => ( + + + {children} + + + ) +); +ExternalLink.displayName = "ExternalLink"; +export default ExternalLink; diff --git a/src/components/ExternalLink/index.ts b/src/components/ExternalLink/index.ts new file mode 100644 index 000000000..ec7bc81ba --- /dev/null +++ b/src/components/ExternalLink/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ExternalLink"; +export * from "./ExternalLink"; diff --git a/src/components/FileUpload/FileUpload.tsx b/src/components/FileUpload/FileUpload.tsx new file mode 100644 index 000000000..ecccddd38 --- /dev/null +++ b/src/components/FileUpload/FileUpload.tsx @@ -0,0 +1,51 @@ +import Button from "@material-ui/core/Button"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; +import i18n from "../../i18n"; + +const styles = createStyles({ + fileUploadField: { + display: "none" + }, + root: { + display: "flex" + }, + textField: { + flex: 1 + } +}); + +interface FileUploadProps extends WithStyles { + disabled?: boolean; + name?: string; + value?: any; + onChange?(event: React.ChangeEvent); +} + +const FileUpload = withStyles(styles, { name: "FileUpload" })( + ({ classes, disabled, name, value, onChange }: FileUploadProps) => ( +
    + (this.upload = ref)} + className={classes.fileUploadField} + type="file" + value={value} + /> + + +
    + ) +); +FileUpload.displayName = "FileUpload"; +export default FileUpload; diff --git a/src/components/FileUpload/index.ts b/src/components/FileUpload/index.ts new file mode 100644 index 000000000..7082935e4 --- /dev/null +++ b/src/components/FileUpload/index.ts @@ -0,0 +1,2 @@ +export { default } from "./FileUpload"; +export * from "./FileUpload"; diff --git a/src/components/Filter/Filter.tsx b/src/components/Filter/Filter.tsx new file mode 100644 index 000000000..8e31b8ea4 --- /dev/null +++ b/src/components/Filter/Filter.tsx @@ -0,0 +1,152 @@ +import ButtonBase from "@material-ui/core/ButtonBase"; +import Grow from "@material-ui/core/Grow"; +import Paper from "@material-ui/core/Paper"; +import Popper from "@material-ui/core/Popper"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import { fade } from "@material-ui/core/styles/colorManipulator"; +import Typography from "@material-ui/core/Typography"; +import ArrowDropDownIcon from "@material-ui/icons/ArrowDropDown"; +import * as classNames from "classnames"; +import * as React from "react"; + +import { FilterContent } from "."; +import i18n from "../../i18n"; +import { FilterContentSubmitData } from "./FilterContent"; +import { IFilter } from "./types"; + +export interface FilterProps { + currencySymbol: string; + menu: IFilter; + filterLabel: string; + onFilterAdd: (filter: FilterContentSubmitData) => void; +} + +const styles = (theme: Theme) => + createStyles({ + addFilterButton: { + "&$filterButton": { + "&:hover, &:focus": { + backgroundColor: fade(theme.palette.primary.main, 0.1) + }, + backgroundColor: theme.palette.background.paper, + border: `1px solid ${theme.palette.primary.main}`, + cursor: "pointer", + marginBottom: 0, + marginRight: theme.spacing.unit * 2, + marginTop: 0, + transition: theme.transitions.duration.short + "ms" + } + }, + addFilterButtonActive: { + "&$addFilterButton": { + backgroundColor: fade(theme.palette.primary.main, 0.1) + } + }, + addFilterIcon: { + transition: theme.transitions.duration.short + "ms" + }, + addFilterText: { + color: theme.palette.primary.main, + fontSize: 14, + fontWeight: 600 as 600, + marginRight: 4, + textTransform: "uppercase" + }, + filterButton: { + alignItems: "center", + backgroundColor: fade(theme.palette.primary.main, 0.6), + borderRadius: "19px", + display: "flex", + height: "38px", + justifyContent: "space-around", + margin: `0 ${theme.spacing.unit * 2}px ${theme.spacing.unit}px`, + marginLeft: 0, + padding: "0 16px" + }, + filterLabel: { + marginBottom: theme.spacing.unit + }, + paper: { + marginTop: theme.spacing.unit * 2, + padding: theme.spacing.unit * 2, + width: 240 + }, + popover: { + zIndex: 1 + }, + rotate: { + transform: "rotate(180deg)" + } + }); +const Filter = withStyles(styles, { name: "Filter" })( + ({ + classes, + currencySymbol, + filterLabel, + menu, + onFilterAdd + }: FilterProps & WithStyles) => { + const anchor = React.useRef(); + const [isFilterMenuOpened, setFilterMenuOpened] = React.useState(false); + + return ( +
    + setFilterMenuOpened(!isFilterMenuOpened)} + > + + {i18n.t("Add Filter")} + + + + + {({ TransitionProps, placement }) => ( + + + + {filterLabel} + + { + onFilterAdd(data); + setFilterMenuOpened(false); + }} + /> + + + )} + +
    + ); + } +); +Filter.displayName = "Filter"; +export default Filter; diff --git a/src/components/Filter/FilterContent.tsx b/src/components/Filter/FilterContent.tsx new file mode 100644 index 000000000..3822d8cdb --- /dev/null +++ b/src/components/Filter/FilterContent.tsx @@ -0,0 +1,137 @@ +import Button from "@material-ui/core/Button"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import { makeStyles } from "@material-ui/styles"; +import i18n from "../../i18n"; +import { getMenuItemByValue, isLeaf, walkToRoot } from "../../utils/menu"; +import FormSpacer from "../FormSpacer"; +import SingleSelectField from "../SingleSelectField"; +import FilterElement from "./FilterElement"; +import { IFilter } from "./types"; + +export interface FilterContentSubmitData { + name: string; + value: string | string[]; +} +export interface FilterContentProps { + currencySymbol: string; + filters: IFilter; + onSubmit: (data: FilterContentSubmitData) => void; +} + +function checkFilterValue(value: string | string[]): boolean { + if (typeof value === "string") { + return !!value; + } + return value.some(v => !!v); +} + +function getFilterChoices(items: IFilter) { + return items.map(filterItem => ({ + label: filterItem.label, + value: filterItem.value + })); +} + +const useStyles = makeStyles({ + input: { + padding: "20px 12px 17px" + } +}); + +const FilterContent: React.FC = ({ + currencySymbol, + filters, + onSubmit +}) => { + const [menuValue, setMenuValue] = React.useState(""); + const [filterValue, setFilterValue] = React.useState(""); + const classes = useStyles(); + + const activeMenu = menuValue + ? getMenuItemByValue(filters, menuValue) + : undefined; + const menus = menuValue + ? walkToRoot(filters, menuValue).slice(-1) + : undefined; + + const onMenuChange = (event: React.ChangeEvent) => { + setMenuValue(event.target.value); + setFilterValue(""); + }; + + return ( + <> + + {menus && + menus.map( + (filterItem, filterItemIndex) => + !isLeaf(filterItem) && ( + + + + + ) + )} + {activeMenu && isLeaf(activeMenu) && ( + <> + + {activeMenu.data.additionalText && ( + {activeMenu.data.additionalText} + )} + setFilterValue(value)} + /> + {checkFilterValue(filterValue) && ( + <> + + + + )} + + )} + + ); +}; +FilterContent.displayName = "FilterContent"; +export default FilterContent; diff --git a/src/components/Filter/FilterElement.tsx b/src/components/Filter/FilterElement.tsx new file mode 100644 index 000000000..590ebffff --- /dev/null +++ b/src/components/Filter/FilterElement.tsx @@ -0,0 +1,211 @@ +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import { makeStyles } from "@material-ui/styles"; +import * as React from "react"; + +import i18n from "../../i18n"; +import Calendar from "../../icons/Calendar"; +import FormSpacer from "../FormSpacer"; +import PriceField from "../PriceField"; +import SingleSelectField from "../SingleSelectField"; +import { FieldType, IFilterItem } from "./types"; + +export interface FilterElementProps { + className?: string; + filter: IFilterItem; + value: string | string[]; + onChange: (value: string | string[]) => void; +} + +const useStyles = makeStyles({ + calendar: { + margin: 8 + }, + input: { + padding: "20px 12px 17px" + } +}); + +export interface FilterElementProps { + className?: string; + currencySymbol: string; + filter: IFilterItem; + value: string | string[]; + onChange: (value: string | string[]) => void; +} + +const FilterElement: React.FC = ({ + currencySymbol, + className, + filter, + onChange, + value +}) => { + const classes = useStyles(); + + if (filter.data.type === FieldType.date) { + return ( + onChange(event.target.value)} + value={value} + InputProps={{ + classes: { + input: classes.input + }, + startAdornment: + }} + /> + ); + } else if (filter.data.type === FieldType.rangeDate) { + return ( + <> + {i18n.t("from")} + onChange([event.target.value, value[1]])} + InputProps={{ + classes: { + input: classes.input + }, + startAdornment: + }} + /> + + {i18n.t("to")} + onChange([value[0], event.target.value])} + InputProps={{ + classes: { + input: classes.input + }, + startAdornment: + }} + /> + + ); + } else if (filter.data.type === FieldType.range) { + return ( + <> + {i18n.t("from")} + onChange([event.target.value, value[1]])} + type="number" + InputProps={{ + classes: { + input: classes.input + } + }} + /> + + {i18n.t("to")} + onChange([value[0], event.target.value])} + type="number" + InputProps={{ + classes: { + input: classes.input + } + }} + /> + + ); + } else if (filter.data.type === FieldType.rangePrice) { + return ( + <> + {i18n.t("from")} + onChange([event.target.value, value[1]])} + InputProps={{ + classes: { + input: classes.input + } + }} + /> + + {i18n.t("to")} + onChange([value[0], event.target.value])} + InputProps={{ + classes: { + input: classes.input + } + }} + /> + + ); + } else if (filter.data.type === FieldType.select) { + return ( + ({ + ...option, + value: option.value.toString() + }))} + selectProps={{ + className, + inputProps: { + className: classes.input + } + }} + value={value as string} + placeholder={i18n.t("Select Filter...")} + onChange={event => onChange(event.target.value)} + /> + ); + } else if (filter.data.type === FieldType.price) { + return ( + onChange(event.target.value)} + InputProps={{ + classes: { + input: !filter.data.fieldLabel && classes.input + } + }} + value={value as string} + /> + ); + } else if (filter.data.type === FieldType.hidden) { + onChange(filter.data.value); + return ; + } + return ( + onChange(event.target.value)} + value={value as string} + /> + ); +}; +FilterElement.displayName = "FilterElement"; +export default FilterElement; diff --git a/src/components/Filter/index.ts b/src/components/Filter/index.ts new file mode 100644 index 000000000..2bc2cf752 --- /dev/null +++ b/src/components/Filter/index.ts @@ -0,0 +1,5 @@ +export { default } from "./Filter"; +export * from "./Filter"; +export { default as FilterContent } from "./FilterContent"; +export * from "./FilterContent"; +export * from "./types"; diff --git a/src/components/Filter/types.ts b/src/components/Filter/types.ts new file mode 100644 index 000000000..53bf9302a --- /dev/null +++ b/src/components/Filter/types.ts @@ -0,0 +1,30 @@ +import { IMenu, IMenuItem } from "../../utils/menu"; + +export enum FieldType { + date, + hidden, + number, + price, + range, + rangeDate, + rangePrice, + select, + text +} + +export interface FilterChoice { + label: string; + value: string | boolean; +} + +export interface FilterData { + additionalText?: string; + fieldLabel: string; + options?: FilterChoice[]; + type: FieldType; + value?: string; +} + +export type IFilterItem = IMenuItem; + +export type IFilter = IMenu; diff --git a/src/components/FilterBar/FilterBar.tsx b/src/components/FilterBar/FilterBar.tsx new file mode 100644 index 000000000..e8a75a229 --- /dev/null +++ b/src/components/FilterBar/FilterBar.tsx @@ -0,0 +1,82 @@ +import * as React from "react"; + +import i18n from "../../i18n"; +import { FilterProps } from "../../types"; +import Debounce from "../Debounce"; +import { IFilter } from "../Filter/types"; +import FilterTabs, { FilterChips, FilterTab } from "../TableFilter"; + +export interface FilterBarProps + extends FilterProps { + filterMenu: IFilter; +} + +const FilterBar: React.FC = ({ + allTabLabel, + currencySymbol, + filterLabel, + filtersList, + filterTabs, + filterMenu, + currentTab, + initialSearch, + searchPlaceholder, + onAll, + onSearchChange, + onFilterAdd, + onFilterSave, + onTabChange, + onFilterDelete +}) => { + const [search, setSearch] = React.useState(initialSearch); + React.useEffect(() => setSearch(initialSearch), [currentTab, initialSearch]); + + const isCustom = currentTab === filterTabs.length + 1; + + return ( + <> + + + {filterTabs.map((tab, tabIndex) => ( + onTabChange(tabIndex + 1)} + label={tab.name} + /> + ))} + {isCustom && ( + undefined} + label={i18n.t("Custom Filter")} + /> + )} + + + {debounceSearchChange => { + const handleSearchChange = (event: React.ChangeEvent) => { + const value = event.target.value; + setSearch(value); + debounceSearchChange(value); + }; + + return ( + + ); + }} + + + ); +}; +FilterBar.displayName = "FilterBar"; +export default FilterBar; diff --git a/src/components/FilterBar/index.ts b/src/components/FilterBar/index.ts new file mode 100644 index 000000000..000078c21 --- /dev/null +++ b/src/components/FilterBar/index.ts @@ -0,0 +1,2 @@ +export { default } from './FilterBar'; +export * from './FilterBar'; \ No newline at end of file diff --git a/src/components/FilterCard/FilterCard.tsx b/src/components/FilterCard/FilterCard.tsx new file mode 100644 index 000000000..2a03d0fa8 --- /dev/null +++ b/src/components/FilterCard/FilterCard.tsx @@ -0,0 +1,33 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardHeader from "@material-ui/core/CardHeader"; +import IconButton from "@material-ui/core/IconButton"; +import RefreshIcon from "@material-ui/icons/Refresh"; +import * as React from "react"; + +import i18n from "../../i18n"; + +export interface FilterCardProps { + handleClear(); +} + +const FilterCard: React.StatelessComponent = ({ + children, + handleClear +}) => ( + +
    + + + + } + title={i18n.t("Filters")} + /> + {children} + +
    +); +FilterCard.displayName = "FilterCard"; +export default FilterCard; diff --git a/src/components/FilterCard/index.ts b/src/components/FilterCard/index.ts new file mode 100644 index 000000000..f9e07b97d --- /dev/null +++ b/src/components/FilterCard/index.ts @@ -0,0 +1 @@ +export { default } from "./FilterCard"; diff --git a/src/components/Form/Form.tsx b/src/components/Form/Form.tsx new file mode 100644 index 000000000..7b19a244b --- /dev/null +++ b/src/components/Form/Form.tsx @@ -0,0 +1,170 @@ +import * as React from "react"; +import { UserError } from "../../types"; + +export interface FormProps { + children: (props: { + data: T; + hasChanged: boolean; + errors: { [key: string]: string }; + change(event: React.ChangeEvent, cb?: () => void); + reset(); + submit(event?: React.FormEvent); + }) => React.ReactElement; + errors?: UserError[]; + initial?: T; + confirmLeave?: boolean; + useForm?: boolean; + resetOnSubmit?: boolean; + onSubmit?(data: T); +} + +interface FormComponentProps extends FormProps { + hasChanged: boolean; + toggleFormChangeState: () => void; +} + +interface FormState { + initial: T; + fields: T; + hasChanged: boolean; +} + +class FormComponent extends React.Component< + FormComponentProps, + FormState +> { + static getDerivedStateFromProps( + nextProps: FormComponentProps, + prevState: FormState + ): FormState { + const changedFields = Object.keys(nextProps.initial).filter( + nextFieldName => + JSON.stringify(nextProps.initial[nextFieldName]) !== + JSON.stringify(prevState.initial[nextFieldName]) + ); + if (changedFields.length > 0) { + const swapFields = changedFields.reduce((prev, curr) => { + prev[curr] = nextProps.initial[curr]; + return prev; + }, {}); + + return { + fields: { + ...(prevState.fields as any), + ...swapFields + }, + hasChanged: false, + initial: { + ...(prevState.initial as any), + ...swapFields + } + }; + } + return null; + } + + state: FormState = { + fields: this.props.initial, + hasChanged: false, + initial: this.props.initial + }; + + componentDidUpdate() { + const { hasChanged, confirmLeave, toggleFormChangeState } = this.props; + if (this.state.hasChanged !== hasChanged && confirmLeave) { + toggleFormChangeState(); + } + } + + componentDidMount() { + const { hasChanged, confirmLeave, toggleFormChangeState } = this.props; + if (this.state.hasChanged !== hasChanged && confirmLeave) { + toggleFormChangeState(); + } + } + + componentWillUnmount() { + const { hasChanged, confirmLeave, toggleFormChangeState } = this.props; + if (hasChanged && confirmLeave) { + toggleFormChangeState(); + } + } + + handleChange = (event: React.ChangeEvent, cb?: () => void) => { + const { target } = event; + if (!(target.name in this.state.fields)) { + console.error(`Unknown form field: ${target.name}`); + return; + } + + this.setState( + { + fields: { + ...(this.state.fields as any), + [target.name]: target.value + }, + hasChanged: true + }, + typeof cb === "function" ? cb : undefined + ); + }; + + handleKeyDown = (event: React.KeyboardEvent) => { + switch (event.keyCode) { + // Enter + case 13: + this.props.onSubmit(this.state.fields); + break; + } + }; + + handleSubmit = (event?: React.FormEvent, cb?: () => void) => { + const { resetOnSubmit, onSubmit } = this.props; + if (event) { + event.stopPropagation(); + event.preventDefault(); + } + if (onSubmit !== undefined) { + onSubmit(this.state.fields); + } + if (cb) { + cb(); + } + if (resetOnSubmit) { + this.setState({ + fields: this.state.initial + }); + } + }; + + render() { + const { children, errors, useForm = true } = this.props; + + const contents = children({ + change: this.handleChange, + data: this.state.fields, + errors: errors + ? errors.reduce( + (prev, curr) => ({ + ...prev, + [curr.field.split(":")[0]]: curr.message + }), + {} + ) + : {}, + hasChanged: this.state.hasChanged, + reset: () => + this.setState({ + fields: this.state.initial + }), + submit: this.handleSubmit + }); + + return useForm ? ( +
    {contents}
    + ) : ( +
    {contents}
    + ); + } +} +export default FormComponent; diff --git a/src/components/Form/FormActions.tsx b/src/components/Form/FormActions.tsx new file mode 100644 index 000000000..3a1a49a6f --- /dev/null +++ b/src/components/Form/FormActions.tsx @@ -0,0 +1,40 @@ +import Button from "@material-ui/core/Button"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import Toolbar from "@material-ui/core/Toolbar"; +import * as React from "react"; + +import i18n from "../../i18n"; + +const styles = createStyles({ + cardActions: { + flexDirection: "row-reverse" as "row-reverse" + } +}); + +interface FormActionsProps extends WithStyles { + submitLabel: string; + onCancel?(); + onSubmit?(event: React.FormEvent); +} + +const FormActions = withStyles(styles, { name: "FormActions" })( + ({ classes, onCancel, onSubmit, submitLabel }: FormActionsProps) => ( + + + {onCancel && ( + + )} + + ) +); +FormActions.displayName = "FormActions"; +export default FormActions; diff --git a/src/components/Form/FormContext.tsx b/src/components/Form/FormContext.tsx new file mode 100644 index 000000000..b8d73029c --- /dev/null +++ b/src/components/Form/FormContext.tsx @@ -0,0 +1,54 @@ +import * as React from "react"; + +import FormComponent, { FormProps } from "./Form"; + +interface IFormContext { + hasChanged: boolean; + toggle: () => void; +} + +export const FormContext = React.createContext(undefined); + +interface FormProviderState { + hasChanged: boolean; +} + +export class FormProvider extends React.Component<{}, FormProviderState> { + state: FormProviderState = { + hasChanged: false + }; + + toggle = () => + this.setState(prevState => ({ + hasChanged: !prevState.hasChanged + })); + + render() { + return ( + + {this.props.children} + + ); + } +} + +export function Form(props: FormProps) { + return ( + + {({ hasChanged, toggle }) => ( + + )} + + ); +} + +export default Form; diff --git a/src/components/Form/index.ts b/src/components/Form/index.ts new file mode 100644 index 000000000..1f0b7dda4 --- /dev/null +++ b/src/components/Form/index.ts @@ -0,0 +1,5 @@ +export * from "./Form"; +export { default as FormActions } from "./FormActions"; +export * from "./FormActions"; +export * from "./FormContext"; +export { default } from "./FormContext"; diff --git a/src/components/FormSpacer.tsx b/src/components/FormSpacer.tsx new file mode 100644 index 000000000..3401eb6cf --- /dev/null +++ b/src/components/FormSpacer.tsx @@ -0,0 +1,27 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + spacer: { + marginTop: theme.spacing.unit * 3 + } + }); + +interface FormSpacerProps extends WithStyles { + children?: React.ReactNode; +} + +export const FormSpacer = withStyles(styles, { name: "FormSpacer" })( + ({ classes, children }: FormSpacerProps) => ( +
    {children}
    + ) +); + +FormSpacer.displayName = "FormSpacer"; +export default FormSpacer; diff --git a/src/components/Grid/Grid.tsx b/src/components/Grid/Grid.tsx new file mode 100644 index 000000000..b5cc6664c --- /dev/null +++ b/src/components/Grid/Grid.tsx @@ -0,0 +1,56 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import classNames from "classnames"; +import * as React from "react"; + +export type GridVariant = "default" | "inverted" | "uniform"; +export interface GridProps extends WithStyles { + children: React.ReactNodeArray | React.ReactNode; + className?: string; + variant?: GridVariant; +} + +const styles = (theme: Theme) => + createStyles({ + default: { + gridTemplateColumns: "9fr 4fr" + }, + inverted: { + gridTemplateColumns: "4fr 9fr" + }, + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 3 + "px", + gridRowGap: theme.spacing.unit * 3 + "px", + [theme.breakpoints.down("sm")]: { + gridRowGap: theme.spacing.unit + "px", + gridTemplateColumns: "1fr" + } + }, + uniform: { + gridTemplateColumns: "1fr 1fr" + } + }); + +export const Grid = withStyles(styles, { name: "Grid" })( + ({ className, children, classes, variant }: GridProps) => ( +
    + {children} +
    + ) +); +Grid.displayName = "Grid"; +Grid.defaultProps = { + variant: "default" +}; +export default Grid; diff --git a/src/components/Grid/index.ts b/src/components/Grid/index.ts new file mode 100644 index 000000000..e8a8dd689 --- /dev/null +++ b/src/components/Grid/index.ts @@ -0,0 +1,2 @@ +export { default } from "./Grid"; +export * from "./Grid"; diff --git a/src/components/Hr.tsx b/src/components/Hr.tsx new file mode 100644 index 000000000..458434005 --- /dev/null +++ b/src/components/Hr.tsx @@ -0,0 +1,32 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import classNames from "classnames"; +import * as React from "react"; + +interface HrProps { + className?: string; +} + +const styles = (theme: Theme) => + createStyles({ + root: { + backgroundColor: theme.overrides.MuiCard.root.borderColor, + border: "none", + display: "block", + height: 1, + margin: 0, + width: "100%" + } + }); + +export const Hr = withStyles(styles, { name: "Hr" })( + ({ className, classes }: HrProps & WithStyles) => ( +
    + ) +); +Hr.displayName = "Hr"; +export default Hr; diff --git a/src/components/IconButtonTableCell/IconButtonTableCell.tsx b/src/components/IconButtonTableCell/IconButtonTableCell.tsx new file mode 100644 index 000000000..558891746 --- /dev/null +++ b/src/components/IconButtonTableCell/IconButtonTableCell.tsx @@ -0,0 +1,49 @@ +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TableCell from "@material-ui/core/TableCell"; +import * as React from "react"; + +import { stopPropagation } from "../../misc"; +import { ICONBUTTON_SIZE } from "../../theme"; + +export interface IconButtonTableCellProps { + children: React.ReactNode; + disabled?: boolean; + onClick: () => void; +} + +const styles = (theme: Theme) => + createStyles({ + root: { + "&:last-child": { + paddingRight: 0 + }, + paddingRight: 0, + width: ICONBUTTON_SIZE + theme.spacing.unit / 2 + } + }); +const IconButtonTableCell = withStyles(styles, { name: "IconButtonTableCell" })( + ({ + children, + classes, + disabled, + onClick + }: IconButtonTableCellProps & WithStyles) => ( + + + {children} + + + ) +); +IconButtonTableCell.displayName = "IconButtonTableCell"; +export default IconButtonTableCell; diff --git a/src/components/IconButtonTableCell/index.ts b/src/components/IconButtonTableCell/index.ts new file mode 100644 index 000000000..ec9027bd4 --- /dev/null +++ b/src/components/IconButtonTableCell/index.ts @@ -0,0 +1,2 @@ +export { default } from './IconButtonTableCell'; +export * from './IconButtonTableCell'; \ No newline at end of file diff --git a/src/components/ImageTile/ImageTile.tsx b/src/components/ImageTile/ImageTile.tsx new file mode 100644 index 000000000..deb2c8f93 --- /dev/null +++ b/src/components/ImageTile/ImageTile.tsx @@ -0,0 +1,83 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import EditIcon from "@material-ui/icons/Edit"; + +const styles = (theme: Theme) => + createStyles({ + image: { + height: "100%", + objectFit: "contain", + userSelect: "none", + width: "100%" + }, + imageContainer: { + "&:hover, &.dragged": { + "& $imageOverlay": { + display: "block" + } + }, + background: theme.palette.background.paper, + border: `1px solid ${theme.overrides.MuiCard.root.borderColor}`, + borderRadius: theme.spacing.unit, + height: 148, + overflow: "hidden", + padding: theme.spacing.unit * 2, + position: "relative", + width: 148 + }, + imageOverlay: { + background: "rgba(0, 0, 0, 0.6)", + cursor: "move", + display: "none", + height: 148, + left: 0, + position: "absolute", + top: 0, + width: 148 + }, + imageOverlayToolbar: { + display: "flex", + justifyContent: "flex-end" + } + }); + +interface ImageTileProps extends WithStyles { + image: { + alt?: string; + url: string; + }; + onImageDelete?: () => void; + onImageEdit?: (event: React.ChangeEvent) => void; +} + +const ImageTile = withStyles(styles, { name: "ImageTile" })( + ({ classes, onImageDelete, onImageEdit, image }: ImageTileProps) => ( +
    +
    +
    + {onImageEdit && ( + + + + )} + {onImageDelete && ( + + + + )} +
    +
    + {image.alt} +
    + ) +); +ImageTile.displayName = "ImageTile"; +export default ImageTile; diff --git a/src/components/ImageTile/index.ts b/src/components/ImageTile/index.ts new file mode 100644 index 000000000..56297f884 --- /dev/null +++ b/src/components/ImageTile/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ImageTile"; +export * from "./ImageTile"; diff --git a/src/components/ImageUpload/ImageUpload.tsx b/src/components/ImageUpload/ImageUpload.tsx new file mode 100644 index 000000000..f6d75eb4d --- /dev/null +++ b/src/components/ImageUpload/ImageUpload.tsx @@ -0,0 +1,111 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import { fade } from "@material-ui/core/styles/colorManipulator"; +import Typography from "@material-ui/core/Typography"; +import classNames from "classnames"; +import * as React from "react"; + +import i18n from "../../i18n"; +import ImageIcon from "../../icons/Image"; +import Dropzone from "../Dropzone"; + +interface ImageUploadProps { + children?: (props: { isDragActive: boolean }) => React.ReactNode; + className?: string; + disableClick?: boolean; + isActiveClassName?: string; + iconContainerClassName?: string; + iconContainerActiveClassName?: string; + onImageUpload: (file: File) => void; +} + +const styles = (theme: Theme) => + createStyles({ + containerDragActive: { + background: fade(theme.palette.primary.main, 0.1), + color: theme.palette.primary.main + }, + fileField: { + display: "none" + }, + imageContainer: { + background: "#ffffff", + border: "1px solid #eaeaea", + borderRadius: theme.spacing.unit, + height: 148, + justifySelf: "start", + overflow: "hidden", + padding: theme.spacing.unit * 2, + position: "relative", + transition: theme.transitions.duration.standard + "s", + width: 148 + }, + photosIcon: { + height: "64px", + margin: "0 auto", + width: "64px" + }, + photosIconContainer: { + padding: `${theme.spacing.unit * 5}px 0`, + textAlign: "center" + }, + uploadText: { + color: theme.typography.body2.color, + textTransform: "uppercase" + } + }); + +export const ImageUpload = withStyles(styles, { name: "ImageUpload" })( + ({ + children, + classes, + className, + disableClick, + isActiveClassName, + iconContainerActiveClassName, + iconContainerClassName, + onImageUpload + }: ImageUploadProps & WithStyles) => ( + onImageUpload(files[0])} + > + {({ isDragActive, getInputProps, getRootProps }) => ( + <> +
    +
    + + + + {i18n.t("Drop here to upload", { + context: "image upload" + })} + +
    +
    + {children && children({ isDragActive })} + + )} +
    + ) +); +ImageUpload.displayName = "ImageUpload"; +export default ImageUpload; diff --git a/src/components/ImageUpload/index.tsx b/src/components/ImageUpload/index.tsx new file mode 100644 index 000000000..1ff646a38 --- /dev/null +++ b/src/components/ImageUpload/index.tsx @@ -0,0 +1,2 @@ +export { default } from "./ImageUpload"; +export * from "./ImageUpload"; diff --git a/src/components/LanguageSwitch/LanguageSwitch.tsx b/src/components/LanguageSwitch/LanguageSwitch.tsx new file mode 100644 index 000000000..1ec7e5a5b --- /dev/null +++ b/src/components/LanguageSwitch/LanguageSwitch.tsx @@ -0,0 +1,131 @@ +import Card from "@material-ui/core/Card"; +import ClickAwayListener from "@material-ui/core/ClickAwayListener"; +import Grow from "@material-ui/core/Grow"; +import MenuItem from "@material-ui/core/MenuItem"; +import Menu from "@material-ui/core/MenuList"; +import Paper from "@material-ui/core/Paper"; +import Popper from "@material-ui/core/Popper"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import ArrowDropDown from "@material-ui/icons/ArrowDropDown"; +import classNames from "classnames"; +import * as React from "react"; + +import i18n from "../../i18n"; +import { LanguageCodeEnum } from "../../types/globalTypes"; +import { ShopInfo_shop_languages } from "../Shop/types/ShopInfo"; + +export interface LanguageSwitchProps { + currentLanguage: LanguageCodeEnum; + languages: ShopInfo_shop_languages[]; + onLanguageChange: (lang: LanguageCodeEnum) => void; +} + +const styles = (theme: Theme) => + createStyles({ + arrow: { + color: theme.palette.primary.main, + transition: theme.transitions.duration.standard + "ms" + }, + container: { + paddingBottom: theme.spacing.unit + }, + menuContainer: { + cursor: "pointer", + display: "flex", + justifyContent: "space-between", + minWidth: 90, + padding: theme.spacing.unit, + position: "relative" + }, + menuItem: { + textAlign: "justify" + }, + menuPaper: { + maxHeight: `calc(100vh - ${theme.spacing.unit * 2}px)`, + overflow: "scroll" + }, + popover: { + zIndex: 1 + }, + rotate: { + transform: "rotate(180deg)" + } + }); +const LanguageSwitch = withStyles(styles, { name: "LanguageSwitch" })( + ({ + classes, + currentLanguage, + languages, + onLanguageChange + }: LanguageSwitchProps & WithStyles) => { + const [isExpanded, setExpandedState] = React.useState(false); + const anchor = React.useRef(); + + return ( +
    + setExpandedState(!isExpanded)} + > + {currentLanguage} + + + + {({ TransitionProps, placement }) => ( + + + setExpandedState(false)} + mouseEvent="onClick" + > + {languages.map(lang => ( + + { + setExpandedState(false); + onLanguageChange(lang.code); + }} + > + {i18n.t("{{ languageName }} - {{ languageCode }}", { + context: "button", + languageCode: lang.code, + languageName: lang.language + })} + + + ))} + + + + )} + +
    + ); + } +); +LanguageSwitch.displayName = "LanguageSwitch"; +export default LanguageSwitch; diff --git a/src/components/LanguageSwitch/index.ts b/src/components/LanguageSwitch/index.ts new file mode 100644 index 000000000..4c425527e --- /dev/null +++ b/src/components/LanguageSwitch/index.ts @@ -0,0 +1,2 @@ +export { default } from './LanguageSwitch'; +export * from './LanguageSwitch'; \ No newline at end of file diff --git a/src/components/Link.tsx b/src/components/Link.tsx new file mode 100644 index 000000000..6ee63d192 --- /dev/null +++ b/src/components/Link.tsx @@ -0,0 +1,65 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography, { TypographyProps } from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + primary: { + color: theme.palette.primary.main + }, + root: { + cursor: "pointer", + display: "inline" + }, + secondary: { + color: theme.palette.primary.main + }, + underline: { + textDecoration: "underline" + } + }); + +interface LinkProps + extends React.AnchorHTMLAttributes, + WithStyles { + color?: "primary" | "secondary"; + underline?: boolean; + typographyProps?: TypographyProps; + onClick: () => void; +} + +const Link = withStyles(styles, { name: "Link" })( + ({ + classes, + className, + children, + color = "primary", + underline = false, + onClick, + ...linkProps + }: LinkProps) => ( + { + event.preventDefault(); + onClick(); + }} + {...linkProps} + > + {children} + + ) +); +Link.displayName = "Link"; +export default Link; diff --git a/src/components/ListField/ListField.tsx b/src/components/ListField/ListField.tsx new file mode 100644 index 000000000..67ffc58c9 --- /dev/null +++ b/src/components/ListField/ListField.tsx @@ -0,0 +1,132 @@ +import { Omit } from "@material-ui/core"; +import Button from "@material-ui/core/Button"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField, { StandardTextFieldProps } from "@material-ui/core/TextField"; +import * as React from "react"; +import i18n from "../../i18n"; +import Chip from "../Chip"; + +interface ListFieldState { + newValueCounter: number; + value: string; +} + +const styles = (theme: Theme) => + createStyles({ + chip: { + marginBottom: theme.spacing.unit + }, + chipContainer: { + marginTop: theme.spacing.unit * 2, + width: 552 + } + }); + +interface ListFieldProps + extends Omit, + WithStyles { + values: Array<{ + label: string; + value: string; + }>; +} + +const ListField = withStyles(styles)( + class ListFieldComponent extends React.Component< + ListFieldProps, + ListFieldState + > { + state: ListFieldState = { + newValueCounter: 0, + value: "" + }; + handleFieldChange = (event: React.ChangeEvent) => + this.setState({ + value: event.target.value + }); + + handleFieldSubmit = (event: React.KeyboardEvent) => { + // Check if pressed 'enter' key + if (event.keyCode === 13) { + if (this.state.value !== "") { + event.preventDefault(); + event.stopPropagation(); + this.handleValueAdd(); + } + } + }; + + handleValueAdd = () => { + if (this.state.value !== "") { + this.props.onChange({ + target: { + name: this.props.name, + value: [ + ...this.props.values, + { + label: this.state.value, + value: "generated-" + this.state.newValueCounter + } + ] + } + } as any); + this.setState({ + newValueCounter: this.state.newValueCounter + 1, + value: "" + }); + } + }; + + handleValueRemove = (index: number) => + this.props.onChange({ + target: { + name: this.props.name, + value: this.props.values + .slice(0, index) + .concat(this.props.values.slice(index + 1)) + } + } as any); + + render() { + const { classes, values, onChange, ...props } = this.props; + return ( +
    + + {i18n.t("Add", { context: "button" })} + + ) + }} + value={this.state.value} + onChange={this.handleFieldChange} + onKeyDown={this.handleFieldSubmit} + /> +
    + {values.map((value, valueIndex) => ( + this.handleValueRemove(valueIndex)} + /> + ))} +
    +
    + ); + } + } +); +ListField.displayName = "ListField"; +export default ListField; diff --git a/src/components/ListField/index.ts b/src/components/ListField/index.ts new file mode 100644 index 000000000..85b671d73 --- /dev/null +++ b/src/components/ListField/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ListField"; +export * from "./ListField"; diff --git a/src/components/Locale/Locale.tsx b/src/components/Locale/Locale.tsx new file mode 100644 index 000000000..05c19a513 --- /dev/null +++ b/src/components/Locale/Locale.tsx @@ -0,0 +1,11 @@ +import * as React from "react"; + +export const LocaleContext = React.createContext("en"); + +const { Consumer: LocaleConsumer, Provider } = LocaleContext; + +const LocaleProvider = ({ children }) => { + return {children}; +}; + +export { LocaleConsumer, LocaleProvider }; diff --git a/src/components/Locale/index.ts b/src/components/Locale/index.ts new file mode 100644 index 000000000..e3a67a9e1 --- /dev/null +++ b/src/components/Locale/index.ts @@ -0,0 +1 @@ +export * from "./Locale"; diff --git a/src/components/MenuToggle.tsx b/src/components/MenuToggle.tsx new file mode 100644 index 000000000..54ed5548e --- /dev/null +++ b/src/components/MenuToggle.tsx @@ -0,0 +1,44 @@ +import * as React from "react"; + +interface MenuToggleProps { + ariaOwns?: string; + children: (( + props: { + actions: { + open: () => void; + close: () => void; + }; + open: boolean; + } + ) => React.ReactElement); +} + +interface MenuToggleState { + open: boolean; +} + +class MenuToggle extends React.Component { + state = { + open: false + }; + + handleClick = () => { + this.setState({ open: true }); + }; + + handleClose = () => { + this.setState({ open: false }); + }; + + render() { + const { children } = this.props; + const { open } = this.state; + + return children({ + actions: { open: this.handleClick, close: this.handleClose }, + open + }); + } +} + +export default MenuToggle; diff --git a/src/components/Money/Money.tsx b/src/components/Money/Money.tsx new file mode 100644 index 000000000..62ba7aaaa --- /dev/null +++ b/src/components/Money/Money.tsx @@ -0,0 +1,25 @@ +import * as React from "react"; + +import { LocaleConsumer } from "../Locale"; + +export interface IMoney { + amount: number; + currency: string; +} +export interface MoneyProps { + money: IMoney; +} + +export const Money: React.StatelessComponent = ({ money }) => ( + + {locale => { + return money.amount.toLocaleString(locale, { + currency: money.currency, + style: "currency" + }); + }} + +); + +Money.displayName = "Money"; +export default Money; diff --git a/src/components/Money/index.ts b/src/components/Money/index.ts new file mode 100644 index 000000000..e8e2d3a59 --- /dev/null +++ b/src/components/Money/index.ts @@ -0,0 +1,17 @@ +import Money from "./Money"; + +export { default } from "./Money"; +export * from "./Money"; + +export function addMoney(init: Money, ...args: Money[]): Money { + return { + amount: args.reduce((acc, curr) => acc + curr.amount, init.amount), + currency: init.currency + }; +} +export function subtractMoney(init: Money, ...args: Money[]): Money { + return { + amount: args.reduce((acc, curr) => acc - curr.amount, init.amount), + currency: init.currency + }; +} diff --git a/src/components/MoneyRange/MoneyRange.tsx b/src/components/MoneyRange/MoneyRange.tsx new file mode 100644 index 000000000..c2d1ac103 --- /dev/null +++ b/src/components/MoneyRange/MoneyRange.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; + +import i18n from "../../i18n"; +import { LocaleConsumer } from "../Locale"; +import IMoney from "../Money"; + +export interface MoneyRangeProps { + from?: IMoney; + to?: IMoney; +} + +const formatMoney = (money: IMoney, locale: string) => + money.amount.toLocaleString(locale, { + currency: money.currency, + style: "currency" + }); + +export const MoneyRange: React.StatelessComponent = ({ + from, + to +}) => ( + + {locale => + from && to + ? i18n.t("{{ fromMoney }} - {{ toMoney }}", { + context: "money", + fromMoney: formatMoney(from, locale), + toMoney: formatMoney(to, locale) + }) + : from && !to + ? i18n.t("from {{ money }}", { + context: "money", + money: formatMoney(from, locale) + }) + : !from && to + ? i18n.t("to {{ money }}", { + context: "money", + money: formatMoney(to, locale) + }) + : "-" + } + +); + +MoneyRange.displayName = "MoneyRange"; +export default MoneyRange; diff --git a/src/components/MoneyRange/index.ts b/src/components/MoneyRange/index.ts new file mode 100644 index 000000000..131c9f9a5 --- /dev/null +++ b/src/components/MoneyRange/index.ts @@ -0,0 +1,2 @@ +export { default } from './MoneyRange'; +export * from './MoneyRange'; \ No newline at end of file diff --git a/src/components/MultiAutocompleteSelectField/MultiAutocompleteSelectField.tsx b/src/components/MultiAutocompleteSelectField/MultiAutocompleteSelectField.tsx new file mode 100644 index 000000000..ed8d7452f --- /dev/null +++ b/src/components/MultiAutocompleteSelectField/MultiAutocompleteSelectField.tsx @@ -0,0 +1,181 @@ +import CircularProgress from "@material-ui/core/CircularProgress"; +import MenuItem from "@material-ui/core/MenuItem"; +import Paper from "@material-ui/core/Paper"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Downshift, { ControllerStateAndHelpers } from "downshift"; +import * as React from "react"; + +import i18n from "../../i18n"; +import ArrowDropdownIcon from "../../icons/ArrowDropdown"; +import Debounce, { DebounceProps } from "../Debounce"; + +interface ChoiceType { + label: string; + value: string; +} + +const styles = (theme: Theme) => + createStyles({ + chip: { + margin: `${theme.spacing.unit / 2}px ${theme.spacing.unit / 2}px` + }, + container: { + flexGrow: 1, + position: "relative" + }, + paper: { + left: 0, + marginTop: theme.spacing.unit, + padding: theme.spacing.unit, + position: "absolute", + right: 0, + zIndex: 2 + } + }); + +export interface MultiAutocompleteSelectFieldChildrenFunc { + deleteItem: (item: ChoiceType) => void; + items: ChoiceType[]; +} +export type MultiAutocompleteSelectFieldChildren = ( + props: MultiAutocompleteSelectFieldChildrenFunc +) => React.ReactNode; + +export interface MultiAutocompleteSelectFieldProps + extends WithStyles { + name: string; + children: MultiAutocompleteSelectFieldChildren; + choices: ChoiceType[]; + value?: ChoiceType[]; + loading?: boolean; + placeholder?: string; + helperText?: string; + label?: string; + fetchChoices(value: string); + onChange(event); +} + +const DebounceAutocomplete: React.ComponentType< + DebounceProps +> = Debounce; + +export const MultiAutocompleteSelectField = withStyles(styles, { + name: "MultiAutocompleteSelectField" +})( + ({ + children, + choices, + classes, + helperText, + label, + loading, + name, + placeholder, + value, + fetchChoices, + onChange + }: MultiAutocompleteSelectFieldProps) => { + const handleSelect = ( + item: ChoiceType, + { reset }: ControllerStateAndHelpers + ) => { + reset({ inputValue: "" }); + onChange({ target: { name, value: [...value, item] } }); + }; + const handleDelete = (item: ChoiceType) => { + const newValue = value.slice(); + newValue.splice( + value.findIndex(listItem => listItem.value === item.value), + 1 + ); + onChange({ target: { name, value: newValue } }); + }; + + const filteredChoices = choices.filter( + suggestion => value.map(v => v.value).indexOf(suggestion.value) === -1 + ); + + return ( + + {debounce => ( + (item ? item.label : "")} + onSelect={handleSelect} + onInputValueChange={value => debounce(value)} + > + {({ + getInputProps, + getItemProps, + isOpen, + selectedItem, + toggleMenu, + closeMenu, + openMenu, + highlightedIndex + }) => { + return ( +
    + + {loading ? ( + + ) : ( + + )} +
    + ), + id: undefined, + onBlur: closeMenu, + onFocus: openMenu + }} + helperText={helperText} + label={label} + fullWidth={true} + /> + {isOpen && ( + + {!loading && filteredChoices.length > 0 + ? filteredChoices.map((suggestion, index) => ( + + {suggestion.label} + + )) + : !loading && ( + + {i18n.t("No results found")} + + )} + + )} + {children({ + deleteItem: handleDelete, + items: selectedItem + })} +
    + ); + }} + + )} + + ); + } +); +MultiAutocompleteSelectField.displayName = "MultiAutocompleteSelectField"; +export default MultiAutocompleteSelectField; diff --git a/src/components/MultiAutocompleteSelectField/index.ts b/src/components/MultiAutocompleteSelectField/index.ts new file mode 100644 index 000000000..e7e4cfd9b --- /dev/null +++ b/src/components/MultiAutocompleteSelectField/index.ts @@ -0,0 +1,2 @@ +export { default } from "./MultiAutocompleteSelectField"; +export * from "./MultiAutocompleteSelectField"; diff --git a/src/components/MultiSelectField/MultiSelectField.tsx b/src/components/MultiSelectField/MultiSelectField.tsx new file mode 100644 index 000000000..4d11946b7 --- /dev/null +++ b/src/components/MultiSelectField/MultiSelectField.tsx @@ -0,0 +1,126 @@ +import FilledInput from "@material-ui/core/FilledInput"; +import FormControl from "@material-ui/core/FormControl"; +import FormHelperText from "@material-ui/core/FormHelperText"; +import InputLabel from "@material-ui/core/InputLabel"; +import MenuItem from "@material-ui/core/MenuItem"; +import Select, { SelectProps } from "@material-ui/core/Select"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import i18n from "../../i18n"; +import Checkbox from "../Checkbox"; + +const styles = (theme: Theme) => + createStyles({ + checkbox: { + marginRight: -theme.spacing.unit * 2 + }, + formControl: { + width: "100%" + }, + menuItem: { + alignItems: "center", + display: "flex", + justifyContent: "space-between", + width: "100%" + } + }); + +interface MultiSelectFieldProps extends WithStyles { + choices: Array<{ + value: string; + label: string; + }>; + disabled?: boolean; + error?: boolean; + hint?: string; + label?: string; + name?: string; + selectProps?: SelectProps; + value?: string[]; + onChange(event: any); +} + +export const MultiSelectField = withStyles(styles, { + name: "MultiSelectField" +})( + ({ + classes, + disabled, + error, + label, + choices, + value, + onChange, + name, + hint, + selectProps + }: MultiSelectFieldProps) => { + const choicesByKey = disabled + ? {} + : choices.reduce((prev, curr) => { + prev[curr.value] = curr.label; + return prev; + }, {}); + + return ( + + {label && {label}} + + {hint && {hint}} + + ); + } +); +MultiSelectField.defaultProps = { + value: [] +}; + +MultiSelectField.displayName = "MultiSelectField"; +export default MultiSelectField; diff --git a/src/components/MultiSelectField/index.ts b/src/components/MultiSelectField/index.ts new file mode 100644 index 000000000..16d075951 --- /dev/null +++ b/src/components/MultiSelectField/index.ts @@ -0,0 +1,2 @@ +export { default } from "./MultiSelectField"; +export * from "./MultiSelectField"; diff --git a/src/components/NotFoundPage/NotFoundPage.tsx b/src/components/NotFoundPage/NotFoundPage.tsx new file mode 100644 index 000000000..6e51e86a1 --- /dev/null +++ b/src/components/NotFoundPage/NotFoundPage.tsx @@ -0,0 +1,94 @@ +import Button from "@material-ui/core/Button"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; +import SVG from "react-inlinesvg"; + +import * as notFoundImage from "@assets/images/not-found-404.svg"; +import i18n from "../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + button: { + marginTop: theme.spacing.unit * 2, + padding: 20 + }, + container: { + [theme.breakpoints.down("sm")]: { + gridTemplateColumns: "1fr", + padding: theme.spacing.unit * 3, + width: "100%" + }, + display: "grid", + gridTemplateColumns: "1fr 487px", + margin: "0 auto", + width: 830 + }, + header: { + fontWeight: 600 as 600 + }, + innerContainer: { + [theme.breakpoints.down("sm")]: { + order: 1, + textAlign: "center" + }, + display: "flex", + flexDirection: "column", + justifyContent: "center" + }, + notFoundImage: { + "& svg": { + width: "100%" + } + }, + root: { + alignItems: "center", + display: "flex", + height: "100vh", + width: "100vw" + } + }); + +interface NotFoundPageProps extends WithStyles { + onBack: () => void; +} + +const NotFoundPage = withStyles(styles, { name: "NotFoundPage" })( + ({ classes, onBack }: NotFoundPageProps) => ( +
    +
    +
    +
    + + {i18n.t("Ooops!...")} + + + {i18n.t("Something's missing")} + + {i18n.t("Sorry, the page was not found")} +
    +
    + +
    +
    +
    + +
    +
    +
    + ) +); +NotFoundPage.displayName = "NotFoundPage"; +export default NotFoundPage; diff --git a/src/components/NotFoundPage/index.ts b/src/components/NotFoundPage/index.ts new file mode 100644 index 000000000..df151ffeb --- /dev/null +++ b/src/components/NotFoundPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./NotFoundPage"; +export * from "./NotFoundPage"; diff --git a/src/components/PageHeader/PageHeader.tsx b/src/components/PageHeader/PageHeader.tsx new file mode 100644 index 000000000..8c20e8186 --- /dev/null +++ b/src/components/PageHeader/PageHeader.tsx @@ -0,0 +1,43 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import ExtendedPageHeader from "../ExtendedPageHeader"; +import Skeleton from "../Skeleton"; + +const styles = (theme: Theme) => + createStyles({ + title: { + flex: 1, + fontSize: 24, + paddingBottom: theme.spacing.unit * 2 + } + }); + +interface PageHeaderProps extends WithStyles { + children?: React.ReactNode; + className?: string; + title?: string; +} + +const PageHeader = withStyles(styles)( + ({ children, classes, className, title }: PageHeaderProps) => ( + + {title !== undefined ? title : } + + } + > + {children} + + ) +); +PageHeader.displayName = "PageHeader"; +export default PageHeader; diff --git a/src/components/PageHeader/index.ts b/src/components/PageHeader/index.ts new file mode 100644 index 000000000..fbf397de4 --- /dev/null +++ b/src/components/PageHeader/index.ts @@ -0,0 +1,2 @@ +export { default } from "./PageHeader"; +export * from "./PageHeader"; diff --git a/src/components/Percent/Percent.tsx b/src/components/Percent/Percent.tsx new file mode 100644 index 000000000..dc34ff8a9 --- /dev/null +++ b/src/components/Percent/Percent.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; + +import { LocaleConsumer } from "../Locale"; + +interface PercentProps { + amount: number; +} + +const Percent: React.StatelessComponent = ({ amount }) => ( + + {locale => { + return (amount / 100).toLocaleString(locale, { + maximumFractionDigits: 2, + style: "percent" + }); + }} + +); +Percent.displayName = "Percent"; +export default Percent; diff --git a/src/components/Percent/index.ts b/src/components/Percent/index.ts new file mode 100644 index 000000000..7c1ab1d74 --- /dev/null +++ b/src/components/Percent/index.ts @@ -0,0 +1,2 @@ +export { default } from "./Percent"; +export * from "./Percent"; diff --git a/src/components/PhoneField/PhoneField.tsx b/src/components/PhoneField/PhoneField.tsx new file mode 100644 index 000000000..800b8affb --- /dev/null +++ b/src/components/PhoneField/PhoneField.tsx @@ -0,0 +1,58 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import SingleSelectField from "@saleor/components/SingleSelectField"; + +const styles = (theme: Theme) => + createStyles({ + root: { + display: "grid", + gridColumnGap: `${theme.spacing.unit * 2}px`, + gridTemplateColumns: "5rem 1fr" + } + }); + +interface PhoneFieldProps extends WithStyles { + name: string; + prefix: string; + number: string; + prefixes: string[]; + label?: string; + onChange(event: React.ChangeEvent); +} + +const PhoneField = withStyles(styles, { name: "PhoneField" })( + ({ + classes, + name, + number: phoneNumber, + prefix, + prefixes, + label, + onChange + }: PhoneFieldProps) => ( +
    + ({ label: "+" + p, value: p }))} + onChange={onChange} + value={prefix} + label={label} + /> + +
    + ) +); +PhoneField.displayName = "PhoneField"; +export default PhoneField; diff --git a/src/components/PhoneField/index.ts b/src/components/PhoneField/index.ts new file mode 100644 index 000000000..2f53bef78 --- /dev/null +++ b/src/components/PhoneField/index.ts @@ -0,0 +1,2 @@ +export { default } from "./PhoneField"; +export * from "./PhoneField"; diff --git a/src/components/PriceField/PriceField.tsx b/src/components/PriceField/PriceField.tsx new file mode 100644 index 000000000..684da90e2 --- /dev/null +++ b/src/components/PriceField/PriceField.tsx @@ -0,0 +1,90 @@ +import { InputProps } from "@material-ui/core/Input"; +import InputAdornment from "@material-ui/core/InputAdornment"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + currencySymbol: { + fontSize: "0.875rem" + }, + inputContainer: { + display: "grid", + gridTemplateColumns: "1fr 2rem 1fr" + }, + pullDown: { + marginTop: theme.spacing.unit * 2 + }, + separator: { + marginTop: theme.spacing.unit * 3, + textAlign: "center", + width: "100%" + }, + widgetContainer: { + marginTop: theme.spacing.unit * 2 + } + }); + +interface PriceFieldProps extends WithStyles { + className?: string; + currencySymbol?: string; + disabled?: boolean; + error?: boolean; + hint?: string; + label?: string; + name?: string; + value?: string | number; + InputProps?: InputProps; + onChange(event: any); +} + +export const PriceField = withStyles(styles, { name: "PriceField" })( + ({ + className, + disabled, + error, + label, + hint, + currencySymbol, + name, + classes, + onChange, + value, + InputProps + }: PriceFieldProps) => ( + + {currencySymbol} + + ) : ( + + ), + type: "number" + }} + name={name} + disabled={disabled} + onChange={onChange} + /> + ) +); +PriceField.defaultProps = { + name: "price" +}; + +PriceField.displayName = "PriceField"; +export default PriceField; diff --git a/src/components/PriceField/index.ts b/src/components/PriceField/index.ts new file mode 100644 index 000000000..17b4249c5 --- /dev/null +++ b/src/components/PriceField/index.ts @@ -0,0 +1,2 @@ +export { default } from "./PriceField"; +export * from "./PriceField"; diff --git a/src/components/ProductList/ProductList.tsx b/src/components/ProductList/ProductList.tsx new file mode 100644 index 000000000..4b760b0d5 --- /dev/null +++ b/src/components/ProductList/ProductList.tsx @@ -0,0 +1,194 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import { CategoryDetails_category_products_edges_node } from "../../categories/types/CategoryDetails"; +import i18n from "../../i18n"; +import { maybe, renderCollection } from "../../misc"; +import { ListActions, ListProps } from "../../types"; +import Checkbox from "../Checkbox"; +import Money from "../Money"; +import Skeleton from "../Skeleton"; +import StatusLabel from "../StatusLabel"; +import TableHead from "../TableHead"; +import TablePagination from "../TablePagination"; + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colName: { + width: 430 + }, + colPrice: { + width: 200 + }, + colPublished: { + width: 200 + }, + colType: { + width: 200 + } + }, + avatarCell: { + paddingLeft: theme.spacing.unit * 2, + paddingRight: 0, + width: theme.spacing.unit * 5 + }, + colName: {}, + colPrice: { + textAlign: "right" + }, + colPublished: {}, + colType: {}, + link: { + cursor: "pointer" + }, + textLeft: { + textAlign: "left" + }, + textRight: { + textAlign: "right" + } + }); + +interface ProductListProps + extends ListProps, + ListActions, + WithStyles { + products: CategoryDetails_category_products_edges_node[]; +} + +export const ProductList = withStyles(styles, { name: "ProductList" })( + ({ + classes, + disabled, + isChecked, + pageInfo, + products, + selected, + toggle, + toggleAll, + toolbar, + onNextPage, + onPreviousPage, + onRowClick + }: ProductListProps) => ( + + + + + {i18n.t("Name", { context: "object" })} + + + {i18n.t("Type", { context: "object" })} + + + {i18n.t("Published", { context: "object" })} + + + {i18n.t("Price", { context: "object" })} + + + + + + + + + {renderCollection( + products, + product => { + const isSelected = product ? isChecked(product.id) : false; + + return ( + + + toggle(product.id)} + /> + + product.thumbnail.url)} + /> + + {product ? product.name : } + + + {product && product.productType ? ( + product.productType.name + ) : ( + + )} + + + {product && maybe(() => product.isAvailable !== undefined) ? ( + + ) : ( + + )} + + + {maybe(() => product.basePrice) && + maybe(() => product.basePrice.amount) !== undefined && + maybe(() => product.basePrice.currency) !== undefined ? ( + + ) : ( + + )} + + + ); + }, + () => ( + + {i18n.t("No products found")} + + ) + )} + +
    + ) +); +ProductList.displayName = "ProductList"; +export default ProductList; diff --git a/src/components/ProductList/index.ts b/src/components/ProductList/index.ts new file mode 100644 index 000000000..17fd4319e --- /dev/null +++ b/src/components/ProductList/index.ts @@ -0,0 +1 @@ +export { default } from "./ProductList"; diff --git a/src/components/RichTextEditor/ImageEntity.tsx b/src/components/RichTextEditor/ImageEntity.tsx new file mode 100644 index 000000000..b676114a5 --- /dev/null +++ b/src/components/RichTextEditor/ImageEntity.tsx @@ -0,0 +1,112 @@ +import Button from "@material-ui/core/Button"; +import ClickAwayListener from "@material-ui/core/ClickAwayListener"; +import Grow from "@material-ui/core/Grow"; +import IconButton from "@material-ui/core/IconButton"; +import Paper from "@material-ui/core/Paper"; +import Popper from "@material-ui/core/Popper"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import DeleteIcon from "@material-ui/icons/Delete"; +import { ContentState } from "draft-js"; +import * as React from "react"; + +import i18n from "../../i18n"; + +interface ImageEntityProps { + children: React.ReactNode; + contentState: ContentState; + entityKey: string; + onEdit: (entityKey: string) => void; + onRemove: (entityKey: string) => void; +} + +const styles = (theme: Theme) => + createStyles({ + anchor: { + display: "inline-block" + }, + container: { + alignItems: "center", + display: "flex" + }, + image: { maxWidth: "100%" }, + inline: { + display: "inline-block" + }, + root: { + alignItems: "center", + display: "flex", + minHeight: 72, + padding: theme.spacing.unit * 1.5 + } + }); + +const ImageEntity = withStyles(styles, { + name: "ImageEntity" +})( + ({ + classes, + contentState, + entityKey, + onEdit, + onRemove + }: ImageEntityProps & WithStyles) => { + const [isOpened, setOpenStatus] = React.useState(false); + const anchor = React.useRef(); + + const disable = () => setOpenStatus(false); + const toggle = () => setOpenStatus(!isOpened); + + return ( + <> +
    + + {({ TransitionProps, placement }) => ( + + + +
    + + onRemove(entityKey)}> + + +
    +
    +
    +
    + )} +
    +
    + + + ); + } +); +export default ImageEntity; diff --git a/src/components/RichTextEditor/ImageSource.tsx b/src/components/RichTextEditor/ImageSource.tsx new file mode 100644 index 000000000..698c846ab --- /dev/null +++ b/src/components/RichTextEditor/ImageSource.tsx @@ -0,0 +1,100 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import TextField from "@material-ui/core/TextField"; +import { AtomicBlockUtils, EditorState, EntityInstance } from "draft-js"; +import * as React from "react"; + +import i18n from "../../i18n"; +import Form from "../Form"; + +interface ImageSourceProps { + editorState: EditorState; + entity?: EntityInstance; + entityKey?: string; + entityType: { + type: string; + }; + onComplete: (updateState: EditorState) => void; + onClose: () => void; +} + +class ImageSource extends React.Component { + submit = (href: string) => { + const { + editorState, + entity, + entityKey, + entityType, + onComplete + } = this.props; + + if (href) { + const content = editorState.getCurrentContent(); + if (entity) { + const nextContent = content.mergeEntityData(entityKey, { href }); + const nextState = EditorState.push( + editorState, + nextContent, + "apply-entity" + ); + onComplete(nextState); + } else { + const contentWithEntity = content.createEntity( + entityType.type, + "IMMUTABLE", + { href } + ); + const nextState = AtomicBlockUtils.insertAtomicBlock( + editorState, + contentWithEntity.getLastCreatedEntityKey(), + " " + ); + + onComplete(nextState); + } + } else { + onComplete(editorState); + } + }; + + render() { + const { entity, onClose } = this.props; + const initial = entity ? entity.getData().href : ""; + + return ( + +
    this.submit(href)} + > + {({ data, change, submit }) => ( + <> + {i18n.t("Add Image Link")} + + + + + + + + + )} +
    +
    + ); + } +} +export default ImageSource; diff --git a/src/components/RichTextEditor/LinkEntity.tsx b/src/components/RichTextEditor/LinkEntity.tsx new file mode 100644 index 000000000..c84c205da --- /dev/null +++ b/src/components/RichTextEditor/LinkEntity.tsx @@ -0,0 +1,132 @@ +import Button from "@material-ui/core/Button"; +import ClickAwayListener from "@material-ui/core/ClickAwayListener"; +import Grow from "@material-ui/core/Grow"; +import IconButton from "@material-ui/core/IconButton"; +import Paper from "@material-ui/core/Paper"; +import Popper from "@material-ui/core/Popper"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import DeleteIcon from "@material-ui/icons/Delete"; +import { ContentState } from "draft-js"; +import * as React from "react"; + +import i18n from "../../i18n"; +import Link from "../Link"; + +interface LinkEntityProps { + children: React.ReactNode; + contentState: ContentState; + entityKey: string; + onEdit: (entityKey: string) => void; + onRemove: (entityKey: string) => void; +} + +const styles = (theme: Theme) => + createStyles({ + anchor: { + display: "inline-block" + }, + container: { + alignItems: "center", + display: "flex" + }, + inline: { + display: "inline-block" + }, + popover: { + zIndex: 1 + }, + root: { + alignItems: "center", + display: "flex", + minHeight: 72, + padding: `${theme.spacing.unit * 1.5}px ${theme.spacing.unit * + 1.5}px ${theme.spacing.unit * 1.5}px ${theme.spacing.unit * 3}px` + }, + separator: { + backgroundColor: theme.palette.grey[300], + display: "inline-block", + height: 30, + marginLeft: theme.spacing.unit * 2, + marginRight: theme.spacing.unit, + width: 1 + } + }); + +const LinkEntity = withStyles(styles, { + name: "LinkEntity" +})( + ({ + classes, + children, + contentState, + entityKey, + onEdit, + onRemove + }: LinkEntityProps & WithStyles) => { + const [isOpened, setOpenStatus] = React.useState(false); + const anchor = React.useRef(); + + const disable = () => setOpenStatus(false); + const toggle = () => setOpenStatus(!isOpened); + + return ( + <> +
    + + {({ TransitionProps, placement }) => ( + + + +
    + + {contentState.getEntity(entityKey).getData().url} + + + + onRemove(entityKey)}> + + +
    +
    +
    +
    + )} +
    +
    + + {children} + + + ); + } +); +export default LinkEntity; diff --git a/src/components/RichTextEditor/LinkSource.tsx b/src/components/RichTextEditor/LinkSource.tsx new file mode 100644 index 000000000..3b639fc9a --- /dev/null +++ b/src/components/RichTextEditor/LinkSource.tsx @@ -0,0 +1,87 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import TextField from "@material-ui/core/TextField"; +import { EditorState, EntityInstance, RichUtils } from "draft-js"; +import * as React from "react"; + +import i18n from "../../i18n"; +import Form from "../Form"; + +interface LinkSourceProps { + editorState: EditorState; + entity?: EntityInstance; + entityType: { + type: string; + }; + onComplete: (updateState: EditorState) => void; + onClose: () => void; +} + +class LinkSource extends React.Component { + submit = (url: string) => { + const { editorState, entityType, onComplete } = this.props; + + if (url) { + const content = editorState.getCurrentContent(); + const contentWithEntity = content.createEntity( + entityType.type, + "MUTABLE", + { url } + ); + const entityKey = contentWithEntity.getLastCreatedEntityKey(); + const newEditorState = EditorState.set(editorState, { + currentContent: contentWithEntity + }); + const nextState = RichUtils.toggleLink( + newEditorState, + newEditorState.getSelection(), + entityKey + ); + + onComplete(nextState); + } else { + onComplete(editorState); + } + }; + + render() { + const { entity, onClose } = this.props; + const initial = entity ? entity.getData().url : ""; + + return ( + +
    this.submit(url)} + > + {({ data, change, submit }) => ( + <> + {i18n.t("Add or Edit Link")} + + + + + + + + + )} +
    +
    + ); + } +} +export default LinkSource; diff --git a/src/components/RichTextEditor/RichTextEditor.tsx b/src/components/RichTextEditor/RichTextEditor.tsx new file mode 100644 index 000000000..d9a650191 --- /dev/null +++ b/src/components/RichTextEditor/RichTextEditor.tsx @@ -0,0 +1,343 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import { fade } from "@material-ui/core/styles/colorManipulator"; +import Typography from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import { RawDraftContentState } from "draft-js"; +import { + BLOCK_TYPE, + DraftailEditor, + ENTITY_TYPE, + INLINE_STYLE +} from "draftail"; +import * as React from "react"; + +import BoldIcon from "../../icons/BoldIcon"; +import HeaderOne from "../../icons/HeaderOne"; +import HeaderThree from "../../icons/HeaderThree"; +import HeaderTwo from "../../icons/HeaderTwo"; +import ItalicIcon from "../../icons/ItalicIcon"; +import LinkIcon from "../../icons/LinkIcon"; +import OrderedListIcon from "../../icons/OrderedListIcon"; +import QuotationIcon from "../../icons/QuotationIcon"; +import StrikethroughIcon from "../../icons/StrikethroughIcon"; +import UnorderedListIcon from "../../icons/UnorderedListIcon"; + +// import ImageEntity from "./ImageEntity"; +// import ImageSource from "./ImageSource"; +import LinkEntity from "./LinkEntity"; +import LinkSource from "./LinkSource"; + +export interface RichTextEditorProps { + disabled: boolean; + error: boolean; + helperText: string; + label: string; + name: string; + scroll?: boolean; + initial?: RawDraftContentState; + onChange: (event: React.ChangeEvent) => void; +} + +const styles = (theme: Theme) => + createStyles({ + "@keyframes focus": { + from: { + transform: "scaleX(0) scaleY(1)" + }, + to: { + transform: "scaleX(1) scaleY(1)" + } + }, + "@keyframes hover": { + from: { + transform: "scaleX(1) scaleY(0)" + }, + to: { + transform: "scaleX(1) scaleY(1)" + } + }, + error: { + color: theme.palette.error.main + }, + helperText: { + marginTop: theme.spacing.unit * 0.75 + }, + input: { + "&:hover": { + borderBottomColor: theme.palette.primary.main + }, + backgroundColor: theme.overrides.MuiFilledInput.root.backgroundColor, + borderBottom: `1px rgba(0, 0, 0, 0) solid`, + borderTopLeftRadius: 4, + borderTopRightRadius: 4, + padding: "27px 12px 10px", + position: "relative", + transition: theme.transitions.duration.shortest + "ms" + }, + label: { + fontSize: theme.typography.caption.fontSize, + marginBottom: theme.spacing.unit * 2, + marginTop: -21 + }, + linkIcon: { + marginTop: 2 + }, + root: { + "& .DraftEditor": { + "&-editorContainer": { + "& .public-DraftEditor-content": { + lineHeight: 1.62 + }, + "& a": { + color: theme.palette.primary.light + }, + "&:after": { + animationDuration: theme.transitions.duration.shortest + "ms", + animationFillMode: "both", + background: theme.palette.getContrastText( + theme.palette.background.default + ), + bottom: -11, + content: "''", + display: "block", + height: 2, + left: -12, + position: "absolute", + transform: "scaleX(0) scaleY(0)", + width: "calc(100% + 24px)" + }, + position: "relative" + }, + "&-root": { + ...theme.typography.body2 + } + }, + "& .Draftail": { + "&-Editor": { + "&--focus": { + "& .DraftEditor": { + "&-editorContainer": { + "&:after": { + animationName: "focus !important", + background: theme.palette.primary.main, + transform: "scaleX(0) scaleY(1)" + } + } + } + } + }, + "&-Toolbar": { + "&Button": { + "& svg": { + padding: 2 + }, + "&--active": { + "&:hover": { + background: theme.palette.primary.main + }, + "&:not(:hover)": { + borderRightColor: theme.palette.primary.main + }, + background: theme.palette.primary.main + }, + "&:focus": { + "&:active": { + "&:after": { + background: fade(theme.palette.primary.main, 0.3), + borderRadius: "100%", + content: "''", + display: "block", + height: "100%", + width: "100%" + } + } + }, + "&:hover": { + background: fade(theme.palette.primary.main, 0.3) + }, + alignItems: "center", + background: "none", + border: "none", + borderRight: `1px ${ + theme.overrides.MuiCard.root.borderColor + } solid`, + color: theme.typography.body2.color, + cursor: "pointer", + display: "inline-flex", + height: 36, + justifyContent: "center", + padding: theme.spacing.unit + 2, + transition: theme.transitions.duration.short + "ms", + width: 36 + }, + "&Group": { + "&:last-of-type": { + "& .Draftail-ToolbarButton": { + "&:last-of-type": { + border: "none" + } + } + }, + display: "flex" + }, + background: theme.palette.background.default, + border: `1px ${theme.overrides.MuiCard.root.borderColor} solid`, + display: "inline-flex", + flexWrap: "wrap", + marginBottom: theme.spacing.unit, + [theme.breakpoints.down(460)]: { + width: "min-content" + } + }, + "&-block": { + "&--blockquote": { + borderLeft: `2px solid ${theme.overrides.MuiCard.root.borderColor}`, + margin: 0, + padding: `${theme.spacing.unit}px ${theme.spacing.unit * 2}px` + } + } + }, + "&$error": { + "& .Draftail": { + "&-Editor": { + "& .DraftEditor": { + "&-editorContainer": { + "&:after": { + animationName: "none", + background: theme.palette.error.main, + transform: "scaleX(1) scaleY(1)" + } + } + }, + "&--focus": { + "& .DraftEditor": { + "&-editorContainer": { + "&:after": { + animationName: "none !important" + } + } + } + } + } + } + } + }, + scroll: { + "& .DraftEditor": { + "&-editorContainer": { + "& .public-DraftEditor-content": { + lineHeight: 1.62 + } + } + } + }, + smallIcon: { + marginLeft: 10 + } + }); +const RichTextEditor = withStyles(styles, { name: "RichTextEditor" })( + ({ + classes, + error, + helperText, + initial, + label, + name, + scroll, + onChange + }: RichTextEditorProps & WithStyles) => ( +
    +
    + + {label} + + 0 ? initial : null + } + onSave={value => + onChange({ + target: { + name, + value + } + } as any) + } + blockTypes={[ + { + icon: , + type: BLOCK_TYPE.HEADER_ONE + }, + { icon: , type: BLOCK_TYPE.HEADER_TWO }, + { icon: , type: BLOCK_TYPE.HEADER_THREE }, + { icon: , type: BLOCK_TYPE.BLOCKQUOTE }, + { + icon: , + type: BLOCK_TYPE.UNORDERED_LIST_ITEM + }, + { icon: , type: BLOCK_TYPE.ORDERED_LIST_ITEM } + ]} + inlineStyles={[ + { + icon: , + type: INLINE_STYLE.BOLD + }, + { + icon: , + type: INLINE_STYLE.ITALIC + }, + { + icon: , + type: INLINE_STYLE.STRIKETHROUGH + } + ]} + enableLineBreak + entityTypes={[ + { + attributes: ["url"], + decorator: LinkEntity, + icon: , + source: LinkSource, + type: ENTITY_TYPE.LINK + } + // { + // attributes: ["href"], + // decorator: ImageEntity, + // icon: , + // source: ImageSource, + // type: ENTITY_TYPE.IMAGE + // } + ]} + /> +
    + {helperText && ( + + {helperText} + + )} +
    + ) +); +RichTextEditor.displayName = "RichTextEditor"; +RichTextEditor.defaultProps = { + scroll: true +}; +export default RichTextEditor; diff --git a/src/components/RichTextEditor/index.ts b/src/components/RichTextEditor/index.ts new file mode 100644 index 000000000..2a07ed090 --- /dev/null +++ b/src/components/RichTextEditor/index.ts @@ -0,0 +1,2 @@ +export { default } from './RichTextEditor'; +export * from './RichTextEditor'; \ No newline at end of file diff --git a/src/components/SaveButtonBar/SaveButtonBar.tsx b/src/components/SaveButtonBar/SaveButtonBar.tsx new file mode 100644 index 000000000..4fb7a8bfc --- /dev/null +++ b/src/components/SaveButtonBar/SaveButtonBar.tsx @@ -0,0 +1,147 @@ +import Button from "@material-ui/core/Button"; +import Portal from "@material-ui/core/Portal"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import classNames from "classnames"; +import * as React from "react"; + +import useScroll from "@saleor/hooks/useScroll"; +import i18n from "../../i18n"; +import { maybe } from "../../misc"; +import AppActionContext from "../AppLayout/AppActionContext"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "../ConfirmButton/ConfirmButton"; +import Container from "../Container"; + +const styles = (theme: Theme) => + createStyles({ + button: { + marginRight: theme.spacing.unit + }, + cancelButton: { + marginRight: theme.spacing.unit * 2 + }, + container: { + display: "flex", + paddingBottom: theme.spacing.unit * 2, + paddingTop: theme.spacing.unit * 2, + [theme.breakpoints.down("sm")]: { + marginTop: theme.spacing.unit + } + }, + deleteButton: { + "&:hover": { + backgroundColor: theme.palette.error.dark + }, + backgroundColor: theme.palette.error.main, + color: theme.palette.error.contrastText + }, + root: { + background: theme.palette.background.default, + borderTop: "1px solid transparent", + boxShadow: `0 -5px 5px 0 ${theme.overrides.MuiCard.root.borderColor}`, + transition: `box-shadow ${theme.transitions.duration.shortest}ms` + }, + spacer: { + flex: "1" + }, + stop: { + "&$root": { + borderTopColor: theme.overrides.MuiCard.root.borderColor, + boxShadow: `0 0 0 0 ${theme.overrides.MuiCard.root.borderColor}` + } + } + }); + +interface SaveButtonBarProps extends WithStyles { + disabled: boolean; + state: ConfirmButtonTransitionState; + labels?: { + cancel?: string; + delete?: string; + save?: string; + }; + onCancel: () => void; + onDelete?: () => void; + onSave(event: any); +} + +export const SaveButtonBar = withStyles(styles, { name: "SaveButtonBar" })( + ({ + classes, + disabled, + labels, + state, + onCancel, + onDelete, + onSave, + ...props + }: SaveButtonBarProps) => { + const scrollPosition = useScroll(); + const scrolledToBottom = + scrollPosition.y + window.innerHeight >= document.body.scrollHeight; + + return ( + + {anchor => + anchor ? ( + +
    + + {!!onDelete && ( + + )} +
    + + + {maybe( + () => labels.save, + i18n.t("Save", { + context: "button" + }) + )} + + +
    + + ) : null + } + + ); + } +); +SaveButtonBar.displayName = "SaveButtonBar"; +export default SaveButtonBar; diff --git a/src/components/SaveButtonBar/index.ts b/src/components/SaveButtonBar/index.ts new file mode 100644 index 000000000..edc3e6397 --- /dev/null +++ b/src/components/SaveButtonBar/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SaveButtonBar"; +export * from "./SaveButtonBar"; diff --git a/src/components/SaveFilterTabDialog/SaveFilterTabDialog.tsx b/src/components/SaveFilterTabDialog/SaveFilterTabDialog.tsx new file mode 100644 index 000000000..0b257873d --- /dev/null +++ b/src/components/SaveFilterTabDialog/SaveFilterTabDialog.tsx @@ -0,0 +1,87 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import i18n from "../../i18n"; +import ConfirmButton, { ConfirmButtonTransitionState } from "../ConfirmButton"; +import Form from "../Form"; + +export interface SaveFilterTabDialogFormData { + name: string; +} + +const initialForm: SaveFilterTabDialogFormData = { + name: "" +}; + +export interface SaveFilterTabDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + onClose: () => void; + onSubmit: (data: SaveFilterTabDialogFormData) => void; +} + +const SaveFilterTabDialog: React.FC = ({ + confirmButtonState, + onClose, + onSubmit, + open +}) => { + const [errors, setErrors] = React.useState(false); + const handleErrors = data => { + if (data.name.length) { + onSubmit(data); + setErrors(false); + } else { + setErrors(true); + } + }; + + return ( + + + {i18n.t("Save Custom Search", { + context: "save filter tab" + })} + +
    + {({ change, data, submit }) => ( + <> + + + + + + + {i18n.t("Save")} + + + + )} +
    +
    + ); +}; +SaveFilterTabDialog.displayName = "SaveFilterTabDialog"; +export default SaveFilterTabDialog; diff --git a/src/components/SaveFilterTabDialog/index.ts b/src/components/SaveFilterTabDialog/index.ts new file mode 100644 index 000000000..8b281bdd2 --- /dev/null +++ b/src/components/SaveFilterTabDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from './SaveFilterTabDialog'; +export * from './SaveFilterTabDialog'; \ No newline at end of file diff --git a/src/components/SeoForm/SeoForm.tsx b/src/components/SeoForm/SeoForm.tsx new file mode 100644 index 000000000..c4af34cdc --- /dev/null +++ b/src/components/SeoForm/SeoForm.tsx @@ -0,0 +1,177 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import * as React from "react"; + +import i18n from "../../i18n"; +import CardTitle from "../CardTitle"; +import FormSpacer from "../FormSpacer"; + +const styles = (theme: Theme) => + createStyles({ + addressBar: { + color: "#006621", + fontSize: "13px", + lineHeight: "16px", + marginBottom: "2px", + overflow: "hidden", + textOverflow: "ellipsis", + whiteSpace: "nowrap" + }, + container: { + width: "100%" + }, + descriptionBar: { + color: "#545454", + fontSize: "13px", + lineHeight: "18px", + overflowWrap: "break-word" + }, + helperText: { + marginBottom: theme.spacing.unit * 3 + }, + label: { + flex: 1 + }, + labelContainer: { + display: "flex" + }, + preview: { + minHeight: theme.spacing.unit * 10 + }, + title: { + padding: 0 + }, + titleBar: { + color: "#1a0dab", + fontSize: "18px", + lineHeight: "21px", + overflowWrap: "break-word", + textDecoration: "none", + wordWrap: "break-word" + } + }); + +interface SeoFormProps extends WithStyles { + description?: string; + descriptionPlaceholder: string; + disabled?: boolean; + loading?: boolean; + helperText?: string; + title: string; + titlePlaceholder: string; + onChange(event: any); + onClick?(); +} + +const SeoForm = withStyles(styles, { name: "SeoForm" })( + ({ + classes, + description, + descriptionPlaceholder, + disabled, + helperText, + loading, + title, + titlePlaceholder, + onChange + }: SeoFormProps) => { + const [expanded, setExpansionStatus] = React.useState(false); + const toggleExpansion = () => setExpansionStatus(!expanded); + + return ( + + + {i18n.t("Edit website SEO")} + + } + /> + + {helperText && ( + + {helperText} + + )} + {expanded && ( +
    + +
    + {i18n.t("Search engine title")} +
    + + {i18n.t("{{ letters }} of {{ maxLetters }} characters", { + letters: title.length, + maxLetters: 70 + })} + +
    + } + helperText={i18n.t( + "If empty, the preview shows what will be autogenerated." + )} + value={title.slice(0, 69)} + disabled={loading || disabled} + InputLabelProps={{ shrink: true }} + placeholder={titlePlaceholder} + onChange={onChange} + fullWidth + /> + + +
    + {i18n.t("Search engine description")} +
    + + {i18n.t("{{ letters }} of {{ maxLetters }} characters", { + letters: description.length, + maxLetters: 300 + })} + +
    + } + helperText={i18n.t( + "If empty, the preview shows what will be autogenerated." + )} + value={description ? description.slice(0, 299) : undefined} + onChange={onChange} + disabled={loading || disabled} + fullWidth + multiline + placeholder={descriptionPlaceholder} + InputLabelProps={{ shrink: true }} + rows={10} + /> +
    + )} + + + ); + } +); +SeoForm.displayName = "SeoForm"; +SeoForm.defaultProps = { + helperText: i18n.t( + "Add search engine title and description to make this product easier to find" + ) +}; +export default SeoForm; diff --git a/src/components/SeoForm/index.ts b/src/components/SeoForm/index.ts new file mode 100644 index 000000000..1f1393243 --- /dev/null +++ b/src/components/SeoForm/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SeoForm"; +export * from "./SeoForm"; diff --git a/src/components/Shop/index.tsx b/src/components/Shop/index.tsx new file mode 100644 index 000000000..1c3a017c2 --- /dev/null +++ b/src/components/Shop/index.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; + +import { TypedShopInfoQuery } from "./query"; +import { ShopInfo_shop } from "./types/ShopInfo"; + +type ShopContext = ShopInfo_shop; + +export const shopContext = React.createContext(undefined); + +export const ShopProvider: React.StatelessComponent<{}> = ({ children }) => ( + + {({ data }) => ( + + {children} + + )} + +); +export const Shop = shopContext.Consumer; +export default Shop; diff --git a/src/components/Shop/query.ts b/src/components/Shop/query.ts new file mode 100644 index 000000000..b67e048bb --- /dev/null +++ b/src/components/Shop/query.ts @@ -0,0 +1,34 @@ +import gql from "graphql-tag"; + +import { TypedQuery } from "../../queries"; +import { ShopInfo } from "./types/ShopInfo"; + +const shopInfo = gql` + query ShopInfo { + shop { + countries { + country + code + } + defaultCountry { + code + country + } + defaultCurrency + defaultWeightUnit + displayGrossPrices + domain { + host + url + } + languages { + code + language + } + includeTaxesInPrices + name + trackInventoryByDefault + } + } +`; +export const TypedShopInfoQuery = TypedQuery(shopInfo); diff --git a/src/components/Shop/types/ShopInfo.ts b/src/components/Shop/types/ShopInfo.ts new file mode 100644 index 000000000..b3b4fa6d7 --- /dev/null +++ b/src/components/Shop/types/ShopInfo.ts @@ -0,0 +1,51 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { WeightUnitsEnum, LanguageCodeEnum } from "./../../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: ShopInfo +// ==================================================== + +export interface ShopInfo_shop_countries { + __typename: "CountryDisplay"; + country: string; + code: string; +} + +export interface ShopInfo_shop_defaultCountry { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ShopInfo_shop_domain { + __typename: "Domain"; + host: string; + url: string; +} + +export interface ShopInfo_shop_languages { + __typename: "LanguageDisplay"; + code: LanguageCodeEnum; + language: string; +} + +export interface ShopInfo_shop { + __typename: "Shop"; + countries: (ShopInfo_shop_countries | null)[]; + defaultCountry: ShopInfo_shop_defaultCountry | null; + defaultCurrency: string; + defaultWeightUnit: WeightUnitsEnum | null; + displayGrossPrices: boolean; + domain: ShopInfo_shop_domain; + languages: (ShopInfo_shop_languages | null)[]; + includeTaxesInPrices: boolean; + name: string; + trackInventoryByDefault: boolean | null; +} + +export interface ShopInfo { + shop: ShopInfo_shop | null; +} diff --git a/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx new file mode 100644 index 000000000..3d798cf65 --- /dev/null +++ b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx @@ -0,0 +1,223 @@ +import { Omit } from "@material-ui/core"; +import { InputProps } from "@material-ui/core/Input"; +import MenuItem from "@material-ui/core/MenuItem"; +import Paper from "@material-ui/core/Paper"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Downshift from "downshift"; +import * as React from "react"; +import { compareTwoStrings } from "string-similarity"; + +import i18n from "../../i18n"; +import ArrowDropdownIcon from "../../icons/ArrowDropdown"; +import Debounce, { DebounceProps } from "../Debounce"; + +const styles = (theme: Theme) => + createStyles({ + container: { + flexGrow: 1, + position: "relative" + }, + paper: { + borderRadius: 4, + left: 0, + marginTop: theme.spacing.unit, + padding: 8, + position: "absolute", + right: 0, + zIndex: 2 + } + }); + +export interface SingleAutocompleteSelectFieldProps { + error?: boolean; + name: string; + choices: Array<{ + label: string; + value: any; + }>; + value?: { + label: string; + value: any; + }; + disabled?: boolean; + loading?: boolean; + placeholder?: string; + custom?: boolean; + helperText?: string; + label?: string; + InputProps?: InputProps; + fetchChoices?(value: string); + onChange(event); +} + +interface SingleAutocompleteSelectFieldState { + choices: Array<{ + label: string; + value: string; + }>; +} + +const DebounceAutocomplete: React.ComponentType< + DebounceProps +> = Debounce; + +const SingleAutocompleteSelectFieldComponent = withStyles(styles, { + name: "SingleAutocompleteSelectField" +})( + ({ + choices, + classes, + custom, + disabled, + error, + helperText, + label, + loading, + name, + placeholder, + value, + InputProps, + fetchChoices, + onChange + }: SingleAutocompleteSelectFieldProps & WithStyles) => { + const handleChange = item => onChange({ target: { name, value: item } }); + + return ( + + {debounceFn => ( + (item ? item.label : "")} + onSelect={handleChange} + onInputValueChange={value => debounceFn(value)} + > + {({ + getInputProps, + getItemProps, + isOpen, + inputValue, + selectedItem, + toggleMenu, + openMenu, + closeMenu, + highlightedIndex + }) => { + const isCustom = + choices && selectedItem + ? choices.filter(c => c.value === selectedItem.value) + .length === 0 + : false; + return ( +
    + + ), + error, + id: undefined, + onBlur: closeMenu, + onFocus: openMenu + }} + disabled={disabled} + helperText={helperText} + label={label} + fullWidth={true} + /> + {isOpen && ( + + {loading ? ( + + {i18n.t("Loading...")} + + ) : choices.length > 0 || custom ? ( + <> + {choices.map((suggestion, index) => ( + + {suggestion.label} + + ))} + {custom && ( + + {i18n.t("Add custom value")} + + )} + + ) : ( + + {i18n.t("No results found")} + + )} + + )} +
    + ); + }} +
    + )} +
    + ); + } +); + +export class SingleAutocompleteSelectField extends React.Component< + Omit, + SingleAutocompleteSelectFieldState +> { + state = { choices: this.props.choices }; + + handleInputChange = (value: string) => + this.setState((_, props) => ({ + choices: props.choices + .sort((a, b) => { + const ratingA = compareTwoStrings(value || "", a.label); + const ratingB = compareTwoStrings(value || "", b.label); + if (ratingA > ratingB) { + return -1; + } + if (ratingA < ratingB) { + return 1; + } + return 0; + }) + .slice(0, 5) + })); + + render() { + if (!!this.props.fetchChoices) { + return ; + } + return ( + + ); + } +} +export default SingleAutocompleteSelectField; diff --git a/src/components/SingleAutocompleteSelectField/index.ts b/src/components/SingleAutocompleteSelectField/index.ts new file mode 100644 index 000000000..c1cdf064d --- /dev/null +++ b/src/components/SingleAutocompleteSelectField/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SingleAutocompleteSelectField"; +export * from "./SingleAutocompleteSelectField"; diff --git a/src/components/SingleSelectField/SingleSelectField.tsx b/src/components/SingleSelectField/SingleSelectField.tsx new file mode 100644 index 000000000..695c29784 --- /dev/null +++ b/src/components/SingleSelectField/SingleSelectField.tsx @@ -0,0 +1,95 @@ +import FilledInput from "@material-ui/core/FilledInput"; +import FormControl from "@material-ui/core/FormControl"; +import FormHelperText from "@material-ui/core/FormHelperText"; +import InputLabel from "@material-ui/core/InputLabel"; +import MenuItem from "@material-ui/core/MenuItem"; +import Select, { SelectProps } from "@material-ui/core/Select"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import classNames from "classnames"; +import * as React from "react"; + +import i18n from "../../i18n"; + +const styles = createStyles({ + formControl: { + width: "100%" + } +}); + +interface SingleSelectFieldProps extends WithStyles { + choices: Array<{ + value: string; + label: string | React.ReactNode; + }>; + className?: string; + disabled?: boolean; + error?: boolean; + hint?: string; + label?: string; + name?: string; + selectProps?: SelectProps; + placeholder?: string; + value?: string; + onChange(event: any); +} + +export const SingleSelectField = withStyles(styles, { + name: "SingleSelectField" +})( + ({ + className, + classes, + disabled, + error, + label, + choices, + value, + onChange, + name, + hint, + selectProps, + placeholder + }: SingleSelectFieldProps) => { + const choicesByKey: { [key: string]: string } = + choices === undefined + ? {} + : choices.reduce((prev, curr) => { + prev[curr.value] = curr.label; + return prev; + }, {}); + + return ( + + {label} + + {hint && {hint}} + + ); + } +); +SingleSelectField.displayName = "SingleSelectField"; +export default SingleSelectField; diff --git a/src/components/SingleSelectField/index.ts b/src/components/SingleSelectField/index.ts new file mode 100644 index 000000000..c8af8bf3f --- /dev/null +++ b/src/components/SingleSelectField/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SingleSelectField"; +export * from "./SingleSelectField"; diff --git a/src/components/Skeleton.tsx b/src/components/Skeleton.tsx new file mode 100644 index 000000000..ef5d8b7ec --- /dev/null +++ b/src/components/Skeleton.tsx @@ -0,0 +1,44 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import classNames from "classnames"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + "@keyframes skeleton-animation": { + "0%": { + opacity: 0.6 + }, + "100%": { + opacity: 1 + } + }, + skeleton: { + animation: "skeleton-animation .75s linear infinite forwards alternate", + background: theme.palette.background.default, + borderRadius: 4, + display: "block", + height: "0.8em", + margin: "0.2em 0" + } + }); + +interface SkeletonProps extends WithStyles { + className?: string; + style?: React.CSSProperties; +} + +const Skeleton = withStyles(styles, { name: "Skeleton" })( + ({ className, classes, style }: SkeletonProps) => ( + + ‌ + + ) +); + +Skeleton.displayName = "Skeleton"; +export default Skeleton; diff --git a/src/components/StatusLabel/StatusLabel.tsx b/src/components/StatusLabel/StatusLabel.tsx new file mode 100644 index 000000000..f3be842da --- /dev/null +++ b/src/components/StatusLabel/StatusLabel.tsx @@ -0,0 +1,83 @@ +import yellow from "@material-ui/core/colors/yellow"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography, { TypographyProps } from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import * as React from "react"; + +const styles = (theme: Theme) => { + const dot = { + borderRadius: "100%", + content: "''", + display: "block", + height: 8, + left: -theme.spacing.unit * 2, + position: "absolute" as "absolute", + top: "calc(50% - 5px)", + width: 8 + }; + return createStyles({ + errorDot: { + "&:before": { backgroundColor: theme.palette.error.main, ...dot } + }, + neutralDot: { + "&:before": { backgroundColor: yellow[500], ...dot } + }, + root: { + display: "inline-block", + marginLeft: theme.spacing.unit + 8, + position: "relative" + }, + span: { + display: "inline" + }, + successDot: { + "&:before": { backgroundColor: theme.palette.primary.main, ...dot } + } + }); +}; + +interface StatusLabelProps extends WithStyles { + className?: string; + label: string | React.ReactNode; + status: "success" | "neutral" | "error" | string; + typographyProps?: TypographyProps; +} + +const StatusLabel = withStyles(styles, { name: "StatusLabel" })( + ({ + classes, + className, + label, + status, + typographyProps + }: StatusLabelProps) => ( +
    + {typographyProps ? ( + + {label} + + ) : ( + label + )} +
    + ) +); +StatusLabel.displayName = "StatusLabel"; +export default StatusLabel; diff --git a/src/components/StatusLabel/index.ts b/src/components/StatusLabel/index.ts new file mode 100644 index 000000000..277ccdc27 --- /dev/null +++ b/src/components/StatusLabel/index.ts @@ -0,0 +1,2 @@ +export { default } from "./StatusLabel"; +export * from "./StatusLabel"; diff --git a/src/components/Tab/Tab.tsx b/src/components/Tab/Tab.tsx new file mode 100644 index 000000000..1b74444e5 --- /dev/null +++ b/src/components/Tab/Tab.tsx @@ -0,0 +1,60 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + active: {}, + root: { + "&$active": { + borderBottomColor: theme.palette.primary.main, + color: theme.typography.body2.color + }, + "&:focus": { + color: theme.palette.primary.main + }, + "&:hover": { + color: theme.palette.primary.main + }, + borderBottom: "1px solid transparent", + color: theme.typography.caption.color, + cursor: "pointer", + display: "inline-block", + fontWeight: theme.typography.fontWeightRegular, + marginRight: theme.spacing.unit * 2, + minWidth: 40, + padding: `0 ${theme.spacing.unit}px`, + transition: theme.transitions.duration.short + "ms" + } + }); + +interface TabProps extends WithStyles { + children?: React.ReactNode; + isActive: boolean; + changeTab: (index: T) => void; +} + +export function Tab(value: T) { + return withStyles(styles, { name: "Tab" })( + ({ classes, children, isActive, changeTab }: TabProps) => ( + changeTab(value)} + > + {children} + + ) + ); +} + +export default Tab; diff --git a/src/components/Tab/TabContainer.tsx b/src/components/Tab/TabContainer.tsx new file mode 100644 index 000000000..b266e8929 --- /dev/null +++ b/src/components/Tab/TabContainer.tsx @@ -0,0 +1,27 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +export interface TabContainerProps { + children: React.ReactNode | React.ReactNodeArray; +} + +const styles = (theme: Theme) => + createStyles({ + root: { + borderBottom: `1px solid ${theme.overrides.MuiCard.root.borderColor}` + } + }); + +const TabContainer = withStyles(styles, { + name: "TabContainer" +})(({ classes, children }: TabContainerProps & WithStyles) => ( +
    {children}
    +)); +TabContainer.displayName = "TabContainer"; + +export default TabContainer; diff --git a/src/components/Tab/Tabs.tsx b/src/components/Tab/Tabs.tsx new file mode 100644 index 000000000..5eb09a3ff --- /dev/null +++ b/src/components/Tab/Tabs.tsx @@ -0,0 +1,31 @@ +import * as React from "react"; + +export interface TabsProps { + children: ( + props: { + changeTab: (index: number) => void; + currentTab: number; + } + ) => React.ReactNode; +} + +interface TabsState { + currentTab: number; +} + +class Tabs extends React.Component { + state: TabsState = { + currentTab: 0 + }; + + changeTab = (index: number) => this.setState({ currentTab: index }); + + render() { + return this.props.children({ + changeTab: this.changeTab, + currentTab: this.state.currentTab + }); + } +} + +export default Tabs; diff --git a/src/components/Tab/index.ts b/src/components/Tab/index.ts new file mode 100644 index 000000000..69393a774 --- /dev/null +++ b/src/components/Tab/index.ts @@ -0,0 +1,6 @@ +export * from "./Tab"; +export { default as Tab } from "./Tab"; +export * from "./TabContainer"; +export { default as TabContainer } from "./TabContainer"; +export { default as Tabs } from "./Tabs"; +export { default } from "./Tabs"; diff --git a/src/components/TableCellAvatar/TableCellAvatar.tsx b/src/components/TableCellAvatar/TableCellAvatar.tsx new file mode 100644 index 000000000..369694ff9 --- /dev/null +++ b/src/components/TableCellAvatar/TableCellAvatar.tsx @@ -0,0 +1,57 @@ +import Avatar from "@material-ui/core/Avatar"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TableCell from "@material-ui/core/TableCell"; +import Cached from "@material-ui/icons/Cached"; +import * as classNames from "classnames"; +import * as React from "react"; + +import Image from "../../icons/Image"; + +const styles = (theme: Theme) => + createStyles({ + avatar: { + background: "none", + border: `1px solid ${theme.overrides.MuiCard.root.borderColor}`, + borderRadius: 2, + color: "#bdbdbd", + padding: theme.spacing.unit / 2 + }, + root: { + paddingRight: theme.spacing.unit * 3, + width: "1%" + } + }); + +interface TableCellAvatarProps extends WithStyles { + className?: string; + thumbnail?: string; + avatarProps?: string; +} + +const TableCellAvatar = withStyles(styles, { name: "TableCellAvatar" })( + ({ classes, className, thumbnail, avatarProps }: TableCellAvatarProps) => ( + + {thumbnail === undefined ? ( + + + + ) : thumbnail === null ? ( + + + + ) : ( + + )} + + ) +); +TableCellAvatar.displayName = "TableCellAvatar"; +export default TableCellAvatar; diff --git a/src/components/TableCellAvatar/index.ts b/src/components/TableCellAvatar/index.ts new file mode 100644 index 000000000..606c7449a --- /dev/null +++ b/src/components/TableCellAvatar/index.ts @@ -0,0 +1,2 @@ +export { default } from "./TableCellAvatar"; +export * from "./TableCellAvatar"; diff --git a/src/components/TableFilter/FilterChips.tsx b/src/components/TableFilter/FilterChips.tsx new file mode 100644 index 000000000..a5101de02 --- /dev/null +++ b/src/components/TableFilter/FilterChips.tsx @@ -0,0 +1,178 @@ +import ButtonBase from "@material-ui/core/ButtonBase"; +import { Theme } from "@material-ui/core/styles"; +import { fade } from "@material-ui/core/styles/colorManipulator"; +import TextField, { TextFieldProps } from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import ClearIcon from "@material-ui/icons/Clear"; +import { createStyles, makeStyles, useTheme } from "@material-ui/styles"; +import * as React from "react"; + +import i18n from "../../i18n"; +import Filter, { FilterContentSubmitData, IFilter } from "../Filter"; +import Hr from "../Hr"; +import Link from "../Link"; + +export interface Filter { + label: string; + onClick: () => void; +} + +const useInputStyles = makeStyles({ + input: { + padding: "10px 12px" + }, + root: { + flex: 1 + } +}); + +const Search: React.FC = props => { + const classes = useInputStyles(); + return ( + + ); +}; + +const useStyles = makeStyles( + (theme: Theme) => + createStyles({ + actionContainer: { + display: "flex", + flexWrap: "wrap", + padding: `${theme.spacing.unit}px ${theme.spacing.unit * 3}px` + }, + filterButton: { + alignItems: "center", + backgroundColor: fade(theme.palette.primary.main, 0.6), + borderRadius: "19px", + display: "flex", + height: "38px", + justifyContent: "space-around", + margin: `0 ${theme.spacing.unit * 2}px ${theme.spacing.unit}px`, + marginLeft: 0, + padding: "0 16px" + }, + filterChipContainer: { + display: "flex", + flex: 1, + flexWrap: "wrap" + }, + filterContainer: { + borderBottom: "1px solid #e8e8e8", + display: "flex", + marginTop: theme.spacing.unit, + padding: `0 ${theme.spacing.unit * 3}px ${theme.spacing.unit}px` + }, + filterIcon: { + color: theme.palette.common.white, + height: 16, + width: 16 + }, + filterIconContainer: { + WebkitAppearance: "none", + background: "transparent", + border: "none", + borderRadius: "100%", + cursor: "pointer", + height: 32, + marginRight: -13, + padding: 8, + width: 32 + }, + filterLabel: { + marginBottom: theme.spacing.unit + }, + filterText: { + color: theme.palette.common.white, + fontSize: 12, + fontWeight: 400 as 400 + } + }), + { + name: "FilterChips" + } +); + +interface FilterChipProps { + currencySymbol: string; + menu: IFilter; + filtersList: Filter[]; + filterLabel: string; + placeholder: string; + search: string; + isCustomSearch: boolean; + onSearchChange: (event: React.ChangeEvent) => void; + onFilterAdd: (filter: FilterContentSubmitData) => void; + onFilterDelete: () => void; + onFilterSave: () => void; +} + +export const FilterChips: React.FC = ({ + currencySymbol, + filtersList, + menu, + filterLabel, + placeholder, + onSearchChange, + search, + onFilterAdd, + onFilterSave, + onFilterDelete, + isCustomSearch +}) => { + const theme = useTheme(); + const classes = useStyles({ theme }); + + return ( + <> +
    + + +
    + {search || (filtersList && filtersList.length) ? ( +
    +
    + {filtersList.map(filter => ( +
    + + {filter.label} + + + + +
    + ))} +
    + {isCustomSearch ? ( + {i18n.t("Save Custom Search")} + ) : ( + {i18n.t("Delete Search")} + )} +
    + ) : ( +
    + )} + + ); +}; + +export default FilterChips; diff --git a/src/components/TableFilter/FilterTab.tsx b/src/components/TableFilter/FilterTab.tsx new file mode 100644 index 000000000..e56e77fc5 --- /dev/null +++ b/src/components/TableFilter/FilterTab.tsx @@ -0,0 +1,58 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Tab from "@material-ui/core/Tab"; +import classNames from "classnames"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + selectedTabLabel: { + "&$tabLabel": { + color: theme.typography.body2.color + } + }, + tabLabel: { + "&:hover": { + color: theme.typography.body2.color + }, + color: theme.typography.caption.color, + fontSize: "1rem", + fontWeight: 400 + }, + tabRoot: { + minWidth: "80px", + opacity: 1, + paddingTop: `${theme.spacing.unit * 1}px`, + textTransform: "initial" as "initial" + } + }); + +interface FilterTabProps extends WithStyles { + onClick: () => void; + label: string; + selected?: boolean; + value?: number; +} + +export const FilterTab = withStyles(styles, { name: "FilterTab" })( + ({ classes, onClick, label, selected, value }: FilterTabProps) => ( + + ) +); +FilterTab.displayName = "FilterTab"; +export default FilterTab; diff --git a/src/components/TableFilter/FilterTabs.tsx b/src/components/TableFilter/FilterTabs.tsx new file mode 100644 index 000000000..380f6ca8f --- /dev/null +++ b/src/components/TableFilter/FilterTabs.tsx @@ -0,0 +1,35 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Tabs from "@material-ui/core/Tabs"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + tabsRoot: { + borderBottom: `1px solid ${theme.overrides.MuiCard.root.borderColor}`, + paddingLeft: `${theme.spacing.unit * 3}px` + } + }); + +interface FilterTabsProps extends WithStyles { + children?: React.ReactNode; + currentTab: number; +} + +export const FilterTabs = withStyles(styles, { name: "FilterTabs" })( + ({ classes, children, currentTab }: FilterTabsProps) => ( + + {children} + + ) +); + +export default FilterTabs; diff --git a/src/components/TableFilter/index.ts b/src/components/TableFilter/index.ts new file mode 100644 index 000000000..d2d907900 --- /dev/null +++ b/src/components/TableFilter/index.ts @@ -0,0 +1,5 @@ +export { default } from "./FilterTabs"; +export { Filter } from "./FilterChips"; +export * from "./FilterTabs"; +export * from "./FilterTab"; +export * from "./FilterChips"; diff --git a/src/components/TableHead/TableHead.tsx b/src/components/TableHead/TableHead.tsx new file mode 100644 index 000000000..5e65c6a5d --- /dev/null +++ b/src/components/TableHead/TableHead.tsx @@ -0,0 +1,133 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import { fade } from "@material-ui/core/styles/colorManipulator"; +import TableCell from "@material-ui/core/TableCell"; +import MuiTableHead, { + TableHeadProps as MuiTableHeadProps +} from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import Typography from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import * as React from "react"; + +import { Node } from "../../types"; + +import i18n from "../../i18n"; +import Checkbox from "../Checkbox"; + +export interface TableHeadProps extends MuiTableHeadProps { + disabled: boolean; + selected: number; + items: Node[]; + toolbar: React.ReactNode | React.ReactNodeArray; + toggleAll: (items: Node[], selected: number) => void; +} + +const styles = (theme: Theme) => + createStyles({ + cell: { + padding: 0 + }, + checkboxPartialSelect: { + "&:after": { + background: "#fff", + content: "''", + height: 2, + position: "absolute", + width: 4 + } + }, + checkboxSelected: { + backgroundColor: fade(theme.palette.primary.main, 0.05) + }, + container: { + alignItems: "center", + display: "flex", + height: 47, + marginRight: -theme.spacing.unit * 2 + }, + padding: { + "&:last-child": { + padding: 0 + } + }, + root: { + backgroundColor: fade(theme.palette.primary.main, 0.05), + borderBottom: "1px solid rgba(224, 224, 224, 1)", + paddingLeft: 0, + paddingRight: 24 + }, + spacer: { + flex: 1 + }, + toolbar: { + "& > *": { + marginLeft: theme.spacing.unit + } + } + }); + +const TableHead = withStyles(styles, { + name: "TableHead" +})( + ({ + classes, + children, + disabled, + items, + selected, + toggleAll, + toolbar, + ...muiTableHeadProps + }: TableHeadProps & WithStyles) => { + return ( + + + + {items && items.length > 0 ? ( + selected && selected > 0 + })} + checked={selected === 0 ? false : true} + disabled={disabled} + onChange={() => toggleAll(items, selected)} + /> + ) : null} + + {selected ? ( + <> + +
    + {selected && ( + + {i18n.t("Selected {{ number }} items", { + number: selected + })} + + )} +
    +
    {toolbar}
    +
    + + + ) : ( + children + )} + + + ); + } +); +TableHead.displayName = "TableHead"; +export default TableHead; diff --git a/src/components/TableHead/index.ts b/src/components/TableHead/index.ts new file mode 100644 index 000000000..bbb62bd2f --- /dev/null +++ b/src/components/TableHead/index.ts @@ -0,0 +1,2 @@ +export { default } from './TableHead'; +export * from './TableHead'; \ No newline at end of file diff --git a/src/components/TablePagination/TablePagination.tsx b/src/components/TablePagination/TablePagination.tsx new file mode 100644 index 000000000..93d149baa --- /dev/null +++ b/src/components/TablePagination/TablePagination.tsx @@ -0,0 +1,112 @@ +// @inheritedComponent TableCell + +import { IconButtonProps } from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TableCell from "@material-ui/core/TableCell"; +import Toolbar from "@material-ui/core/Toolbar"; +import * as React from "react"; + +import TablePaginationActions from "./TablePaginationActions"; + +const styles = (theme: Theme) => + createStyles({ + actions: { + color: theme.palette.text.secondary, + flexShrink: 0, + marginLeft: theme.spacing.unit * 2.5 + }, + caption: { + flexShrink: 0 + }, + input: { + flexShrink: 0, + fontSize: "inherit" + }, + root: { + "&:last-child": { + padding: 0 + } + }, + select: { + paddingLeft: theme.spacing.unit, + paddingRight: theme.spacing.unit * 2 + }, + selectIcon: { + top: 1 + }, + selectRoot: { + color: theme.palette.text.secondary, + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit * 4 + }, + spacer: { + flex: "1 1 100%" + }, + toolbar: { + height: 56, + minHeight: 56, + paddingRight: 2 + } + }); + +interface TablePaginationProps extends WithStyles { + Actions?: typeof TablePaginationActions; + backIconButtonProps?: Partial; + colSpan: number; + component?: string | typeof TableCell; + hasNextPage: boolean; + hasPreviousPage: boolean; + nextIconButtonProps?: Partial; + onNextPage(event); + onPreviousPage(event); +} + +const TablePagination = withStyles(styles, { name: "TablePagination" })( + ({ + Actions, + backIconButtonProps, + classes, + colSpan: colSpanProp, + component: Component, + hasNextPage, + hasPreviousPage, + nextIconButtonProps, + onNextPage, + onPreviousPage, + ...other + }: TablePaginationProps) => { + let colSpan; + + if (Component === TableCell || Component === "td") { + colSpan = colSpanProp || 1000; + } + + return ( + + +
    + + + + ); + } +); +TablePagination.defaultProps = { + Actions: TablePaginationActions, + component: TableCell +}; + +TablePagination.displayName = "TablePagination"; +export default TablePagination; diff --git a/src/components/TablePagination/TablePaginationActions.tsx b/src/components/TablePagination/TablePaginationActions.tsx new file mode 100644 index 000000000..a6ca73715 --- /dev/null +++ b/src/components/TablePagination/TablePaginationActions.tsx @@ -0,0 +1,112 @@ +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import { fade } from "@material-ui/core/styles/colorManipulator"; +import ArrowLeft from "@material-ui/icons/ArrowLeft"; +import ArrowRight from "@material-ui/icons/ArrowRight"; +import useTheme from "@saleor/hooks/useTheme"; +import * as classNames from "classnames"; +import * as React from "react"; + +const styles = (theme: Theme) => + createStyles({ + dark: { + "& svg": { + color: theme.palette.primary.main + }, + "&$disabled": { + "& svg": { + color: fade(theme.palette.primary.main, 0.2) + } + }, + "&:focus, &:hover": { + "& > span:first-of-type": { + backgroundColor: fade(theme.palette.primary.main, 0.2) + } + } + }, + disabled: {}, + iconButton: { + "& > span:first-of-type": { + backgroundColor: theme.palette.background.default, + borderRadius: "100%", + transition: theme.transitions.duration.standard + "ms" + }, + "&:focus, &:hover": { + "& > span:first-of-type": { + backgroundColor: fade(theme.palette.primary.main, 0.2) + }, + backgroundColor: "transparent" + } + }, + root: { + color: theme.palette.text.secondary, + flexShrink: 0, + marginLeft: theme.spacing.unit * 2.5 + } + }); + +export interface TablePaginationActionsProps + extends WithStyles { + backIconButtonProps?: any; + classes: any; + className?: string; + hasNextPage: boolean; + hasPreviousPage: boolean; + nextIconButtonProps?: any; + onNextPage(event); + onPreviousPage(event); +} + +export const TablePaginationActions = withStyles(styles, { + name: "TablePaginationActions", + withTheme: true +})( + ({ + backIconButtonProps, + classes, + className, + hasNextPage, + hasPreviousPage, + nextIconButtonProps, + onNextPage, + onPreviousPage, + theme, + ...other + }: TablePaginationActionsProps) => { + const { isDark } = useTheme(); + return ( +
    + + {theme.direction === "rtl" ? : } + + + {theme.direction === "rtl" ? : } + +
    + ); + } +); + +TablePaginationActions.displayName = "TablePaginationActions"; +export default TablePaginationActions; diff --git a/src/components/TablePagination/index.ts b/src/components/TablePagination/index.ts new file mode 100644 index 000000000..0d128c72d --- /dev/null +++ b/src/components/TablePagination/index.ts @@ -0,0 +1,3 @@ +export { default } from "./TablePagination"; +export * from "./TablePagination"; +export * from "./TablePaginationActions"; diff --git a/src/components/TextFieldWithChoice/TextFieldWithChoice.tsx b/src/components/TextFieldWithChoice/TextFieldWithChoice.tsx new file mode 100644 index 000000000..07b311710 --- /dev/null +++ b/src/components/TextFieldWithChoice/TextFieldWithChoice.tsx @@ -0,0 +1,132 @@ +import ClickAwayListener from "@material-ui/core/ClickAwayListener"; +import Grow from "@material-ui/core/Grow"; +import MenuItem from "@material-ui/core/MenuItem"; +import Menu from "@material-ui/core/MenuList"; +import Paper from "@material-ui/core/Paper"; +import Popper from "@material-ui/core/Popper"; +import { createStyles, WithStyles, withStyles } from "@material-ui/core/styles"; +import TextField, { TextFieldProps } from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import DropdownIcon from "@material-ui/icons/ArrowDropDown"; +import * as React from "react"; + +import MenuToggle from "../MenuToggle"; + +export type TextFieldWithChoiceProps = TextFieldProps & { + ChoiceProps: { + name: string; + label: string | React.ReactNode; + values: Array<{ + label: string | React.ReactNode; + value: TValue; + }>; + }; +}; + +const styles = createStyles({ + adornment: { + alignItems: "center", + cursor: "pointer", + display: "flex" + }, + menu: { + zIndex: 10 + } +}); + +const TextFieldWithChoice = withStyles(styles, { + name: "TextFieldWithChoices" +})( + ({ + ChoiceProps, + InputProps, + classes, + onChange, + ...props + }: TextFieldWithChoiceProps & WithStyles) => { + const anchor = React.useRef(); + + return ( + + {({ + open: menuOpen, + actions: { open: openMenu, close: closeMenu } + }) => { + const handleSelect = value => { + onChange({ + target: { + name: ChoiceProps.name, + value + } + } as any); + closeMenu(); + }; + + return ( + <> +
    + + {ChoiceProps.label} + + +
    + + {({ TransitionProps, placement }) => ( + + + + + {ChoiceProps.values.map(choice => ( + handleSelect(choice.value)} + key={choice.value} + > + {choice.label} + + ))} + + + + + )} + + + ); + }} + + ) + }} + /> + ); + } +); +TextFieldWithChoice.displayName = "TextFieldWithChoice"; +export default TextFieldWithChoice; diff --git a/src/components/TextFieldWithChoice/index.ts b/src/components/TextFieldWithChoice/index.ts new file mode 100644 index 000000000..064783078 --- /dev/null +++ b/src/components/TextFieldWithChoice/index.ts @@ -0,0 +1,2 @@ +export { default } from "./TextFieldWithChoice"; +export * from "./TextFieldWithChoice"; diff --git a/src/components/Theme/ThemeProvider.tsx b/src/components/Theme/ThemeProvider.tsx new file mode 100644 index 000000000..71abbcc57 --- /dev/null +++ b/src/components/Theme/ThemeProvider.tsx @@ -0,0 +1,99 @@ +// FIXME: https://github.com/mirumee/saleor/issues/4174 +import OldMuiThemeProvider from "@material-ui/core/styles/MuiThemeProvider"; +import MuiThemeProvider from "@material-ui/styles/ThemeProvider"; +import * as React from "react"; + +import Baseline from "../../Baseline"; +import createTheme, { IThemeColors } from "../../theme"; + +const dark: IThemeColors = { + autofill: "#5D5881", + background: { + default: "#1D1E1F", + paper: "#2E2F31" + }, + error: "#C22D74", + font: { + default: "#FCFCFC", + gray: "#9E9D9D" + }, + gray: { + default: "#202124", + disabled: "rgba(32, 33, 36, 0.6)" + }, + input: { + default: "#25262A", + disabled: "#292A2D", + focused: "#25262A" + }, + paperBorder: "#252728", + primary: "#13BEBB", + secondary: "#21125E" +}; +const light: IThemeColors = { + autofill: "#f4f6c5", + background: { + default: "#F1F6F6", + paper: "#FFFFFF" + }, + error: "#C22D74", + font: { + default: "#3D3D3D", + gray: "#616161" + }, + gray: { + default: "#C8C8C8", + disabled: "rgba(216, 216, 216, 0.3)" + }, + input: { + default: "#F1F6F6", + disabled: "#EAEAEA", + focused: "#DCEBEB" + }, + paperBorder: "#EAEAEA", + primary: "#13BEBB", + secondary: "#21125E" +}; + +interface IThemeContext { + isDark: boolean; + toggleTheme: () => void; +} +export const ThemeContext = React.createContext({ + isDark: false, + toggleTheme: () => undefined +}); + +interface ThemeProviderProps { + isDefaultDark?: boolean; +} +const ThemeProvider: React.FC = ({ + children, + isDefaultDark +}) => { + const [isDark, setDark] = React.useState(isDefaultDark); + const toggleTheme = () => { + setDark(!isDark); + localStorage.setItem("theme", (!isDark).toString()); + }; + + return ( + + + + + {children} + + + + ); +}; +ThemeProvider.defaultProps = { + isDefaultDark: false +}; +export default ThemeProvider; diff --git a/src/components/Theme/index.ts b/src/components/Theme/index.ts new file mode 100644 index 000000000..337b9a0d3 --- /dev/null +++ b/src/components/Theme/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ThemeProvider"; +export * from "./ThemeProvider"; diff --git a/src/components/Timeline/Timeline.tsx b/src/components/Timeline/Timeline.tsx new file mode 100644 index 000000000..8591932d8 --- /dev/null +++ b/src/components/Timeline/Timeline.tsx @@ -0,0 +1,106 @@ +import Avatar from "@material-ui/core/Avatar"; +import Button from "@material-ui/core/Button"; +import CardContent from "@material-ui/core/CardContent"; +import deepPurple from "@material-ui/core/colors/deepPurple"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import PersonIcon from "@material-ui/icons/Person"; +import * as React from "react"; + +import i18n from "../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + avatar: { + "& span": { + height: "100%", + width: "100%" + }, + alignSelf: "flex-start", + marginRight: theme.spacing.unit * 5.5 + }, + cardActionsExpanded: { + maxHeight: theme.spacing.unit * 6 + }, + input: { + marginTop: -theme.spacing.unit + }, + noteRoot: { + left: -theme.spacing.unit * 8.5 - 1, + marginBottom: theme.spacing.unit * 3, + position: "relative", + width: `calc(100% + ${theme.spacing.unit * 8.5}px)` + }, + noteTitle: { + "&:last-child": { + paddingBottom: 0 + }, + alignItems: "center", + background: theme.palette.background.default, + display: "flex" + }, + root: { + borderColor: theme.overrides.MuiCard.root.borderColor, + borderStyle: "solid", + borderWidth: "0 0 0 2px", + marginLeft: 20, + paddingLeft: theme.spacing.unit * 3 + } + }); + +interface TimelineProps extends WithStyles { + children?: React.ReactNode; +} + +interface TimelineAddNoteProps extends WithStyles { + message: string; + onChange(event: React.ChangeEvent); + onSubmit(event: React.FormEvent); +} + +export const Timeline = withStyles(styles, { name: "Timeline" })( + ({ classes, children }: TimelineProps) => ( +
    {children}
    + ) +); + +export const TimelineAddNote = withStyles(styles, { name: "TimelineAddNote" })( + ({ classes, message, onChange, onSubmit }: TimelineAddNoteProps) => ( +
    + + + + + + {i18n.t("Send", { + context: "add order note" + })} + + ) + }} + variant="standard" + /> + +
    + ) +); +Timeline.displayName = "Timeline"; +export default Timeline; diff --git a/src/components/Timeline/TimelineEvent.tsx b/src/components/Timeline/TimelineEvent.tsx new file mode 100644 index 000000000..6e2ccd86e --- /dev/null +++ b/src/components/Timeline/TimelineEvent.tsx @@ -0,0 +1,100 @@ +import ExpansionPanel from "@material-ui/core/ExpansionPanel"; +import ExpansionPanelDetails from "@material-ui/core/ExpansionPanelDetails"; +import ExpansionPanelSummary from "@material-ui/core/ExpansionPanelSummary"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; +import * as React from "react"; + +import { DateTime } from "../Date"; + +const styles = (theme: Theme) => + createStyles({ + date: { + color: theme.typography.caption.color, + }, + dateExpander:{ + color: theme.typography.caption.color, + position: "absolute", + right: theme.spacing.unit * 3 + }, + dot: { + backgroundColor: theme.palette.primary.main, + borderRadius: "100%", + height: 8, + left: -29, + position: "absolute", + top: 6, + width: 8 + }, + noExpander: { + alignItems: "center", + display: "flex", + justifyContent: "space-between", + marginBottom: theme.spacing.unit, + marginLeft: theme.spacing.unit * 3, + width: "100%" + }, + panel: { + "&:before": { + display: "none" + }, + background: "none", + width: "100%" + }, + root: { + "&:last-child:after": { + background: theme.palette.background.default, + content: "''", + height: "calc(50% - 4px)", + left: `${-theme.spacing.unit * 3 - 2}px`, + position: "absolute", + top: "calc(50% + 4px)", + width: "2px" + }, + alignItems: "center", + display: "flex", + marginBottom: theme.spacing.unit * 3, + position: "relative", + width: "100%" + } + }); + +interface TimelineEventProps extends WithStyles { + children?: React.ReactNode; + date: string; + title: string; +} + +export const TimelineEvent = withStyles(styles)( + ({ classes, children, date, title }: TimelineEventProps) => ( +
    + + {children ? ( + + }> + {title} + {title} + + + {children} + + + ) : ( +
    + {title} + + + +
    + )} +
    + ) +); +TimelineEvent.displayName = "TimelineEvent"; +export default TimelineEvent; diff --git a/src/components/Timeline/TimelineNote.tsx b/src/components/Timeline/TimelineNote.tsx new file mode 100644 index 000000000..4059a7bd6 --- /dev/null +++ b/src/components/Timeline/TimelineNote.tsx @@ -0,0 +1,107 @@ +import Avatar from "@material-ui/core/Avatar"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import * as colors from "@material-ui/core/colors"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import PersonIcon from "@material-ui/icons/Person"; +import * as CRC from "crc-32"; +import * as React from "react"; + +import { DateTime } from "../Date"; +import Hr from "../Hr"; + +const palette = [ + colors.amber, + colors.blue, + colors.cyan, + colors.deepOrange, + colors.deepPurple, + colors.green, + colors.indigo, + colors.lightBlue, + colors.lightGreen, + colors.lime, + colors.orange, + colors.pink, + colors.purple, + colors.red, + colors.teal, + colors.yellow +].map(color => color[500]); + +const styles = (theme: Theme) => + createStyles({ + avatar: { + left: -45, + position: "absolute", + top: 0 + }, + card: { + marginBottom: theme.spacing.unit * 3, + marginLeft: theme.spacing.unit * 3, + position: "relative" + }, + cardContent: { + "&:last-child": { + paddingBottom: 16 + } + }, + content: { + marginTop: theme.spacing.unit * 2 + }, + root: { + position: "relative" + }, + title: { + alignItems: "center", + display: "flex", + justifyContent: "space-between", + marginBottom: theme.spacing.unit + } + }); + +interface TimelineNoteProps extends WithStyles { + date: string; + message: string | null; + user: { + email: string; + }; +} + +export const TimelineNote = withStyles(styles, { name: "TimelineNote" })( + ({ classes, date, user, message }: TimelineNoteProps) => ( +
    + + + + + +
    + {user.email} + + + +
    +
    + ") + }} + /> +
    +
    +
    + ) +); +TimelineNote.displayName = "TimelineNote"; +export default TimelineNote; diff --git a/src/components/Timeline/index.ts b/src/components/Timeline/index.ts new file mode 100644 index 000000000..8c3807205 --- /dev/null +++ b/src/components/Timeline/index.ts @@ -0,0 +1,4 @@ +export { default } from "./Timeline"; +export * from "./Timeline"; +export * from "./TimelineEvent"; +export * from "./TimelineNote"; diff --git a/src/components/Timezone/Timezone.tsx b/src/components/Timezone/Timezone.tsx new file mode 100644 index 000000000..2690b5d7a --- /dev/null +++ b/src/components/Timezone/Timezone.tsx @@ -0,0 +1,10 @@ +import * as React from "react"; + +export const TimezoneContext = React.createContext(undefined); +const { + Consumer: TimezoneConsumer, + Provider: TimezoneProvider +} = TimezoneContext; + +export { TimezoneConsumer, TimezoneProvider }; +export default TimezoneContext; diff --git a/src/components/Timezone/index.ts b/src/components/Timezone/index.ts new file mode 100644 index 000000000..d94e90445 --- /dev/null +++ b/src/components/Timezone/index.ts @@ -0,0 +1,2 @@ +export * from "./Timezone"; +export { default } from "./Timezone"; diff --git a/src/components/VisibilityCard/VisibilityCard.tsx b/src/components/VisibilityCard/VisibilityCard.tsx new file mode 100644 index 000000000..5600ff2d3 --- /dev/null +++ b/src/components/VisibilityCard/VisibilityCard.tsx @@ -0,0 +1,119 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import ControlledSwitch from "@saleor/components/ControlledSwitch"; +import { FormSpacer } from "@saleor/components/FormSpacer"; +import useDateLocalize from "@saleor/hooks/useDateLocalize"; +import i18n from "../../i18n"; +import { DateContext } from "../Date/DateContext"; + +const styles = (theme: Theme) => + createStyles({ + date: { + "& svg": { + fill: theme.palette.primary.main + }, + marginTop: theme.spacing.unit * 4 + }, + expandedSwitchContainer: { + marginBottom: 0 + }, + switchContainer: { + marginBottom: -theme.spacing.unit + } + }); + +interface VisibilityCardProps extends WithStyles { + children?: React.ReactNode | React.ReactNodeArray; + data: { + isPublished: boolean; + publicationDate: string; + }; + errors: { [key: string]: string }; + disabled?: boolean; + onChange(event: any); +} + +export const VisibilityCard = withStyles(styles, { + name: "VisibilityCard" +})( + ({ + children, + classes, + data: { isPublished, publicationDate }, + errors, + disabled, + onChange + }: VisibilityCardProps) => { + const localizeDate = useDateLocalize(); + const dateNow = React.useContext(DateContext); + return ( + + + +
    + dateNow + ? i18n.t("will be visible from {{ date }}", { + date: localizeDate(publicationDate) + }) + : null + : null + } + checked={isPublished} + onChange={onChange} + disabled={disabled} + /> +
    + {!isPublished && ( + <> + + + )} + + {children} +
    +
    + ); + } +); +VisibilityCard.displayName = "VisibilityCard"; +export default VisibilityCard; diff --git a/src/components/VisibilityCard/index.ts b/src/components/VisibilityCard/index.ts new file mode 100644 index 000000000..9881a1d85 --- /dev/null +++ b/src/components/VisibilityCard/index.ts @@ -0,0 +1,2 @@ +export { default } from "./VisibilityCard"; +export * from "./VisibilityCard"; diff --git a/src/components/Weight/Weight.tsx b/src/components/Weight/Weight.tsx new file mode 100644 index 000000000..35defbf0b --- /dev/null +++ b/src/components/Weight/Weight.tsx @@ -0,0 +1,18 @@ +import * as React from "react"; +import i18n from "../../i18n"; + +export interface Weight { + unit: string; + value: number; +} +export interface WeightProps { + weight: Weight; +} + +const Weight: React.StatelessComponent = ({ weight }) => + i18n.t("{{ value }} {{ unit }}", { + context: "weight", + ...weight + }); +Weight.displayName = "Weight"; +export default Weight; diff --git a/src/components/Weight/index.ts b/src/components/Weight/index.ts new file mode 100644 index 000000000..1a73fcf9a --- /dev/null +++ b/src/components/Weight/index.ts @@ -0,0 +1,2 @@ +export { default } from './Weight'; +export * from './Weight'; \ No newline at end of file diff --git a/src/components/WeightRange/WeightRange.tsx b/src/components/WeightRange/WeightRange.tsx new file mode 100644 index 000000000..2552fae68 --- /dev/null +++ b/src/components/WeightRange/WeightRange.tsx @@ -0,0 +1,35 @@ +import * as React from "react"; + +import i18n from "../../i18n"; +import { Weight } from "../Weight"; + +export interface WeightRangeProps { + from?: Weight; + to?: Weight; +} + +const WeightRange: React.StatelessComponent = ({ + from, + to +}) => + from && to + ? i18n.t("{{ fromValue }} {{ fromUnit }} - {{ toValue }} {{ toUnit }}", { + context: "weight", + fromUnit: from.unit, + fromValue: from.value, + toUnit: to.unit, + toValue: to.value + }) + : from && !to + ? i18n.t("from {{ value }} {{ unit }}", { + context: "weight", + ...from + }) + : !from && to + ? i18n.t("to {{ value }} {{ unit }}", { + context: "weight", + ...to + }) + : "-"; +WeightRange.displayName = "WeightRange"; +export default WeightRange; diff --git a/src/components/WeightRange/index.ts b/src/components/WeightRange/index.ts new file mode 100644 index 000000000..b07752efe --- /dev/null +++ b/src/components/WeightRange/index.ts @@ -0,0 +1,2 @@ +export { default } from './WeightRange'; +export * from './WeightRange'; \ No newline at end of file diff --git a/src/components/WindowTitle/index.tsx b/src/components/WindowTitle/index.tsx new file mode 100644 index 000000000..63c99f54b --- /dev/null +++ b/src/components/WindowTitle/index.tsx @@ -0,0 +1,18 @@ +import * as React from "react"; +import { Helmet } from "react-helmet"; + +import useShop from "@saleor/hooks/useShop"; + +interface WindowTitleProps { + title: string; +} + +export const WindowTitle: React.StatelessComponent = ({ + title +}) => { + const shop = useShop(); + + return shop === undefined || !title ? null : ( + + ); +}; diff --git a/src/components/messages/MessageManager.tsx b/src/components/messages/MessageManager.tsx new file mode 100644 index 000000000..b698d0dc3 --- /dev/null +++ b/src/components/messages/MessageManager.tsx @@ -0,0 +1,105 @@ +import Button from "@material-ui/core/Button"; +import IconButton from "@material-ui/core/IconButton"; +import Snackbar from "@material-ui/core/Snackbar"; +import CloseIcon from "@material-ui/icons/Close"; +import * as React from "react"; + +import { IMessage, MessageContext } from "./"; + +interface Message extends IMessage { + key: string; +} +interface MessageManagerState { + message: Message; + opened: boolean; +} + +export class MessageManager extends React.Component<{}, MessageManagerState> { + state = { + message: { text: "", key: "0", onUndo: undefined }, + opened: false + }; + queue = []; + + handleClose = (_, reason) => { + if (reason === "clickaway") { + return; + } + this.setState({ opened: false }); + }; + + handleExited = () => { + this.processQueue(); + }; + + pushMessage = (message: IMessage) => { + this.queue.push({ + key: new Date().getTime(), + ...message + }); + + if (this.state.opened) { + this.setState({ opened: false }); + } else { + this.processQueue(); + } + }; + + processQueue = () => { + if (this.queue.length > 0) { + this.setState({ + message: this.queue.shift(), + opened: true + }); + } + }; + + render() { + const { text, key, onUndo } = this.state.message; + return ( + <> + {text}} + action={[ + !!onUndo ? ( + + ) : ( + undefined + ), + + + + ]} + /> + + {this.props.children} + + + ); + } +} +export default MessageManager; diff --git a/src/components/messages/index.ts b/src/components/messages/index.ts new file mode 100644 index 000000000..b5d621a0c --- /dev/null +++ b/src/components/messages/index.ts @@ -0,0 +1,11 @@ +import { createContext } from "react"; + +export interface IMessage { + text: string; + onUndo?: () => void; +} +export type IMessageContext = (message: IMessage) => void; +export const MessageContext = createContext(undefined); + +export * from "./MessageManager"; +export default MessageContext.Consumer; diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 000000000..1b4214a1b --- /dev/null +++ b/src/config.ts @@ -0,0 +1,12 @@ +import { SearchQueryVariables } from "./containers/BaseSearch"; + +export const APP_MOUNT_URI = process.env.APP_MOUNT_URI || "/"; +export const API_URI = process.env.API_URI || "/graphql/"; + +export const DEFAULT_INITIAL_SEARCH_DATA: SearchQueryVariables = { + after: null, + first: 5, + query: "" +}; + +export const PAGINATE_BY = 20; diff --git a/src/configuration/ConfigurationPage.tsx b/src/configuration/ConfigurationPage.tsx new file mode 100644 index 000000000..8466c11c0 --- /dev/null +++ b/src/configuration/ConfigurationPage.tsx @@ -0,0 +1,110 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import { IconProps } from "@material-ui/core/Icon"; +import { User } from "../auth/types/User"; +import Container from "../components/Container"; +import PageHeader from "../components/PageHeader"; +import i18n from "../i18n"; +import { PermissionEnum } from "../types/globalTypes"; + +export interface MenuItem { + description: string; + icon: React.ReactElement; + permission: PermissionEnum; + title: string; + url?: string; +} + +const styles = (theme: Theme) => + createStyles({ + card: { + "&:hover": { + boxShadow: "0px 5px 15px rgba(0, 0, 0, 0.15);" + }, + cursor: "pointer", + marginBottom: theme.spacing.unit * 3, + transition: theme.transitions.duration.standard + "ms" + }, + cardContent: { + // Overrides Material-UI default theme + "&:last-child": { + paddingBottom: 16 + }, + display: "grid", + gridColumnGap: theme.spacing.unit * 4 + "px", + gridTemplateColumns: "48px 1fr" + }, + cardDisabled: { + "& $icon, & $sectionTitle, & $sectionDescription": { + color: theme.palette.text.disabled + }, + marginBottom: theme.spacing.unit * 3 + }, + icon: { + color: theme.palette.primary.main, + fontSize: 48 + }, + root: { + [theme.breakpoints.down("md")]: { + gridTemplateColumns: "1fr" + }, + display: "grid", + gridColumnGap: theme.spacing.unit * 4 + "px", + gridTemplateColumns: "1fr 1fr" + }, + sectionDescription: {}, + sectionTitle: { + fontSize: 20, + fontWeight: 600 as 600 + } + }); + +export interface ConfigurationPageProps extends WithStyles { + menu: MenuItem[]; + user: User; + onSectionClick: (sectionName: string) => void; +} + +export const ConfigurationPage = withStyles(styles, { + name: "ConfigurationPage" +})(({ classes, menu, user, onSectionClick }: ConfigurationPageProps) => ( + + +
    + {menu + .filter(menuItem => + user.permissions.map(perm => perm.code).includes(menuItem.permission) + ) + .map((menuItem, menuItemIndex) => ( + onSectionClick(menuItem.url)} + key={menuItemIndex} + > + +
    {menuItem.icon}
    +
    + + {menuItem.title} + + + {menuItem.description} + +
    +
    +
    + ))} +
    +
    +)); +ConfigurationPage.displayName = "ConfigurationPage"; +export default ConfigurationPage; diff --git a/src/configuration/index.tsx b/src/configuration/index.tsx new file mode 100644 index 000000000..78a406ee2 --- /dev/null +++ b/src/configuration/index.tsx @@ -0,0 +1,94 @@ +import * as React from "react"; + +import useNavigator from "@saleor/hooks/useNavigator"; +import useUser from "@saleor/hooks/useUser"; +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import Navigation from "../icons/Navigation"; +import Pages from "../icons/Pages"; +import ProductTypes from "../icons/ProductTypes"; +import ShippingMethods from "../icons/ShippingMethods"; +import SiteSettings from "../icons/SiteSettings"; +import StaffMembers from "../icons/StaffMembers"; +import Taxes from "../icons/Taxes"; +import { maybe } from "../misc"; +import { menuListUrl } from "../navigation/urls"; +import { pageListUrl } from "../pages/urls"; +import { productTypeListUrl } from "../productTypes/urls"; +import { shippingZonesListUrl } from "../shipping/urls"; +import { siteSettingsUrl } from "../siteSettings/urls"; +import { staffListUrl } from "../staff/urls"; +import { taxSection } from "../taxes/urls"; +import { PermissionEnum } from "../types/globalTypes"; +import ConfigurationPage, { MenuItem } from "./ConfigurationPage"; + +export const configurationMenu: MenuItem[] = [ + { + description: i18n.t("Define types of products you sell"), + icon: , + permission: PermissionEnum.MANAGE_PRODUCTS, + title: i18n.t("Product Types"), + url: productTypeListUrl() + }, + { + description: i18n.t("Manage your employees and their permissions"), + icon: , + permission: PermissionEnum.MANAGE_STAFF, + title: i18n.t("Staff Members"), + url: staffListUrl() + }, + { + description: i18n.t("Manage how you ship out orders."), + icon: , + permission: PermissionEnum.MANAGE_SHIPPING, + title: i18n.t("Shipping Methods"), + url: shippingZonesListUrl() + }, + { + description: i18n.t("Manage how your store charges tax"), + icon: , + permission: PermissionEnum.MANAGE_PRODUCTS, + title: i18n.t("Taxes"), + url: taxSection + }, + { + description: i18n.t("Define how users can navigate through your store"), + icon: , + permission: PermissionEnum.MANAGE_MENUS, + title: i18n.t("Navigation"), + url: menuListUrl() + }, + { + description: i18n.t("View and update your site settings"), + icon: , + permission: PermissionEnum.MANAGE_SETTINGS, + title: i18n.t("Site Settings"), + url: siteSettingsUrl() + }, + { + description: i18n.t("Manage and add additional pages"), + icon: , + permission: PermissionEnum.MANAGE_PAGES, + title: i18n.t("Pages"), + url: pageListUrl() + } +]; + +export const configurationMenuUrl = "/configuration/"; + +export const ConfigurationSection: React.StatelessComponent = () => { + const navigate = useNavigator(); + const user = useUser(); + + return ( + <> + + user.user)} + onSectionClick={navigate} + /> + + ); +}; +export default ConfigurationSection; diff --git a/src/containers/BaseSearch.tsx b/src/containers/BaseSearch.tsx new file mode 100644 index 000000000..920d542d7 --- /dev/null +++ b/src/containers/BaseSearch.tsx @@ -0,0 +1,66 @@ +import { DocumentNode } from "graphql"; +import * as React from "react"; + +import Debounce from "../components/Debounce"; +import { TypedQuery, TypedQueryResult } from "../queries"; + +export interface SearchQueryVariables { + after?: string; + first: number; + query: string; +} + +function BaseSearch( + query: DocumentNode +) { + const Query = TypedQuery(query); + interface BaseSearchProps { + children: (props: { + search: (query: string) => void; + result: TypedQueryResult; + }) => React.ReactElement; + variables: TQueryVariables; + } + interface BaseSearchState { + query: string; + } + + class BaseSearchComponent extends React.Component< + BaseSearchProps, + BaseSearchState + > { + state: BaseSearchState = { + query: this.props.variables.query + }; + + search = (query: string) => { + if (query === undefined) { + this.setState({ query: "" }); + } else { + this.setState({ query }); + } + }; + + render() { + const { children, variables } = this.props; + + return ( + + {search => ( + + {result => children({ search, result })} + + )} + + ); + } + } + return BaseSearchComponent; +} +export default BaseSearch; diff --git a/src/containers/SearchCategories/index.tsx b/src/containers/SearchCategories/index.tsx new file mode 100644 index 000000000..0179c7e58 --- /dev/null +++ b/src/containers/SearchCategories/index.tsx @@ -0,0 +1,24 @@ +import gql from "graphql-tag"; + +import BaseSearch from "../BaseSearch"; +import { + SearchCategories, + SearchCategoriesVariables +} from "./types/SearchCategories"; + +export const searchCategories = gql` + query SearchCategories($after: String, $first: Int!, $query: String!) { + categories(after: $after, first: $first, query: $query) { + edges { + node { + id + name + } + } + } + } +`; + +export default BaseSearch( + searchCategories +); diff --git a/src/containers/SearchCategories/types/SearchCategories.ts b/src/containers/SearchCategories/types/SearchCategories.ts new file mode 100644 index 000000000..0bd976f19 --- /dev/null +++ b/src/containers/SearchCategories/types/SearchCategories.ts @@ -0,0 +1,33 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: SearchCategories +// ==================================================== + +export interface SearchCategories_categories_edges_node { + __typename: "Category"; + id: string; + name: string; +} + +export interface SearchCategories_categories_edges { + __typename: "CategoryCountableEdge"; + node: SearchCategories_categories_edges_node; +} + +export interface SearchCategories_categories { + __typename: "CategoryCountableConnection"; + edges: SearchCategories_categories_edges[]; +} + +export interface SearchCategories { + categories: SearchCategories_categories | null; +} + +export interface SearchCategoriesVariables { + after?: string | null; + first: number; + query: string; +} diff --git a/src/containers/SearchCollections/index.tsx b/src/containers/SearchCollections/index.tsx new file mode 100644 index 000000000..54f2177f9 --- /dev/null +++ b/src/containers/SearchCollections/index.tsx @@ -0,0 +1,24 @@ +import gql from "graphql-tag"; + +import BaseSearch from "../BaseSearch"; +import { + SearchCollections, + SearchCollectionsVariables +} from "./types/SearchCollections"; + +export const searchCollections = gql` + query SearchCollections($after: String, $first: Int!, $query: String!) { + collections(after: $after, first: $first, query: $query) { + edges { + node { + id + name + } + } + } + } +`; + +export default BaseSearch( + searchCollections +); diff --git a/src/containers/SearchCollections/types/SearchCollections.ts b/src/containers/SearchCollections/types/SearchCollections.ts new file mode 100644 index 000000000..ce9c70cca --- /dev/null +++ b/src/containers/SearchCollections/types/SearchCollections.ts @@ -0,0 +1,33 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: SearchCollections +// ==================================================== + +export interface SearchCollections_collections_edges_node { + __typename: "Collection"; + id: string; + name: string; +} + +export interface SearchCollections_collections_edges { + __typename: "CollectionCountableEdge"; + node: SearchCollections_collections_edges_node; +} + +export interface SearchCollections_collections { + __typename: "CollectionCountableConnection"; + edges: SearchCollections_collections_edges[]; +} + +export interface SearchCollections { + collections: SearchCollections_collections | null; +} + +export interface SearchCollectionsVariables { + after?: string | null; + first: number; + query: string; +} diff --git a/src/containers/SearchCustomers/index.ts b/src/containers/SearchCustomers/index.ts new file mode 100644 index 000000000..2ed50f4a2 --- /dev/null +++ b/src/containers/SearchCustomers/index.ts @@ -0,0 +1,24 @@ +import gql from "graphql-tag"; + +import BaseSearch from "../BaseSearch"; +import { + SearchCustomers, + SearchCustomersVariables +} from "./types/SearchCustomers"; + +export const searchCustomers = gql` + query SearchCustomers($after: String, $first: Int!, $query: String!) { + customers(after: $after, first: $first, query: $query) { + edges { + node { + id + email + } + } + } + } +`; + +export default BaseSearch( + searchCustomers +); diff --git a/src/containers/SearchCustomers/types/SearchCustomers.ts b/src/containers/SearchCustomers/types/SearchCustomers.ts new file mode 100644 index 000000000..ad51c10ab --- /dev/null +++ b/src/containers/SearchCustomers/types/SearchCustomers.ts @@ -0,0 +1,33 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: SearchCustomers +// ==================================================== + +export interface SearchCustomers_customers_edges_node { + __typename: "User"; + id: string; + email: string; +} + +export interface SearchCustomers_customers_edges { + __typename: "UserCountableEdge"; + node: SearchCustomers_customers_edges_node; +} + +export interface SearchCustomers_customers { + __typename: "UserCountableConnection"; + edges: SearchCustomers_customers_edges[]; +} + +export interface SearchCustomers { + customers: SearchCustomers_customers | null; +} + +export interface SearchCustomersVariables { + after?: string | null; + first: number; + query: string; +} diff --git a/src/containers/SearchPages/index.tsx b/src/containers/SearchPages/index.tsx new file mode 100644 index 000000000..70bf13053 --- /dev/null +++ b/src/containers/SearchPages/index.tsx @@ -0,0 +1,19 @@ +import gql from "graphql-tag"; + +import BaseSearch from "../BaseSearch"; +import { SearchPages, SearchPagesVariables } from "./types/SearchPages"; + +export const searchPages = gql` + query SearchPages($after: String, $first: Int!, $query: String!) { + pages(after: $after, first: $first, query: $query) { + edges { + node { + id + title + } + } + } + } +`; + +export default BaseSearch(searchPages); diff --git a/src/containers/SearchPages/types/SearchPages.ts b/src/containers/SearchPages/types/SearchPages.ts new file mode 100644 index 000000000..7357bb965 --- /dev/null +++ b/src/containers/SearchPages/types/SearchPages.ts @@ -0,0 +1,33 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: SearchPages +// ==================================================== + +export interface SearchPages_pages_edges_node { + __typename: "Page"; + id: string; + title: string; +} + +export interface SearchPages_pages_edges { + __typename: "PageCountableEdge"; + node: SearchPages_pages_edges_node; +} + +export interface SearchPages_pages { + __typename: "PageCountableConnection"; + edges: SearchPages_pages_edges[]; +} + +export interface SearchPages { + pages: SearchPages_pages | null; +} + +export interface SearchPagesVariables { + after?: string | null; + first: number; + query: string; +} diff --git a/src/containers/SearchProducts/index.tsx b/src/containers/SearchProducts/index.tsx new file mode 100644 index 000000000..c5029eff3 --- /dev/null +++ b/src/containers/SearchProducts/index.tsx @@ -0,0 +1,27 @@ +import gql from "graphql-tag"; + +import BaseSearch from "../BaseSearch"; +import { + SearchProducts, + SearchProductsVariables +} from "./types/SearchProducts"; + +export const searchProducts = gql` + query SearchProducts($after: String, $first: Int!, $query: String!) { + products(after: $after, first: $first, query: $query) { + edges { + node { + id + name + thumbnail { + url + } + } + } + } + } +`; + +export default BaseSearch( + searchProducts +); diff --git a/src/containers/SearchProducts/types/SearchProducts.ts b/src/containers/SearchProducts/types/SearchProducts.ts new file mode 100644 index 000000000..fdafa6e10 --- /dev/null +++ b/src/containers/SearchProducts/types/SearchProducts.ts @@ -0,0 +1,39 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: SearchProducts +// ==================================================== + +export interface SearchProducts_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface SearchProducts_products_edges_node { + __typename: "Product"; + id: string; + name: string; + thumbnail: SearchProducts_products_edges_node_thumbnail | null; +} + +export interface SearchProducts_products_edges { + __typename: "ProductCountableEdge"; + node: SearchProducts_products_edges_node; +} + +export interface SearchProducts_products { + __typename: "ProductCountableConnection"; + edges: SearchProducts_products_edges[]; +} + +export interface SearchProducts { + products: SearchProducts_products | null; +} + +export interface SearchProductsVariables { + after?: string | null; + first: number; + query: string; +} diff --git a/src/customers/components/CustomerAddress/CustomerAddress.tsx b/src/customers/components/CustomerAddress/CustomerAddress.tsx new file mode 100644 index 000000000..a54e15575 --- /dev/null +++ b/src/customers/components/CustomerAddress/CustomerAddress.tsx @@ -0,0 +1,115 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardActions from "@material-ui/core/CardActions"; +import CardContent from "@material-ui/core/CardContent"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import AddressFormatter from "@saleor/components/AddressFormatter"; +import CardMenu from "@saleor/components/CardMenu"; +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { AddressTypeEnum } from "../../../types/globalTypes"; +import { CustomerAddresses_user_addresses } from "../../types/CustomerAddresses"; + +export interface CustomerAddressProps { + address: CustomerAddresses_user_addresses; + disabled: boolean; + isDefaultBillingAddress: boolean; + isDefaultShippingAddress: boolean; + addressNumber: number; + onEdit: () => void; + onRemove: () => void; + onSetAsDefault: (type: AddressTypeEnum) => void; +} + +const styles = createStyles({ + actions: { + flexDirection: "row" + }, + actionsContainer: { + display: "flex", + flexDirection: "column", + height: "100%", + justifyContent: "flex-end" + }, + card: { + display: "flex", + flexDirection: "column" + } +}); +const CustomerAddress = withStyles(styles, { name: "CustomerAddress" })( + ({ + address, + addressNumber, + classes, + disabled, + isDefaultBillingAddress, + isDefaultShippingAddress, + onEdit, + onRemove, + onSetAsDefault + }: CustomerAddressProps & WithStyles) => ( + + + {i18n.t("Address {{ addressNumber }}", { + addressNumber + })} + + {isDefaultBillingAddress && isDefaultShippingAddress + ? i18n.t("Default Address") + : isDefaultShippingAddress + ? i18n.t("Default Shipping Address") + : isDefaultBillingAddress + ? i18n.t("Default Billing Address") + : null} + + + ) : ( + + ) + } + height="const" + toolbar={ + onSetAsDefault(AddressTypeEnum.SHIPPING) + }, + { + label: i18n.t("Set as default billing address", { + context: "button" + }), + onSelect: () => onSetAsDefault(AddressTypeEnum.BILLING) + } + ]} + /> + } + /> + + + +
    + + + + +
    +
    + ) +); +CustomerAddress.displayName = "CustomerAddress"; +export default CustomerAddress; diff --git a/src/customers/components/CustomerAddress/index.ts b/src/customers/components/CustomerAddress/index.ts new file mode 100644 index 000000000..937bf0048 --- /dev/null +++ b/src/customers/components/CustomerAddress/index.ts @@ -0,0 +1,2 @@ +export { default } from './CustomerAddress'; +export * from './CustomerAddress'; \ No newline at end of file diff --git a/src/customers/components/CustomerAddressDialog/CustomerAddressDialog.tsx b/src/customers/components/CustomerAddressDialog/CustomerAddressDialog.tsx new file mode 100644 index 000000000..b7dca9f12 --- /dev/null +++ b/src/customers/components/CustomerAddressDialog/CustomerAddressDialog.tsx @@ -0,0 +1,116 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import AddressEdit from "@saleor/components/AddressEdit"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { UserError } from "../../../types"; +import { AddressTypeInput } from "../../types"; +import { CustomerAddresses_user_addresses } from "../../types/CustomerAddresses"; + +export interface CustomerAddressDialogProps { + address: CustomerAddresses_user_addresses; + confirmButtonState: ConfirmButtonTransitionState; + countries: Array<{ + code: string; + label: string; + }>; + errors: UserError[]; + open: boolean; + variant: "create" | "edit"; + onClose: () => void; + onConfirm: (data: AddressTypeInput) => void; +} + +const styles = createStyles({ + overflow: { + overflowY: "visible" + } +}); + +const CustomerAddressDialog = withStyles(styles, {})( + ({ + address, + classes, + confirmButtonState, + countries, + errors, + open, + variant, + onClose, + onConfirm + }: CustomerAddressDialogProps & WithStyles) => { + const initialForm: AddressTypeInput = { + city: maybe(() => address.city, ""), + cityArea: maybe(() => address.cityArea, ""), + companyName: maybe(() => address.companyName, ""), + country: { + label: maybe(() => address.country.country, ""), + value: maybe(() => address.country.code, "") + }, + countryArea: maybe(() => address.countryArea, ""), + firstName: maybe(() => address.firstName, ""), + lastName: maybe(() => address.lastName, ""), + phone: maybe(() => address.phone, ""), + postalCode: maybe(() => address.postalCode, ""), + streetAddress1: maybe(() => address.streetAddress1, ""), + streetAddress2: maybe(() => address.streetAddress2, "") + }; + return ( + +
    + {({ change, data, errors, submit }) => ( + <> + + {variant === "create" + ? i18n.t("Add Address") + : i18n.t("Edit Address")} + + + + + + + + {i18n.t("Save Address", { context: "button" })} + + + + + )} +
    +
    + ); + } +); +CustomerAddressDialog.displayName = "CustomerAddressDialog"; +export default CustomerAddressDialog; diff --git a/src/customers/components/CustomerAddressDialog/index.ts b/src/customers/components/CustomerAddressDialog/index.ts new file mode 100644 index 000000000..a5f6e9973 --- /dev/null +++ b/src/customers/components/CustomerAddressDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from './CustomerAddressDialog'; +export * from './CustomerAddressDialog'; \ No newline at end of file diff --git a/src/customers/components/CustomerAddressListPage/CustomerAddressListPage.tsx b/src/customers/components/CustomerAddressListPage/CustomerAddressListPage.tsx new file mode 100644 index 000000000..e6df42c58 --- /dev/null +++ b/src/customers/components/CustomerAddressListPage/CustomerAddressListPage.tsx @@ -0,0 +1,144 @@ +import Button from "@material-ui/core/Button"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { AddressTypeEnum } from "../../../types/globalTypes"; +import { CustomerAddresses_user } from "../../types/CustomerAddresses"; +import CustomerAddress from "../CustomerAddress/CustomerAddress"; + +export interface CustomerAddressListPageProps { + customer: CustomerAddresses_user; + disabled: boolean; + onAdd: () => void; + onBack: () => void; + onEdit: (id: string) => void; + onRemove: (id: string) => void; + onSetAsDefault: (id: string, type: AddressTypeEnum) => void; +} + +const styles = (theme: Theme) => + createStyles({ + addButton: { + marginTop: theme.spacing.unit * 2 + }, + description: { + marginTop: theme.spacing.unit + }, + empty: { + margin: `${theme.spacing.unit * 13}px auto 0`, + textAlign: "center", + width: 600 + }, + root: { + columnGap: theme.spacing.unit * 3 + "px", + display: "grid", + gridTemplateColumns: "repeat(3, 1fr)", + rowGap: theme.spacing.unit * 3 + "px" + } + }); + +const CustomerAddressListPage = withStyles(styles, { + name: "CustomerAddressListPage" +})( + ({ + classes, + customer, + disabled, + onAdd, + onBack, + onEdit, + onRemove, + onSetAsDefault + }: CustomerAddressListPageProps & WithStyles) => { + const isEmpty = maybe(() => customer.addresses.length) === 0; + return ( + + + {i18n.t("Customer Info", { + context: "navigation" + })} + + {!isEmpty && ( + + i18n.t("{{ firstName }} {{ lastName }} Address Book", { + context: "customer address book", + firstName: customer.firstName, + lastName: customer.lastName + }) + )} + > + + + )} + {isEmpty ? ( +
    + + {i18n.t("There is no address to show for this customer")} + + + {i18n.t( + "This customer doesn’t have any adresses added to his address book. You can add address using the button below." + )} + + +
    + ) : ( +
    + {renderCollection( + maybe(() => customer.addresses), + (address, addressNumber) => ( + customer.defaultBillingAddress.id) === + maybe(() => address.id) + } + isDefaultShippingAddress={ + maybe(() => customer.defaultShippingAddress.id) === + maybe(() => address.id) + } + onEdit={() => onEdit(address.id)} + onRemove={() => onRemove(address.id)} + onSetAsDefault={type => onSetAsDefault(address.id, type)} + key={maybe(() => address.id, "skeleton")} + /> + ) + )} +
    + )} +
    + ); + } +); +CustomerAddressListPage.displayName = "CustomerAddressListPage"; +export default CustomerAddressListPage; diff --git a/src/customers/components/CustomerAddressListPage/index.ts b/src/customers/components/CustomerAddressListPage/index.ts new file mode 100644 index 000000000..a2fe444c5 --- /dev/null +++ b/src/customers/components/CustomerAddressListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from './CustomerAddressListPage'; +export * from './CustomerAddressListPage'; \ No newline at end of file diff --git a/src/customers/components/CustomerAddresses/CustomerAddresses.tsx b/src/customers/components/CustomerAddresses/CustomerAddresses.tsx new file mode 100644 index 000000000..ddc0ef85f --- /dev/null +++ b/src/customers/components/CustomerAddresses/CustomerAddresses.tsx @@ -0,0 +1,102 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import AddressFormatter from "@saleor/components/AddressFormatter"; +import CardTitle from "@saleor/components/CardTitle"; +import { Hr } from "@saleor/components/Hr"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { CustomerDetails_user } from "../../types/CustomerDetails"; + +const styles = (theme: Theme) => + createStyles({ + label: { + fontWeight: 600, + marginBottom: theme.spacing.unit + } + }); + +export interface CustomerAddressesProps extends WithStyles { + customer: CustomerDetails_user; + disabled: boolean; + onAddressManageClick: () => void; +} + +const CustomerAddresses = withStyles(styles, { name: "CustomerAddresses" })( + ({ + classes, + customer, + disabled, + onAddressManageClick + }: CustomerAddressesProps) => ( + + + {i18n.t("Manage", { context: "button" })} + + } + /> + {maybe(() => customer.defaultBillingAddress.id) !== + maybe(() => customer.defaultShippingAddress.id) ? ( + <> + {maybe(() => customer.defaultBillingAddress) !== null && ( + + + {i18n.t("Billing address")} + + customer.defaultBillingAddress)} + /> + + )} + {maybe( + () => + customer.defaultBillingAddress && customer.defaultShippingAddress + ) &&
    } + {maybe(() => customer.defaultShippingAddress) && ( + + + {i18n.t("Shipping address")} + + customer.defaultShippingAddress)} + /> + + )} + + ) : maybe(() => customer.defaultBillingAddress) === null && + maybe(() => customer.defaultShippingAddress) === null ? ( + + + {i18n.t("This customer has no addresses yet")} + + + ) : ( + + {i18n.t("Address")} + customer.defaultBillingAddress)} + /> + + )} +
    + ) +); +CustomerAddresses.displayName = "CustomerAddresses"; +export default CustomerAddresses; diff --git a/src/customers/components/CustomerAddresses/index.ts b/src/customers/components/CustomerAddresses/index.ts new file mode 100644 index 000000000..f26348a2c --- /dev/null +++ b/src/customers/components/CustomerAddresses/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerAddresses"; +export * from "./CustomerAddresses"; diff --git a/src/customers/components/CustomerCreateAddress/CustomerCreateAddress.tsx b/src/customers/components/CustomerCreateAddress/CustomerCreateAddress.tsx new file mode 100644 index 000000000..c5ce829bd --- /dev/null +++ b/src/customers/components/CustomerCreateAddress/CustomerCreateAddress.tsx @@ -0,0 +1,62 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { createStyles, WithStyles, withStyles } from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import AddressEdit from "@saleor/components/AddressEdit"; +import CardTitle from "@saleor/components/CardTitle"; +import { FormSpacer } from "@saleor/components/FormSpacer"; +import i18n from "../../../i18n"; +import { FormErrors } from "../../../types"; +import { AddressTypeInput } from "../../types"; +import { CustomerCreateData_shop_countries } from "../../types/CustomerCreateData"; + +const styles = createStyles({ + overflow: { + overflow: "visible" + } +}); + +export interface CustomerCreateAddressProps extends WithStyles { + countries: CustomerCreateData_shop_countries[]; + data: AddressTypeInput; + disabled: boolean; + errors: FormErrors; + onChange(event: React.ChangeEvent); +} + +const CustomerCreateAddress = withStyles(styles, { + name: "CustomerCreateAddress" +})( + ({ + classes, + countries, + data, + disabled, + errors, + onChange + }: CustomerCreateAddressProps) => ( + + + + + {i18n.t("The primary address of this customer.")} + + + ({ + code: country.code, + label: country.country + }))} + data={data} + disabled={disabled} + errors={errors} + onChange={onChange} + /> + + + ) +); +CustomerCreateAddress.displayName = "CustomerCreateAddress"; +export default CustomerCreateAddress; diff --git a/src/customers/components/CustomerCreateAddress/index.ts b/src/customers/components/CustomerCreateAddress/index.ts new file mode 100644 index 000000000..32bb82ede --- /dev/null +++ b/src/customers/components/CustomerCreateAddress/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerCreateAddress"; +export * from "./CustomerCreateAddress"; diff --git a/src/customers/components/CustomerCreateDetails/CustomerCreateDetails.tsx b/src/customers/components/CustomerCreateDetails/CustomerCreateDetails.tsx new file mode 100644 index 000000000..e57113dc5 --- /dev/null +++ b/src/customers/components/CustomerCreateDetails/CustomerCreateDetails.tsx @@ -0,0 +1,87 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; +import { FormErrors } from "../../../types"; +import { CustomerCreatePageFormData } from "../CustomerCreatePage"; + +const styles = (theme: Theme) => + createStyles({ + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridRowGap: theme.spacing.unit * 3 + "px", + gridTemplateColumns: "1fr 1fr" + } + }); + +export interface CustomerCreateDetailsProps extends WithStyles { + data: CustomerCreatePageFormData; + disabled: boolean; + errors: FormErrors<"customerFirstName" | "customerLastName" | "email">; + onChange: (event: React.ChangeEvent) => void; +} + +const CustomerCreateDetails = withStyles(styles, { + name: "CustomerCreateDetails" +})( + ({ + classes, + data, + disabled, + errors, + onChange + }: CustomerCreateDetailsProps) => ( + + + +
    + + + +
    +
    +
    + ) +); +CustomerCreateDetails.displayName = "CustomerCreateDetails"; +export default CustomerCreateDetails; diff --git a/src/customers/components/CustomerCreateDetails/index.ts b/src/customers/components/CustomerCreateDetails/index.ts new file mode 100644 index 000000000..b7353f089 --- /dev/null +++ b/src/customers/components/CustomerCreateDetails/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerCreateDetails"; +export * from "./CustomerCreateDetails"; diff --git a/src/customers/components/CustomerCreateNote/CustomerCreateNote.tsx b/src/customers/components/CustomerCreateNote/CustomerCreateNote.tsx new file mode 100644 index 000000000..f90e27cb6 --- /dev/null +++ b/src/customers/components/CustomerCreateNote/CustomerCreateNote.tsx @@ -0,0 +1,50 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import { FormSpacer } from "@saleor/components/FormSpacer"; +import i18n from "../../../i18n"; + +export interface CustomerCreateNoteProps { + data: { + note: string; + }; + disabled: boolean; + errors: Partial<{ + note: string; + }>; + onChange: (event: React.ChangeEvent) => void; +} + +const CustomerCreateNote: React.StatelessComponent = ({ + data, + disabled, + errors, + onChange +}) => ( + + + + + {i18n.t("Enter any extra infotmation regarding this customer.")} + + + + + +); +CustomerCreateNote.displayName = "CustomerCreateNote"; +export default CustomerCreateNote; diff --git a/src/customers/components/CustomerCreateNote/index.ts b/src/customers/components/CustomerCreateNote/index.ts new file mode 100644 index 000000000..71a3ac5dd --- /dev/null +++ b/src/customers/components/CustomerCreateNote/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerCreateNote"; +export * from "./CustomerCreateNote"; diff --git a/src/customers/components/CustomerCreatePage/CustomerCreatePage.tsx b/src/customers/components/CustomerCreatePage/CustomerCreatePage.tsx new file mode 100644 index 000000000..54e316002 --- /dev/null +++ b/src/customers/components/CustomerCreatePage/CustomerCreatePage.tsx @@ -0,0 +1,105 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import { CardSpacer } from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { UserError } from "../../../types"; +import { AddressTypeInput } from "../../types"; +import { CustomerCreateData_shop_countries } from "../../types/CustomerCreateData"; +import CustomerCreateAddress from "../CustomerCreateAddress/CustomerCreateAddress"; +import CustomerCreateDetails from "../CustomerCreateDetails"; +import CustomerCreateNote from "../CustomerCreateNote/CustomerCreateNote"; + +export interface CustomerCreatePageFormData extends AddressTypeInput { + customerFirstName: string; + customerLastName: string; + email: string; + note: string; +} + +const initialForm: CustomerCreatePageFormData = { + city: "", + cityArea: "", + companyName: "", + country: { + label: "", + value: "" + }, + countryArea: "", + customerFirstName: "", + customerLastName: "", + email: "", + firstName: "", + lastName: "", + note: "", + phone: "", + postalCode: "", + streetAddress1: "", + streetAddress2: "" +}; + +export interface CustomerCreatePageProps { + countries: CustomerCreateData_shop_countries[]; + disabled: boolean; + errors: UserError[]; + saveButtonBar: ConfirmButtonTransitionState; + onBack: () => void; + onSubmit: (data: CustomerCreatePageFormData) => void; +} + +const CustomerCreatePage: React.StatelessComponent = ({ + countries, + disabled, + errors, + saveButtonBar, + onBack, + onSubmit +}: CustomerCreatePageProps) => ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Customers")} + + +
    + + + + + +
    +
    + +
    + )} +
    +); +CustomerCreatePage.displayName = "CustomerCreatePage"; +export default CustomerCreatePage; diff --git a/src/customers/components/CustomerCreatePage/index.ts b/src/customers/components/CustomerCreatePage/index.ts new file mode 100644 index 000000000..c30fee317 --- /dev/null +++ b/src/customers/components/CustomerCreatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerCreatePage"; +export * from "./CustomerCreatePage"; diff --git a/src/customers/components/CustomerDetails/CustomerDetails.tsx b/src/customers/components/CustomerDetails/CustomerDetails.tsx new file mode 100644 index 000000000..d6f7693e0 --- /dev/null +++ b/src/customers/components/CustomerDetails/CustomerDetails.tsx @@ -0,0 +1,145 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as moment from "moment-timezone"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import { FormSpacer } from "@saleor/components/FormSpacer"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { CustomerDetails_user } from "../../types/CustomerDetails"; + +const styles = (theme: Theme) => + createStyles({ + cardTitle: { + height: 64 + }, + root: { + display: "grid" as "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridRowGap: theme.spacing.unit * 3 + "px", + gridTemplateColumns: "1fr 1fr" + } + }); + +export interface CustomerDetailsProps extends WithStyles { + customer: CustomerDetails_user; + data: { + firstName: string; + lastName: string; + email: string; + isActive: boolean; + note: string; + }; + disabled: boolean; + errors: { + firstName?: string; + lastName?: string; + email?: string; + note?: string; + }; + onChange: (event: React.ChangeEvent) => void; +} + +const CustomerDetails = withStyles(styles, { name: "CustomerDetails" })( + ({ + classes, + customer, + data, + disabled, + errors, + onChange + }: CustomerDetailsProps) => ( + + + {i18n.t("General Information")} + {customer && customer.dateJoined ? ( + + {i18n.t("Customer since: {{ month }} {{ year }}", { + month: moment(customer.dateJoined).format("MMM"), + year: moment(customer.dateJoined).format("YYYY") + })} + + ) : ( + + )} + + } + /> + + + +
    + + +
    + + + + +
    +
    + ) +); +CustomerDetails.displayName = "CustomerDetails"; +export default CustomerDetails; diff --git a/src/customers/components/CustomerDetails/index.ts b/src/customers/components/CustomerDetails/index.ts new file mode 100644 index 000000000..0c9569a11 --- /dev/null +++ b/src/customers/components/CustomerDetails/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerDetails"; +export * from "./CustomerDetails"; diff --git a/src/customers/components/CustomerDetailsPage/CustomerDetailsPage.tsx b/src/customers/components/CustomerDetailsPage/CustomerDetailsPage.tsx new file mode 100644 index 000000000..041c0fe50 --- /dev/null +++ b/src/customers/components/CustomerDetailsPage/CustomerDetailsPage.tsx @@ -0,0 +1,109 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import { CardSpacer } from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { getUserName, maybe } from "../../../misc"; +import { UserError } from "../../../types"; +import { CustomerDetails_user } from "../../types/CustomerDetails"; +import CustomerAddresses from "../CustomerAddresses/CustomerAddresses"; +import CustomerDetails from "../CustomerDetails/CustomerDetails"; +import CustomerOrders from "../CustomerOrders/CustomerOrders"; +import CustomerStats from "../CustomerStats/CustomerStats"; + +export interface CustomerDetailsPageFormData { + firstName: string; + lastName: string; + email: string; + isActive: boolean; + note: string; +} + +export interface CustomerDetailsPageProps { + customer: CustomerDetails_user; + disabled: boolean; + errors: UserError[]; + saveButtonBar: ConfirmButtonTransitionState; + onBack: () => void; + onSubmit: (data: CustomerDetailsPageFormData) => void; + onViewAllOrdersClick: () => void; + onRowClick: (id: string) => void; + onAddressManageClick: () => void; + onDelete: () => void; +} + +const CustomerDetailsPage: React.StatelessComponent< + CustomerDetailsPageProps +> = ({ + customer, + disabled, + errors, + saveButtonBar, + onBack, + onSubmit, + onViewAllOrdersClick, + onRowClick, + onAddressManageClick, + onDelete +}: CustomerDetailsPageProps) => ( +
    customer.email), + firstName: maybe(() => customer.firstName), + isActive: maybe(() => customer.isActive, false), + lastName: maybe(() => customer.lastName), + note: maybe(() => customer.note) + }} + onSubmit={onSubmit} + confirmLeave + > + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Customers")} + + +
    + + + customer.orders.edges.map(edge => edge.node))} + onViewAllOrdersClick={onViewAllOrdersClick} + onRowClick={onRowClick} + /> +
    +
    + + + +
    +
    + +
    + )} +
    +); +CustomerDetailsPage.displayName = "CustomerDetailsPage"; +export default CustomerDetailsPage; diff --git a/src/customers/components/CustomerDetailsPage/index.ts b/src/customers/components/CustomerDetailsPage/index.ts new file mode 100644 index 000000000..7625dc872 --- /dev/null +++ b/src/customers/components/CustomerDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerDetailsPage"; +export * from "./CustomerDetailsPage"; diff --git a/src/customers/components/CustomerList/CustomerList.tsx b/src/customers/components/CustomerList/CustomerList.tsx new file mode 100644 index 000000000..2dfb35021 --- /dev/null +++ b/src/customers/components/CustomerList/CustomerList.tsx @@ -0,0 +1,147 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { getUserName, maybe, renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { ListCustomers_customers_edges_node } from "../../types/ListCustomers"; + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colEmail: {}, + colName: {}, + colOrders: { + width: 200 + } + }, + colEmail: {}, + colName: {}, + colOrders: { + textAlign: "center" + }, + tableRow: { + cursor: "pointer" + } + }); + +export interface CustomerListProps + extends ListProps, + ListActions, + WithStyles { + customers: ListCustomers_customers_edges_node[]; +} + +const CustomerList = withStyles(styles, { name: "CustomerList" })( + ({ + classes, + disabled, + customers, + pageInfo, + onNextPage, + onPreviousPage, + onRowClick, + toolbar, + toggle, + toggleAll, + selected, + isChecked + }: CustomerListProps) => ( + + + + + {i18n.t("Customer Name", { context: "table header" })} + + + {i18n.t("Customer e-mail", { context: "table header" })} + + + {i18n.t("Orders", { context: "table header" })} + + + + + + + + + {renderCollection( + customers, + customer => { + const isSelected = customer ? isChecked(customer.id) : false; + + return ( + + + toggle(customer.id)} + /> + + + {getUserName(customer)} + + + {maybe(() => customer.email, )} + + + {maybe( + () => customer.orders.totalCount, + + )} + + + ); + }, + () => ( + + + {i18n.t("No customers found")} + + + ) + )} + +
    +
    + ) +); +CustomerList.displayName = "CustomerList"; +export default CustomerList; diff --git a/src/customers/components/CustomerList/index.ts b/src/customers/components/CustomerList/index.ts new file mode 100644 index 000000000..c5517efd0 --- /dev/null +++ b/src/customers/components/CustomerList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerList"; +export * from "./CustomerList"; diff --git a/src/customers/components/CustomerListPage/CustomerListPage.tsx b/src/customers/components/CustomerListPage/CustomerListPage.tsx new file mode 100644 index 000000000..d240eec34 --- /dev/null +++ b/src/customers/components/CustomerListPage/CustomerListPage.tsx @@ -0,0 +1,44 @@ +import Button from "@material-ui/core/Button"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { ListCustomers_customers_edges_node } from "../../types/ListCustomers"; +import CustomerList from "../CustomerList/CustomerList"; + +export interface CustomerListPageProps extends PageListProps, ListActions { + customers: ListCustomers_customers_edges_node[]; +} + +const CustomerListPage: React.StatelessComponent = ({ + customers, + disabled, + onAdd, + ...customerListProps +}) => ( + + + + + + +); +CustomerListPage.displayName = "CustomerListPage"; +export default CustomerListPage; diff --git a/src/customers/components/CustomerListPage/index.ts b/src/customers/components/CustomerListPage/index.ts new file mode 100644 index 000000000..59481bef5 --- /dev/null +++ b/src/customers/components/CustomerListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerListPage"; +export * from "./CustomerListPage"; diff --git a/src/customers/components/CustomerOrders/CustomerOrders.tsx b/src/customers/components/CustomerOrders/CustomerOrders.tsx new file mode 100644 index 000000000..25c22bbd1 --- /dev/null +++ b/src/customers/components/CustomerOrders/CustomerOrders.tsx @@ -0,0 +1,137 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import { DateTime } from "@saleor/components/Date"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import i18n from "../../../i18n"; +import { maybe, renderCollection, transformPaymentStatus } from "../../../misc"; +import { CustomerDetails_user_orders_edges_node } from "../../types/CustomerDetails"; + +const styles = createStyles({ + link: { + cursor: "pointer" + }, + textRight: { + textAlign: "right" + } +}); + +export interface CustomerOrdersProps extends WithStyles { + orders: CustomerDetails_user_orders_edges_node[]; + onViewAllOrdersClick: () => void; + onRowClick: (id: string) => void; +} + +const CustomerOrders = withStyles(styles, { name: "CustomerOrders" })( + ({ + classes, + orders, + onRowClick, + onViewAllOrdersClick + }: CustomerOrdersProps) => { + const orderList = orders + ? orders.map(order => ({ + ...order, + paymentStatus: transformPaymentStatus(order.paymentStatus) + })) + : undefined; + return ( + + + {i18n.t("View all orders")} + + } + /> + + + + + {i18n.t("No. of Order", { context: "table header" })} + + + {i18n.t("Date", { context: "table header" })} + + + {i18n.t("Status", { context: "table header" })} + + + {i18n.t("Total", { context: "table header" })} + + + + + {renderCollection( + orderList, + order => ( + onRowClick(order.id) : undefined} + key={order ? order.id : "skeleton"} + > + + {maybe(() => order.number) ? ( + "#" + order.number + ) : ( + + )} + + + {maybe(() => order.created) ? ( + + ) : ( + + )} + + + {maybe(() => order.paymentStatus.status) !== undefined ? ( + order.paymentStatus.status === null ? null : ( + + ) + ) : ( + + )} + + + {maybe(() => order.total.gross) ? ( + + ) : ( + + )} + + + ), + () => ( + + {i18n.t("No orders found")} + + ) + )} + +
    +
    + ); + } +); +CustomerOrders.displayName = "CustomerOrders"; +export default CustomerOrders; diff --git a/src/customers/components/CustomerOrders/index.ts b/src/customers/components/CustomerOrders/index.ts new file mode 100644 index 000000000..8a3fbc533 --- /dev/null +++ b/src/customers/components/CustomerOrders/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerOrders"; +export * from "./CustomerOrders"; diff --git a/src/customers/components/CustomerStats/CustomerStats.tsx b/src/customers/components/CustomerStats/CustomerStats.tsx new file mode 100644 index 000000000..58ca6d18f --- /dev/null +++ b/src/customers/components/CustomerStats/CustomerStats.tsx @@ -0,0 +1,79 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import { DateTime } from "@saleor/components/Date"; +import { Hr } from "@saleor/components/Hr"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { CustomerDetails_user } from "../../types/CustomerDetails"; + +const styles = (theme: Theme) => + createStyles({ + label: { + marginBottom: theme.spacing.unit + }, + value: { + fontSize: 24 + } + }); + +export interface CustomerStatsProps extends WithStyles { + customer: CustomerDetails_user; +} + +const CustomerStats = withStyles(styles, { name: "CustomerStats" })( + ({ classes, customer }: CustomerStatsProps) => ( + + + + + {i18n.t("Last login")} + + {maybe( + () => ( + + {customer.lastLogin === null ? ( + i18n.t("-") + ) : ( + + )} + + ), + + )} + +
    + + + {i18n.t("Last order")} + + {maybe( + () => ( + + {customer.lastPlacedOrder.edges.length === 0 ? ( + i18n.t("-") + ) : ( + + )} + + ), + + )} + +
    + ) +); +CustomerStats.displayName = "CustomerStats"; +export default CustomerStats; diff --git a/src/customers/components/CustomerStats/index.ts b/src/customers/components/CustomerStats/index.ts new file mode 100644 index 000000000..f34d3e1cc --- /dev/null +++ b/src/customers/components/CustomerStats/index.ts @@ -0,0 +1,2 @@ +export { default } from "./CustomerStats"; +export * from "./CustomerStats"; diff --git a/src/customers/fixtures.ts b/src/customers/fixtures.ts new file mode 100644 index 000000000..9d3e60e1d --- /dev/null +++ b/src/customers/fixtures.ts @@ -0,0 +1,1072 @@ +import { PaymentChargeStatusEnum } from "../types/globalTypes"; +import { CustomerAddresses_user } from "./types/CustomerAddresses"; +import { CustomerDetails_user } from "./types/CustomerDetails"; +import { ListCustomers_customers_edges_node } from "./types/ListCustomers"; + +export const customers = [ + { + dateJoined: "2017-10-11T13:22:30.831Z", + defaultBillingAddress: { + city: "Thompsontown", + cityArea: "Rhode Island", + companyName: null, + country: { + code: "SW", + country: "Swaziland" + }, + countryArea: "Buckinghamshire", + firstName: "Alexander", + id: "52402", + lastName: "Simonis", + phone: "+17 253-928-8945", + postalCode: "47639-5237", + streetAddress1: "83772 Savanah Summit", + streetAddress2: null + }, + defaultShippingAddress: { + city: "West Bret", + cityArea: "North Dakota", + companyName: null, + country: { + code: "SD", + country: "Sudan" + }, + countryArea: null, + firstName: "Alexander", + id: "77109", + lastName: "Simonis", + phone: "+21 463-243-6545", + postalCode: "21665", + streetAddress1: "780 Jaime Prairie", + streetAddress2: null + }, + email: "alexander_simonis@example.com", + id: "11810", + isActive: true, + isStaff: false, + note: null + }, + { + dateJoined: "2018-01-21T22:41:38.241Z", + defaultBillingAddress: { + city: "Lake Adela", + cityArea: "Maryland", + companyName: "Kemmer Group", + country: { + code: "KE", + country: "Kenya" + }, + countryArea: null, + firstName: "Augustus", + id: "81868", + lastName: "Crist", + phone: "+19 583-374-8576", + postalCode: "29966", + streetAddress1: "5656 Crooks Park", + streetAddress2: null + }, + defaultShippingAddress: { + city: "East Brandttown", + cityArea: "Missouri", + companyName: null, + country: { + code: "SO", + country: "Somalia" + }, + countryArea: null, + firstName: "Augustus", + id: "11788", + lastName: "Crist", + phone: "+52 584-961-3073", + postalCode: "80218", + streetAddress1: "37212 O'Reilly Ford", + streetAddress2: null + }, + email: "augustus_crist@example.com", + id: "34351", + isActive: true, + isStaff: false, + note: null + }, + { + dateJoined: "2018-01-19T21:36:19.298Z", + defaultBillingAddress: { + city: "East Raymond", + cityArea: "Delaware", + companyName: null, + country: { + code: "SM", + country: "San Marino" + }, + countryArea: null, + firstName: "Kelton", + id: "77939", + lastName: "Eichmann", + phone: "+17 650-119-2676", + postalCode: "94747-5311", + streetAddress1: "5060 Aufderhar Common", + streetAddress2: null + }, + defaultShippingAddress: { + city: "East Raymond", + cityArea: "Delaware", + companyName: null, + country: { + code: "SM", + country: "San Marino" + }, + countryArea: null, + firstName: "Kelton", + id: "77939", + lastName: "Eichmann", + phone: "+17 650-119-2676", + postalCode: "94747-5311", + streetAddress1: "5060 Aufderhar Common", + streetAddress2: null + }, + email: "kelton_eichmann@example.com", + id: "47883", + isActive: true, + isStaff: true, + note: null + }, + { + dateJoined: "2018-01-18T15:08:59.535Z", + defaultBillingAddress: { + city: "Torphyton", + cityArea: "Iowa", + companyName: null, + country: { + code: "CD", + country: "Chad" + }, + countryArea: null, + firstName: "Magnolia", + id: "2237", + lastName: "Brakus", + phone: "+52 136-461-3995", + postalCode: "64573", + streetAddress1: "106 Swift Squares", + streetAddress2: null + }, + defaultShippingAddress: { + city: "Torphyton", + cityArea: "Iowa", + companyName: null, + country: { + code: "CD", + country: "Chad" + }, + countryArea: null, + firstName: "Magnolia", + id: "2237", + lastName: "Brakus", + phone: "+52 136-461-3995", + postalCode: "64573", + streetAddress1: "106 Swift Squares", + streetAddress2: null + }, + email: "magnolia_brakus@example.com", + id: "53433", + isActive: true, + isStaff: false, + note: "Dolorem qui vero iure." + }, + { + dateJoined: "2017-07-22T05:21:13.774Z", + defaultBillingAddress: { + city: "Port Savanahfort", + cityArea: "Nebraska", + companyName: null, + country: { + code: "GD", + country: "Greenland" + }, + countryArea: null, + firstName: "Adonis", + id: "10532", + lastName: "Pacocha", + phone: "+11 944-018-0185", + postalCode: "52460-3432", + streetAddress1: "32181 Lindgren Turnpike", + streetAddress2: null + }, + defaultShippingAddress: { + city: "East Fletcher", + cityArea: "New Hampshire", + companyName: null, + country: { + code: "KR", + country: "Kyrgyz Republic" + }, + countryArea: null, + firstName: "Adonis", + id: "45425", + lastName: "Pacocha", + phone: "+36 549-984-7736", + postalCode: "29123-8368", + streetAddress1: "938 Jordyn Harbor", + streetAddress2: null + }, + email: "adonis_pacocha@example.com", + id: "42657", + isActive: true, + isStaff: false, + note: "Unde qui et." + }, + { + dateJoined: "2018-05-31T06:55:23.938Z", + defaultBillingAddress: { + city: "Reykjavik", + cityArea: "Höfuðborgarsvæði", + companyName: null, + country: { + code: "IS", + country: "Iceland" + }, + countryArea: null, + firstName: "Carlie", + id: "83778", + lastName: "Walsh", + phone: "+27 387-984-3969", + postalCode: "48003", + streetAddress1: "08030 Corrine Row", + streetAddress2: null + }, + defaultShippingAddress: { + city: "North Tanyafurt", + cityArea: "Wyoming", + companyName: null, + country: { + code: "RW", + country: "Rwanda" + }, + countryArea: null, + firstName: "Carlie", + id: "14941", + lastName: "Walsh", + phone: "+44 320-941-3747", + postalCode: "33296", + streetAddress1: "1231 Eriberto Stravenue", + streetAddress2: null + }, + email: "carlie_walsh@example.com", + id: "93594", + isActive: true, + isStaff: false, + note: null + }, + { + dateJoined: "2017-08-26T08:37:16.497Z", + defaultBillingAddress: { + city: "Labadiechester", + cityArea: "Iowa", + companyName: null, + country: { + code: "MA", + country: "Morocco" + }, + countryArea: "Buckinghamshire", + firstName: "Junius", + id: "86163", + lastName: "Crist", + phone: "+47 605-434-6759", + postalCode: "39521", + streetAddress1: "333 Bernie Fords", + streetAddress2: null + }, + defaultShippingAddress: { + city: "Kaylistad", + cityArea: "Louisiana", + companyName: null, + country: { + code: "EG", + country: "Equatorial Guinea" + }, + countryArea: "Bedfordshire", + firstName: "Junius", + id: "78537", + lastName: "Crist", + phone: "+20 893-019-4257", + postalCode: "43886-6932", + streetAddress1: "0597 Angeline Gateway", + streetAddress2: null + }, + email: "junius_crist@example.com", + id: "70932", + isActive: true, + isStaff: false, + note: "Et cumque consequatur aliquam." + }, + { + dateJoined: "2018-01-08T11:55:39.220Z", + defaultBillingAddress: { + city: "Lydiahaven", + cityArea: "Arkansas", + companyName: null, + country: { + code: "CB", + country: "Cambodia" + }, + countryArea: "Berkshire", + firstName: "Pedro", + id: "70545", + lastName: "Harvey", + phone: "+35 817-342-0603", + postalCode: "72196", + streetAddress1: "9280 Asa Center", + streetAddress2: null + }, + defaultShippingAddress: { + city: "Lydiahaven", + cityArea: "Arkansas", + companyName: null, + country: { + code: "CB", + country: "Cambodia" + }, + countryArea: "Berkshire", + firstName: "Pedro", + id: "70545", + lastName: "Harvey", + phone: "+35 817-342-0603", + postalCode: "72196", + streetAddress1: "9280 Asa Center", + streetAddress2: null + }, + email: "pedro_harvey@example.com", + id: "61255", + isActive: false, + isStaff: false, + note: null + }, + { + dateJoined: "2017-07-28T00:49:40.975Z", + defaultBillingAddress: { + city: "East Leilafurt", + cityArea: "Arizona", + companyName: null, + country: { + code: "BG", + country: "Bulgaria" + }, + countryArea: null, + firstName: "Raven", + id: "9167", + lastName: "Deckow", + phone: "+62 210-019-3184", + postalCode: "02296", + streetAddress1: "8546 Marks Highway", + streetAddress2: null + }, + defaultShippingAddress: { + city: "South Hendersonbury", + cityArea: "Nevada", + companyName: "Raynor Inc", + country: { + code: "TK", + country: "Turkmenistan" + }, + countryArea: null, + firstName: "Raven", + id: "48467", + lastName: "Deckow", + phone: "+46 654-130-2375", + postalCode: "00611", + streetAddress1: "87001 Howell Forge", + streetAddress2: null + }, + email: "raven_deckow@example.com", + id: "84610", + isActive: true, + isStaff: false, + note: null + }, + { + dateJoined: "2018-05-04T03:17:55.298Z", + defaultBillingAddress: { + city: "Windlerton", + cityArea: "Texas", + companyName: "Heller, Bauch and Friesen", + country: { + code: "AN", + country: "Andorra" + }, + countryArea: null, + firstName: "Paige", + id: "63622", + lastName: "Lesch", + phone: "+08 972-463-2863", + postalCode: "80681-4790", + streetAddress1: "93719 Hackett Mountain", + streetAddress2: null + }, + defaultShippingAddress: { + city: "Windlerton", + cityArea: "Texas", + companyName: "Heller, Bauch and Friesen", + country: { + code: "AN", + country: "Andorra" + }, + countryArea: null, + firstName: "Paige", + id: "63622", + lastName: "Lesch", + phone: "+08 972-463-2863", + postalCode: "80681-4790", + streetAddress1: "93719 Hackett Mountain", + streetAddress2: null + }, + email: "paige_lesch@example.com", + id: "28741", + isActive: true, + isStaff: false, + note: null + }, + { + dateJoined: "2018-01-27T13:43:07.363Z", + defaultBillingAddress: { + city: "Gleichnerborough", + cityArea: "Missouri", + companyName: null, + country: { + code: "DM", + country: "Dominica" + }, + countryArea: null, + firstName: "Santino", + id: "89962", + lastName: "Bins", + phone: "+45 844-752-5593", + postalCode: "33593-8299", + streetAddress1: "557 Jacobi Gateway", + streetAddress2: null + }, + defaultShippingAddress: { + city: "West Jolieland", + cityArea: "Connecticut", + companyName: null, + country: { + code: "SH", + country: "Saint Helena" + }, + countryArea: "Bedfordshire", + firstName: "Santino", + id: "58915", + lastName: "Bins", + phone: "+25 685-424-9436", + postalCode: "58377", + streetAddress1: "6647 Kody Locks", + streetAddress2: null + }, + email: "santino_bins@example.com", + id: "46991", + isActive: false, + isStaff: false, + note: null + }, + { + dateJoined: "2018-03-13T22:04:39.414Z", + defaultBillingAddress: { + city: "North Sister", + cityArea: "Ohio", + companyName: null, + country: { + code: "BN", + country: "Bangladesh" + }, + countryArea: "Bedfordshire", + firstName: "Quinn", + id: "94894", + lastName: "Barrows", + phone: "+35 995-317-3324", + postalCode: "41805", + streetAddress1: "146 Dee Station", + streetAddress2: null + }, + defaultShippingAddress: { + city: "North Sister", + cityArea: "Ohio", + companyName: null, + country: { + code: "BN", + country: "Bangladesh" + }, + countryArea: "Bedfordshire", + firstName: "Quinn", + id: "94894", + lastName: "Barrows", + phone: "+35 995-317-3324", + postalCode: "41805", + streetAddress1: "146 Dee Station", + streetAddress2: null + }, + email: "quinn_barrows@example.com", + id: "50687", + isActive: true, + isStaff: false, + note: null + }, + { + dateJoined: "2018-01-27T01:40:52.437Z", + defaultBillingAddress: { + city: "Kenstad", + cityArea: "Alabama", + companyName: null, + country: { + code: "UA", + country: "United Arab Emirates" + }, + countryArea: null, + firstName: "Berry", + id: "93575", + lastName: "Windler", + phone: "+41 876-373-9137", + postalCode: "89880-6342", + streetAddress1: "01419 Bernhard Plain", + streetAddress2: null + }, + defaultShippingAddress: { + city: "Kenstad", + cityArea: "Alabama", + companyName: null, + country: { + code: "UA", + country: "United Arab Emirates" + }, + countryArea: null, + firstName: "Berry", + id: "93575", + lastName: "Windler", + phone: "+41 876-373-9137", + postalCode: "89880-6342", + streetAddress1: "01419 Bernhard Plain", + streetAddress2: null + }, + email: "berry_windler@example.com", + id: "36798", + isActive: true, + isStaff: false, + note: null + }, + { + dateJoined: "2017-07-17T22:43:18.274Z", + defaultBillingAddress: { + city: "Jamilstad", + cityArea: "Idaho", + companyName: "Kilback - Crooks", + country: { + code: "UR", + country: "Uruguay" + }, + countryArea: null, + firstName: "Johnathon", + id: "78744", + lastName: "Kohler", + phone: "+63 888-798-4522", + postalCode: "43892-8110", + streetAddress1: "287 Rowe Mews", + streetAddress2: null + }, + defaultShippingAddress: { + city: "Jamilstad", + cityArea: "Idaho", + companyName: "Kilback - Crooks", + country: { + code: "UR", + country: "Uruguay" + }, + countryArea: null, + firstName: "Johnathon", + id: "78744", + lastName: "Kohler", + phone: "+63 888-798-4522", + postalCode: "43892-8110", + streetAddress1: "287 Rowe Mews", + streetAddress2: null + }, + email: "johnathon_kohler@example.com", + id: "98483", + isActive: true, + isStaff: false, + note: null + }, + { + dateJoined: "2017-07-10T00:09:56.552Z", + defaultBillingAddress: { + city: "Keltonland", + cityArea: "West Virginia", + companyName: "Bailey, Barrows and Prosacco", + country: { + code: "DN", + country: "Denmark" + }, + countryArea: null, + firstName: "Linwood", + id: "19005", + lastName: "Windler", + phone: "+60 815-222-0791", + postalCode: "12595", + streetAddress1: "496 Sporer Mountain", + streetAddress2: null + }, + defaultShippingAddress: { + city: "Keltonland", + cityArea: "West Virginia", + companyName: "Bailey, Barrows and Prosacco", + country: { + code: "DN", + country: "Denmark" + }, + countryArea: null, + firstName: "Linwood", + id: "19005", + lastName: "Windler", + phone: "+60 815-222-0791", + postalCode: "12595", + streetAddress1: "496 Sporer Mountain", + streetAddress2: null + }, + email: "linwood_windler@example.com", + id: "18050", + isActive: true, + isStaff: false, + note: null + }, + { + dateJoined: "2017-08-25T06:08:19.951Z", + defaultBillingAddress: { + city: "West Feliciamouth", + cityArea: "Montana", + companyName: null, + country: { + code: "JA", + country: "Japan" + }, + countryArea: null, + firstName: "Timmy", + id: "33855", + lastName: "Macejkovic", + phone: "+41 460-907-9374", + postalCode: "15926", + streetAddress1: "0238 Cremin Freeway", + streetAddress2: null + }, + defaultShippingAddress: { + city: "Larkinstad", + cityArea: "California", + companyName: null, + country: { + code: "SO", + country: "Somalia" + }, + countryArea: null, + firstName: "Timmy", + id: "67467", + lastName: "Macejkovic", + phone: "+64 943-882-1295", + postalCode: "43425", + streetAddress1: "96332 Corkery Lane", + streetAddress2: null + }, + email: "timmy_macejkovic@example.com", + id: "65578", + isActive: true, + isStaff: false, + note: "Dolorem vitae." + } +]; + +export const customerList: ListCustomers_customers_edges_node[] = [ + { + __typename: "User", + email: "Curtis.bailey@example.com", + firstName: "curtis", + id: "VXNlcjox", + lastName: "Bailey", + orders: { + __typename: "OrderCountableConnection", + totalCount: 2 + } + }, + { + __typename: "User", + email: "curtis.bailey@example.com", + firstName: "Curtis", + id: "VXNlcjox", + lastName: "Bailey", + orders: { + __typename: "OrderCountableConnection", + totalCount: 2 + } + }, + { + __typename: "User", + email: "elizabeth.vaughn@example.com", + firstName: "Elizabeth", + id: "VXNlcjoy", + lastName: "Vaughn", + orders: { + __typename: "OrderCountableConnection", + totalCount: 1 + } + }, + { + __typename: "User", + email: "michael.martinez@example.com", + firstName: "Michael", + id: "VXNlcjoz", + lastName: "Martinez", + orders: { + __typename: "OrderCountableConnection", + totalCount: 1 + } + }, + { + __typename: "User", + email: "kayla.griffin@example.com", + firstName: "Kayla", + id: "VXNlcjo0", + lastName: "Griffin", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "donna.robinson@example.com", + firstName: "Donna", + id: "VXNlcjo1", + lastName: "Robinson", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "james.ball@example.com", + firstName: "James", + id: "VXNlcjo2", + lastName: "Bqall", + orders: { + __typename: "OrderCountableConnection", + totalCount: 1 + } + }, + { + __typename: "User", + email: "anthony.gonzalez@example.com", + firstName: "Anthony", + id: "VXNlcjo3", + lastName: "Gonzalez", + orders: { + __typename: "OrderCountableConnection", + totalCount: 2 + } + }, + { + __typename: "User", + email: "anthony.gonzalez@example.com", + firstName: "Anthony", + id: "VXNlcjo3", + lastName: "Gonzalez", + orders: { + __typename: "OrderCountableConnection", + totalCount: 2 + } + }, + { + __typename: "User", + email: "wesley.davis@example.com", + firstName: "Wesley", + id: "VXNlcjo4", + lastName: "Davis", + orders: { + __typename: "OrderCountableConnection", + totalCount: 1 + } + }, + { + __typename: "User", + email: "laura.stone@example.com", + firstName: "Laura", + id: "VXNlcjo5", + lastName: "Stone", + orders: { + __typename: "OrderCountableConnection", + totalCount: 1 + } + }, + { + __typename: "User", + email: "william.miller@example.com", + firstName: "William", + id: "VXNlcjoxMA==", + lastName: "Miller", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "donald.solomon@example.com", + firstName: "Donald", + id: "VXNlcjoxMQ==", + lastName: "Solomon", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "anthony.young@example.com", + firstName: "Anthony", + id: "VXNlcjoxMg==", + lastName: "Young", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "sharon.hanson@example.com", + firstName: "Hanson", + id: "VXNlcjoxMw==", + lastName: "Sharon", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "laura.jensen@example.com", + firstName: "Laura", + id: "VXNlcjoxNA==", + lastName: "Jensen", + orders: { + __typename: "OrderCountableConnection", + totalCount: 1 + } + }, + { + __typename: "User", + email: "mark.lee@example.com", + firstName: "Mark", + id: "VXNlcjoxNQ==", + lastName: "Lee", + orders: { + __typename: "OrderCountableConnection", + totalCount: 1 + } + }, + { + __typename: "User", + email: "david.lawson@example.com", + firstName: "David", + id: "VXNlcjoxNg==", + lastName: "Lawson", + orders: { + __typename: "OrderCountableConnection", + totalCount: 2 + } + }, + { + __typename: "User", + email: "david.lawson@example.com", + firstName: "David", + id: "VXNlcjoxNg==", + lastName: "Lawson", + orders: { + __typename: "OrderCountableConnection", + totalCount: 2 + } + }, + { + __typename: "User", + email: "faith.smith@example.com", + firstName: "Faith", + id: "VXNlcjoxNw==", + lastName: "Smith", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "john.jones@example.com", + firstName: "John", + id: "VXNlcjoxOA==", + lastName: "Jones", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "ronald.fisher@example.com", + firstName: "Ronald", + id: "VXNlcjoxOQ==", + lastName: "Fisher", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "jason.gray@example.com", + firstName: "Jason", + id: "VXNlcjoyMA==", + lastName: "Gray", + orders: { + __typename: "OrderCountableConnection", + totalCount: 0 + } + }, + { + __typename: "User", + email: "admin@example.com", + firstName: "Tom", + id: "VXNlcjoyMQ==", + lastName: "Cooper", + orders: { + __typename: "OrderCountableConnection", + totalCount: 6 + } + } +]; +export const customer: CustomerDetails_user & CustomerAddresses_user = { + __typename: "User", + addresses: [ + { + __typename: "Address", + city: "Port Danielshire", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "SE", + country: "Szwecja" + }, + countryArea: "", + firstName: "Elizabeth", + id: "QWRkcmVzczoy", + lastName: "Vaughn", + phone: "", + postalCode: "52203", + streetAddress1: "419 Ruiz Orchard Apt. 199", + streetAddress2: "0238 Cremin Freeway" + }, + { + __typename: "Address", + city: "West Feliciamouth", + cityArea: "Montana", + companyName: null, + country: { + __typename: "CountryDisplay", + code: "JA", + country: "Japan" + }, + countryArea: null, + firstName: "Timmy", + id: "33855", + lastName: "Macejkovic", + phone: "+41 460-907-9374", + postalCode: "15926", + streetAddress1: "0238 Cremin Freeway", + streetAddress2: null + } + ], + dateJoined: "2017-05-07T09:37:30.124154+00:00", + firstName: "Tom", + + defaultBillingAddress: { + __typename: "Address", + city: "Port Danielshire", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "SE", + country: "Szwecja" + }, + countryArea: "", + firstName: "Elizabeth", + id: "QWRkcmVzczoy", + lastName: "Vaughn", + phone: "", + postalCode: "52203", + streetAddress1: "419 Ruiz Orchard Apt. 199", + streetAddress2: "" + }, + defaultShippingAddress: { + __typename: "Address", + city: "Port Danielshire", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "SE", + country: "Szwecja" + }, + countryArea: "", + firstName: "Elizabeth", + id: "QWRkcmVzczoy", + lastName: "Vaughn", + phone: "", + postalCode: "52203", + streetAddress1: "419 Ruiz Orchard Apt. 199", + streetAddress2: "" + }, + email: "elizabeth.vaughn@example.com", + id: "VXNlcjoy", + isActive: true, + lastLogin: "2018-05-07T09:37:30.124154+00:00", + lastName: "Cooper", + lastPlacedOrder: { + __typename: "OrderCountableConnection", + edges: [ + { + __typename: "OrderCountableEdge", + node: { + __typename: "Order", + created: "2018-05-07T09:37:30.124154+00:00", + id: "T3JkZXI6MTk=" + } + } + ] + }, + note: null, + orders: { + __typename: "OrderCountableConnection", + edges: [ + { + __typename: "OrderCountableEdge", + node: { + __typename: "Order", + created: "2018-05-07T09:37:30.124154+00:00", + id: "T3JkZXI6MTk=", + number: "8234", + paymentStatus: PaymentChargeStatusEnum.FULLY_CHARGED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 1215.89, + currency: "USD" + } + } + } + } + ] + } +}; diff --git a/src/customers/index.tsx b/src/customers/index.tsx new file mode 100644 index 000000000..b06576887 --- /dev/null +++ b/src/customers/index.tsx @@ -0,0 +1,76 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { + customerAddPath, + customerAddressesPath, + CustomerAddressesUrlQueryParams, + customerListPath, + CustomerListUrlQueryParams, + customerPath, + CustomerUrlQueryParams +} from "./urls"; +import CustomerAddressesViewComponent from "./views/CustomerAddresses"; +import CustomerCreateView from "./views/CustomerCreate"; +import CustomerDetailsViewComponent from "./views/CustomerDetails"; +import CustomerListViewComponent from "./views/CustomerList"; + +const CustomerListView: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: CustomerListUrlQueryParams = qs; + return ; +}; + +interface CustomerDetailsRouteParams { + id: string; +} +const CustomerDetailsView: React.StatelessComponent< + RouteComponentProps +> = ({ location, match }) => { + const qs = parseQs(location.search.substr(1)); + const params: CustomerUrlQueryParams = qs; + + return ( + + ); +}; + +interface CustomerAddressesRouteParams { + id: string; +} +const CustomerAddressesView: React.StatelessComponent< + RouteComponentProps +> = ({ match }) => { + const qs = parseQs(location.search.substr(1)); + const params: CustomerAddressesUrlQueryParams = qs; + + return ( + + ); +}; + +export const CustomerSection: React.StatelessComponent<{}> = () => ( + <> + + + + + + + + +); diff --git a/src/customers/mutations.ts b/src/customers/mutations.ts new file mode 100644 index 000000000..1c80da368 --- /dev/null +++ b/src/customers/mutations.ts @@ -0,0 +1,188 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { fragmentAddress } from "../orders/queries"; +import { customerAddressesFragment, customerDetailsFragment } from "./queries"; +import { + BulkRemoveCustomers, + BulkRemoveCustomersVariables +} from "./types/BulkRemoveCustomers"; +import { + CreateCustomer, + CreateCustomerVariables +} from "./types/CreateCustomer"; +import { + CreateCustomerAddress, + CreateCustomerAddressVariables +} from "./types/CreateCustomerAddress"; +import { + RemoveCustomer, + RemoveCustomerVariables +} from "./types/RemoveCustomer"; +import { + RemoveCustomerAddress, + RemoveCustomerAddressVariables +} from "./types/RemoveCustomerAddress"; +import { + SetCustomerDefaultAddress, + SetCustomerDefaultAddressVariables +} from "./types/SetCustomerDefaultAddress"; +import { + UpdateCustomer, + UpdateCustomerVariables +} from "./types/UpdateCustomer"; +import { + UpdateCustomerAddress, + UpdateCustomerAddressVariables +} from "./types/UpdateCustomerAddress"; + +const updateCustomer = gql` + ${customerDetailsFragment} + mutation UpdateCustomer($id: ID!, $input: CustomerInput!) { + customerUpdate(id: $id, input: $input) { + errors { + field + message + } + user { + ...CustomerDetailsFragment + } + } + } +`; +export const TypedUpdateCustomerMutation = TypedMutation< + UpdateCustomer, + UpdateCustomerVariables +>(updateCustomer); + +const createCustomer = gql` + mutation CreateCustomer($input: UserCreateInput!) { + customerCreate(input: $input) { + errors { + field + message + } + user { + id + } + } + } +`; +export const TypedCreateCustomerMutation = TypedMutation< + CreateCustomer, + CreateCustomerVariables +>(createCustomer); + +const removeCustomer = gql` + mutation RemoveCustomer($id: ID!) { + customerDelete(id: $id) { + errors { + field + message + } + } + } +`; +export const TypedRemoveCustomerMutation = TypedMutation< + RemoveCustomer, + RemoveCustomerVariables +>(removeCustomer); + +const setCustomerDefaultAddress = gql` + ${customerAddressesFragment} + mutation SetCustomerDefaultAddress( + $addressId: ID! + $userId: ID! + $type: AddressTypeEnum! + ) { + addressSetDefault(addressId: $addressId, userId: $userId, type: $type) { + errors { + field + message + } + user { + ...CustomerAddressesFragment + } + } + } +`; +export const TypedSetCustomerDefaultAddressMutation = TypedMutation< + SetCustomerDefaultAddress, + SetCustomerDefaultAddressVariables +>(setCustomerDefaultAddress); + +const createCustomerAddress = gql` + ${customerAddressesFragment} + ${fragmentAddress} + mutation CreateCustomerAddress($id: ID!, $input: AddressInput!) { + addressCreate(userId: $id, input: $input) { + errors { + field + message + } + address { + ...AddressFragment + } + user { + ...CustomerAddressesFragment + } + } + } +`; +export const TypedCreateCustomerAddressMutation = TypedMutation< + CreateCustomerAddress, + CreateCustomerAddressVariables +>(createCustomerAddress); + +const updateCustomerAddress = gql` + ${fragmentAddress} + mutation UpdateCustomerAddress($id: ID!, $input: AddressInput!) { + addressUpdate(id: $id, input: $input) { + errors { + field + message + } + address { + ...AddressFragment + } + } + } +`; +export const TypedUpdateCustomerAddressMutation = TypedMutation< + UpdateCustomerAddress, + UpdateCustomerAddressVariables +>(updateCustomerAddress); + +const removeCustomerAddress = gql` + ${customerAddressesFragment} + mutation RemoveCustomerAddress($id: ID!) { + addressDelete(id: $id) { + errors { + field + message + } + user { + ...CustomerAddressesFragment + } + } + } +`; +export const TypedRemoveCustomerAddressMutation = TypedMutation< + RemoveCustomerAddress, + RemoveCustomerAddressVariables +>(removeCustomerAddress); + +export const bulkRemoveCustomers = gql` + mutation BulkRemoveCustomers($ids: [ID]!) { + customerBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedBulkRemoveCustomers = TypedMutation< + BulkRemoveCustomers, + BulkRemoveCustomersVariables +>(bulkRemoveCustomers); diff --git a/src/customers/queries.ts b/src/customers/queries.ts new file mode 100644 index 000000000..9030ecbdf --- /dev/null +++ b/src/customers/queries.ts @@ -0,0 +1,153 @@ +import gql from "graphql-tag"; + +import { fragmentAddress } from "../orders/queries"; +import { TypedQuery } from "../queries"; +import { + CustomerAddresses, + CustomerAddressesVariables +} from "./types/CustomerAddresses"; +import { CustomerCreateData } from "./types/CustomerCreateData"; +import { + CustomerDetails, + CustomerDetailsVariables +} from "./types/CustomerDetails"; +import { ListCustomers, ListCustomersVariables } from "./types/ListCustomers"; + +export const customerFragment = gql` + fragment CustomerFragment on User { + id + email + firstName + lastName + } +`; + +export const customerDetailsFragment = gql` + ${customerFragment} + ${fragmentAddress} + fragment CustomerDetailsFragment on User { + ...CustomerFragment + dateJoined + lastLogin + defaultShippingAddress { + ...AddressFragment + } + defaultBillingAddress { + ...AddressFragment + } + note + isActive + } +`; + +export const customerAddressesFragment = gql` + ${customerFragment} + ${fragmentAddress} + fragment CustomerAddressesFragment on User { + ...CustomerFragment + addresses { + ...AddressFragment + } + defaultBillingAddress { + id + } + defaultShippingAddress { + id + } + } +`; + +const customerList = gql` + ${customerFragment} + query ListCustomers( + $after: String + $before: String + $first: Int + $last: Int + ) { + customers(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + ...CustomerFragment + orders { + totalCount + } + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + } + } +`; +export const TypedCustomerListQuery = TypedQuery< + ListCustomers, + ListCustomersVariables +>(customerList); + +const customerDetails = gql` + ${customerDetailsFragment} + query CustomerDetails($id: ID!) { + user(id: $id) { + ...CustomerDetailsFragment + orders(last: 5) { + edges { + node { + id + created + number + paymentStatus + total { + gross { + currency + amount + } + } + } + } + } + lastPlacedOrder: orders(last: 1) { + edges { + node { + id + created + } + } + } + } + } +`; +export const TypedCustomerDetailsQuery = TypedQuery< + CustomerDetails, + CustomerDetailsVariables +>(customerDetails); + +const customerAddresses = gql` + ${customerAddressesFragment} + query CustomerAddresses($id: ID!) { + user(id: $id) { + ...CustomerAddressesFragment + } + } +`; +export const TypedCustomerAddressesQuery = TypedQuery< + CustomerAddresses, + CustomerAddressesVariables +>(customerAddresses); + +const customerCreateData = gql` + query CustomerCreateData { + shop { + countries { + code + country + } + } + } +`; +export const TypedCustomerCreateDataQuery = TypedQuery( + customerCreateData +); diff --git a/src/customers/types.ts b/src/customers/types.ts new file mode 100644 index 000000000..1eee8acac --- /dev/null +++ b/src/customers/types.ts @@ -0,0 +1,33 @@ +export interface AddressTypeInput { + city: string; + cityArea?: string; + companyName?: string; + country: { + label: string; + value: string; + }; + countryArea?: string; + firstName: string; + lastName: string; + phone: string; + postalCode: string; + streetAddress1: string; + streetAddress2?: string; +} +export interface AddressType { + id: string; + city: string; + cityArea?: string; + companyName?: string; + country: { + code: string; + country: string; + }; + countryArea?: string; + firstName: string; + lastName: string; + phone: string; + postalCode: string; + streetAddress1: string; + streetAddress2?: string; +} diff --git a/src/customers/types/BulkRemoveCustomers.ts b/src/customers/types/BulkRemoveCustomers.ts new file mode 100644 index 000000000..06251bbbc --- /dev/null +++ b/src/customers/types/BulkRemoveCustomers.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: BulkRemoveCustomers +// ==================================================== + +export interface BulkRemoveCustomers_customerBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface BulkRemoveCustomers_customerBulkDelete { + __typename: "CustomerBulkDelete"; + errors: BulkRemoveCustomers_customerBulkDelete_errors[] | null; +} + +export interface BulkRemoveCustomers { + customerBulkDelete: BulkRemoveCustomers_customerBulkDelete | null; +} + +export interface BulkRemoveCustomersVariables { + ids: (string | null)[]; +} diff --git a/src/customers/types/CreateCustomer.ts b/src/customers/types/CreateCustomer.ts new file mode 100644 index 000000000..a816a40d0 --- /dev/null +++ b/src/customers/types/CreateCustomer.ts @@ -0,0 +1,34 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { UserCreateInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: CreateCustomer +// ==================================================== + +export interface CreateCustomer_customerCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CreateCustomer_customerCreate_user { + __typename: "User"; + id: string; +} + +export interface CreateCustomer_customerCreate { + __typename: "CustomerCreate"; + errors: CreateCustomer_customerCreate_errors[] | null; + user: CreateCustomer_customerCreate_user | null; +} + +export interface CreateCustomer { + customerCreate: CreateCustomer_customerCreate | null; +} + +export interface CreateCustomerVariables { + input: UserCreateInput; +} diff --git a/src/customers/types/CreateCustomerAddress.ts b/src/customers/types/CreateCustomerAddress.ts new file mode 100644 index 000000000..f49e42228 --- /dev/null +++ b/src/customers/types/CreateCustomerAddress.ts @@ -0,0 +1,96 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AddressInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: CreateCustomerAddress +// ==================================================== + +export interface CreateCustomerAddress_addressCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CreateCustomerAddress_addressCreate_address_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CreateCustomerAddress_addressCreate_address { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: CreateCustomerAddress_addressCreate_address_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface CreateCustomerAddress_addressCreate_user_addresses_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CreateCustomerAddress_addressCreate_user_addresses { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: CreateCustomerAddress_addressCreate_user_addresses_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface CreateCustomerAddress_addressCreate_user_defaultBillingAddress { + __typename: "Address"; + id: string; +} + +export interface CreateCustomerAddress_addressCreate_user_defaultShippingAddress { + __typename: "Address"; + id: string; +} + +export interface CreateCustomerAddress_addressCreate_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + addresses: (CreateCustomerAddress_addressCreate_user_addresses | null)[] | null; + defaultBillingAddress: CreateCustomerAddress_addressCreate_user_defaultBillingAddress | null; + defaultShippingAddress: CreateCustomerAddress_addressCreate_user_defaultShippingAddress | null; +} + +export interface CreateCustomerAddress_addressCreate { + __typename: "AddressCreate"; + errors: CreateCustomerAddress_addressCreate_errors[] | null; + address: CreateCustomerAddress_addressCreate_address | null; + user: CreateCustomerAddress_addressCreate_user | null; +} + +export interface CreateCustomerAddress { + addressCreate: CreateCustomerAddress_addressCreate | null; +} + +export interface CreateCustomerAddressVariables { + id: string; + input: AddressInput; +} diff --git a/src/customers/types/CustomerAddresses.ts b/src/customers/types/CustomerAddresses.ts new file mode 100644 index 000000000..b95d46a28 --- /dev/null +++ b/src/customers/types/CustomerAddresses.ts @@ -0,0 +1,58 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: CustomerAddresses +// ==================================================== + +export interface CustomerAddresses_user_addresses_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CustomerAddresses_user_addresses { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: CustomerAddresses_user_addresses_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface CustomerAddresses_user_defaultBillingAddress { + __typename: "Address"; + id: string; +} + +export interface CustomerAddresses_user_defaultShippingAddress { + __typename: "Address"; + id: string; +} + +export interface CustomerAddresses_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + addresses: (CustomerAddresses_user_addresses | null)[] | null; + defaultBillingAddress: CustomerAddresses_user_defaultBillingAddress | null; + defaultShippingAddress: CustomerAddresses_user_defaultShippingAddress | null; +} + +export interface CustomerAddresses { + user: CustomerAddresses_user | null; +} + +export interface CustomerAddressesVariables { + id: string; +} diff --git a/src/customers/types/CustomerAddressesFragment.ts b/src/customers/types/CustomerAddressesFragment.ts new file mode 100644 index 000000000..07fd6c695 --- /dev/null +++ b/src/customers/types/CustomerAddressesFragment.ts @@ -0,0 +1,50 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: CustomerAddressesFragment +// ==================================================== + +export interface CustomerAddressesFragment_addresses_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CustomerAddressesFragment_addresses { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: CustomerAddressesFragment_addresses_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface CustomerAddressesFragment_defaultBillingAddress { + __typename: "Address"; + id: string; +} + +export interface CustomerAddressesFragment_defaultShippingAddress { + __typename: "Address"; + id: string; +} + +export interface CustomerAddressesFragment { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + addresses: (CustomerAddressesFragment_addresses | null)[] | null; + defaultBillingAddress: CustomerAddressesFragment_defaultBillingAddress | null; + defaultShippingAddress: CustomerAddressesFragment_defaultShippingAddress | null; +} diff --git a/src/customers/types/CustomerCreateData.ts b/src/customers/types/CustomerCreateData.ts new file mode 100644 index 000000000..2f5029892 --- /dev/null +++ b/src/customers/types/CustomerCreateData.ts @@ -0,0 +1,22 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: CustomerCreateData +// ==================================================== + +export interface CustomerCreateData_shop_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CustomerCreateData_shop { + __typename: "Shop"; + countries: (CustomerCreateData_shop_countries | null)[]; +} + +export interface CustomerCreateData { + shop: CustomerCreateData_shop | null; +} diff --git a/src/customers/types/CustomerDetails.ts b/src/customers/types/CustomerDetails.ts new file mode 100644 index 000000000..84cd2e038 --- /dev/null +++ b/src/customers/types/CustomerDetails.ts @@ -0,0 +1,123 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PaymentChargeStatusEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: CustomerDetails +// ==================================================== + +export interface CustomerDetails_user_defaultShippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CustomerDetails_user_defaultShippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: CustomerDetails_user_defaultShippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface CustomerDetails_user_defaultBillingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CustomerDetails_user_defaultBillingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: CustomerDetails_user_defaultBillingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface CustomerDetails_user_orders_edges_node_total_gross { + __typename: "Money"; + currency: string; + amount: number; +} + +export interface CustomerDetails_user_orders_edges_node_total { + __typename: "TaxedMoney"; + gross: CustomerDetails_user_orders_edges_node_total_gross; +} + +export interface CustomerDetails_user_orders_edges_node { + __typename: "Order"; + id: string; + created: any; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + total: CustomerDetails_user_orders_edges_node_total | null; +} + +export interface CustomerDetails_user_orders_edges { + __typename: "OrderCountableEdge"; + node: CustomerDetails_user_orders_edges_node; +} + +export interface CustomerDetails_user_orders { + __typename: "OrderCountableConnection"; + edges: CustomerDetails_user_orders_edges[]; +} + +export interface CustomerDetails_user_lastPlacedOrder_edges_node { + __typename: "Order"; + id: string; + created: any; +} + +export interface CustomerDetails_user_lastPlacedOrder_edges { + __typename: "OrderCountableEdge"; + node: CustomerDetails_user_lastPlacedOrder_edges_node; +} + +export interface CustomerDetails_user_lastPlacedOrder { + __typename: "OrderCountableConnection"; + edges: CustomerDetails_user_lastPlacedOrder_edges[]; +} + +export interface CustomerDetails_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + dateJoined: any; + lastLogin: any | null; + defaultShippingAddress: CustomerDetails_user_defaultShippingAddress | null; + defaultBillingAddress: CustomerDetails_user_defaultBillingAddress | null; + note: string | null; + isActive: boolean; + orders: CustomerDetails_user_orders | null; + lastPlacedOrder: CustomerDetails_user_lastPlacedOrder | null; +} + +export interface CustomerDetails { + user: CustomerDetails_user | null; +} + +export interface CustomerDetailsVariables { + id: string; +} diff --git a/src/customers/types/CustomerDetailsFragment.ts b/src/customers/types/CustomerDetailsFragment.ts new file mode 100644 index 000000000..cd2b1b0e8 --- /dev/null +++ b/src/customers/types/CustomerDetailsFragment.ts @@ -0,0 +1,65 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: CustomerDetailsFragment +// ==================================================== + +export interface CustomerDetailsFragment_defaultShippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CustomerDetailsFragment_defaultShippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: CustomerDetailsFragment_defaultShippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface CustomerDetailsFragment_defaultBillingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CustomerDetailsFragment_defaultBillingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: CustomerDetailsFragment_defaultBillingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface CustomerDetailsFragment { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + dateJoined: any; + lastLogin: any | null; + defaultShippingAddress: CustomerDetailsFragment_defaultShippingAddress | null; + defaultBillingAddress: CustomerDetailsFragment_defaultBillingAddress | null; + note: string | null; + isActive: boolean; +} diff --git a/src/customers/types/CustomerFragment.ts b/src/customers/types/CustomerFragment.ts new file mode 100644 index 000000000..f945af27f --- /dev/null +++ b/src/customers/types/CustomerFragment.ts @@ -0,0 +1,15 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: CustomerFragment +// ==================================================== + +export interface CustomerFragment { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; +} diff --git a/src/customers/types/ListCustomers.ts b/src/customers/types/ListCustomers.ts new file mode 100644 index 000000000..aeaf81931 --- /dev/null +++ b/src/customers/types/ListCustomers.ts @@ -0,0 +1,51 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: ListCustomers +// ==================================================== + +export interface ListCustomers_customers_edges_node_orders { + __typename: "OrderCountableConnection"; + totalCount: number | null; +} + +export interface ListCustomers_customers_edges_node { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + orders: ListCustomers_customers_edges_node_orders | null; +} + +export interface ListCustomers_customers_edges { + __typename: "UserCountableEdge"; + node: ListCustomers_customers_edges_node; +} + +export interface ListCustomers_customers_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface ListCustomers_customers { + __typename: "UserCountableConnection"; + edges: ListCustomers_customers_edges[]; + pageInfo: ListCustomers_customers_pageInfo; +} + +export interface ListCustomers { + customers: ListCustomers_customers | null; +} + +export interface ListCustomersVariables { + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/customers/types/RemoveCustomer.ts b/src/customers/types/RemoveCustomer.ts new file mode 100644 index 000000000..70a93326d --- /dev/null +++ b/src/customers/types/RemoveCustomer.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: RemoveCustomer +// ==================================================== + +export interface RemoveCustomer_customerDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface RemoveCustomer_customerDelete { + __typename: "CustomerDelete"; + errors: RemoveCustomer_customerDelete_errors[] | null; +} + +export interface RemoveCustomer { + customerDelete: RemoveCustomer_customerDelete | null; +} + +export interface RemoveCustomerVariables { + id: string; +} diff --git a/src/customers/types/RemoveCustomerAddress.ts b/src/customers/types/RemoveCustomerAddress.ts new file mode 100644 index 000000000..a4f6cd9ee --- /dev/null +++ b/src/customers/types/RemoveCustomerAddress.ts @@ -0,0 +1,70 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: RemoveCustomerAddress +// ==================================================== + +export interface RemoveCustomerAddress_addressDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface RemoveCustomerAddress_addressDelete_user_addresses_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface RemoveCustomerAddress_addressDelete_user_addresses { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: RemoveCustomerAddress_addressDelete_user_addresses_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface RemoveCustomerAddress_addressDelete_user_defaultBillingAddress { + __typename: "Address"; + id: string; +} + +export interface RemoveCustomerAddress_addressDelete_user_defaultShippingAddress { + __typename: "Address"; + id: string; +} + +export interface RemoveCustomerAddress_addressDelete_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + addresses: (RemoveCustomerAddress_addressDelete_user_addresses | null)[] | null; + defaultBillingAddress: RemoveCustomerAddress_addressDelete_user_defaultBillingAddress | null; + defaultShippingAddress: RemoveCustomerAddress_addressDelete_user_defaultShippingAddress | null; +} + +export interface RemoveCustomerAddress_addressDelete { + __typename: "AddressDelete"; + errors: RemoveCustomerAddress_addressDelete_errors[] | null; + user: RemoveCustomerAddress_addressDelete_user | null; +} + +export interface RemoveCustomerAddress { + addressDelete: RemoveCustomerAddress_addressDelete | null; +} + +export interface RemoveCustomerAddressVariables { + id: string; +} diff --git a/src/customers/types/SetCustomerDefaultAddress.ts b/src/customers/types/SetCustomerDefaultAddress.ts new file mode 100644 index 000000000..e2732c8c7 --- /dev/null +++ b/src/customers/types/SetCustomerDefaultAddress.ts @@ -0,0 +1,74 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AddressTypeEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: SetCustomerDefaultAddress +// ==================================================== + +export interface SetCustomerDefaultAddress_addressSetDefault_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface SetCustomerDefaultAddress_addressSetDefault_user_addresses_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface SetCustomerDefaultAddress_addressSetDefault_user_addresses { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: SetCustomerDefaultAddress_addressSetDefault_user_addresses_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface SetCustomerDefaultAddress_addressSetDefault_user_defaultBillingAddress { + __typename: "Address"; + id: string; +} + +export interface SetCustomerDefaultAddress_addressSetDefault_user_defaultShippingAddress { + __typename: "Address"; + id: string; +} + +export interface SetCustomerDefaultAddress_addressSetDefault_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + addresses: (SetCustomerDefaultAddress_addressSetDefault_user_addresses | null)[] | null; + defaultBillingAddress: SetCustomerDefaultAddress_addressSetDefault_user_defaultBillingAddress | null; + defaultShippingAddress: SetCustomerDefaultAddress_addressSetDefault_user_defaultShippingAddress | null; +} + +export interface SetCustomerDefaultAddress_addressSetDefault { + __typename: "AddressSetDefault"; + errors: SetCustomerDefaultAddress_addressSetDefault_errors[] | null; + user: SetCustomerDefaultAddress_addressSetDefault_user | null; +} + +export interface SetCustomerDefaultAddress { + addressSetDefault: SetCustomerDefaultAddress_addressSetDefault | null; +} + +export interface SetCustomerDefaultAddressVariables { + addressId: string; + userId: string; + type: AddressTypeEnum; +} diff --git a/src/customers/types/UpdateCustomer.ts b/src/customers/types/UpdateCustomer.ts new file mode 100644 index 000000000..32be22048 --- /dev/null +++ b/src/customers/types/UpdateCustomer.ts @@ -0,0 +1,88 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CustomerInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: UpdateCustomer +// ==================================================== + +export interface UpdateCustomer_customerUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface UpdateCustomer_customerUpdate_user_defaultShippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface UpdateCustomer_customerUpdate_user_defaultShippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: UpdateCustomer_customerUpdate_user_defaultShippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface UpdateCustomer_customerUpdate_user_defaultBillingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface UpdateCustomer_customerUpdate_user_defaultBillingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: UpdateCustomer_customerUpdate_user_defaultBillingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface UpdateCustomer_customerUpdate_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + lastName: string; + dateJoined: any; + lastLogin: any | null; + defaultShippingAddress: UpdateCustomer_customerUpdate_user_defaultShippingAddress | null; + defaultBillingAddress: UpdateCustomer_customerUpdate_user_defaultBillingAddress | null; + note: string | null; + isActive: boolean; +} + +export interface UpdateCustomer_customerUpdate { + __typename: "CustomerUpdate"; + errors: UpdateCustomer_customerUpdate_errors[] | null; + user: UpdateCustomer_customerUpdate_user | null; +} + +export interface UpdateCustomer { + customerUpdate: UpdateCustomer_customerUpdate | null; +} + +export interface UpdateCustomerVariables { + id: string; + input: CustomerInput; +} diff --git a/src/customers/types/UpdateCustomerAddress.ts b/src/customers/types/UpdateCustomerAddress.ts new file mode 100644 index 000000000..4cf3ea5c3 --- /dev/null +++ b/src/customers/types/UpdateCustomerAddress.ts @@ -0,0 +1,52 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AddressInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: UpdateCustomerAddress +// ==================================================== + +export interface UpdateCustomerAddress_addressUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface UpdateCustomerAddress_addressUpdate_address_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface UpdateCustomerAddress_addressUpdate_address { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: UpdateCustomerAddress_addressUpdate_address_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface UpdateCustomerAddress_addressUpdate { + __typename: "AddressUpdate"; + errors: UpdateCustomerAddress_addressUpdate_errors[] | null; + address: UpdateCustomerAddress_addressUpdate_address | null; +} + +export interface UpdateCustomerAddress { + addressUpdate: UpdateCustomerAddress_addressUpdate | null; +} + +export interface UpdateCustomerAddressVariables { + id: string; + input: AddressInput; +} diff --git a/src/customers/urls.ts b/src/customers/urls.ts new file mode 100644 index 000000000..53662c0f5 --- /dev/null +++ b/src/customers/urls.ts @@ -0,0 +1,35 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { BulkAction, Dialog, Pagination, SingleAction } from "../types"; + +export const customerSection = "/customers/"; + +export const customerListPath = customerSection; +export type CustomerListUrlDialog = "remove"; +export type CustomerListUrlQueryParams = BulkAction & + Dialog & + Pagination; +export const customerListUrl = (params?: CustomerListUrlQueryParams) => + customerListPath + "?" + stringifyQs(params); + +export const customerPath = (id: string) => urlJoin(customerSection, id); +export type CustomerUrlDialog = "remove"; +export type CustomerUrlQueryParams = Dialog; +export const customerUrl = (id: string, params?: CustomerUrlQueryParams) => + customerPath(encodeURIComponent(id)) + "?" + stringifyQs(params); + +export const customerAddPath = urlJoin(customerSection, "add"); +export const customerAddUrl = customerAddPath; + +export const customerAddressesPath = (id: string) => + urlJoin(customerPath(id), "addresses"); +export type CustomerAddressesUrlDialog = "add" | "edit" | "remove"; +export type CustomerAddressesUrlQueryParams = Dialog< + CustomerAddressesUrlDialog +> & + SingleAction; +export const customerAddressesUrl = ( + id: string, + params?: CustomerAddressesUrlQueryParams +) => customerAddressesPath(encodeURIComponent(id)) + "?" + stringifyQs(params); diff --git a/src/customers/views/CustomerAddresses.tsx b/src/customers/views/CustomerAddresses.tsx new file mode 100644 index 000000000..5e968036b --- /dev/null +++ b/src/customers/views/CustomerAddresses.tsx @@ -0,0 +1,251 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import useShop from "@saleor/hooks/useShop"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import CustomerAddressDialog from "../components/CustomerAddressDialog"; +import CustomerAddressListPage from "../components/CustomerAddressListPage"; +import { + TypedCreateCustomerAddressMutation, + TypedRemoveCustomerAddressMutation, + TypedSetCustomerDefaultAddressMutation, + TypedUpdateCustomerAddressMutation +} from "../mutations"; +import { TypedCustomerAddressesQuery } from "../queries"; +import { CreateCustomerAddress } from "../types/CreateCustomerAddress"; +import { RemoveCustomerAddress } from "../types/RemoveCustomerAddress"; +import { SetCustomerDefaultAddress } from "../types/SetCustomerDefaultAddress"; +import { UpdateCustomerAddress } from "../types/UpdateCustomerAddress"; +import { + customerAddressesUrl, + CustomerAddressesUrlDialog, + CustomerAddressesUrlQueryParams, + customerUrl +} from "../urls"; + +interface CustomerAddressesProps { + id: string; + params: CustomerAddressesUrlQueryParams; +} + +const CustomerAddresses: React.FC = ({ + id, + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const shop = useShop(); + + const closeModal = () => navigate(customerAddressesUrl(id), true); + const openModal = (action: CustomerAddressesUrlDialog, addressId?: string) => + navigate(customerAddressesUrl(id, { action, id: addressId })); + + const handleSetAddressAsDefault = (data: SetCustomerDefaultAddress) => { + if (data.addressSetDefault.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Set address as default", { + context: "notification" + }) + }); + } + }; + + const handleAddressCreate = (data: CreateCustomerAddress) => { + if (data.addressCreate.errors.length === 0) { + closeModal(); + } + }; + + const handleAddressUpdate = (data: UpdateCustomerAddress) => { + if (data.addressUpdate.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Updated address", { + context: "notification" + }) + }); + } + }; + + const handleAddressRemove = (data: RemoveCustomerAddress) => { + if (data.addressDelete.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Removed address", { + context: "notification" + }) + }); + } + }; + + return ( + + {setCustomerDefaultAddress => ( + + {(createCustomerAddress, createCustomerAddressOpts) => ( + + {(updateCustomerAddress, updateCustomerAddressOpts) => ( + + {(removeCustomerAddress, removeCustomerAddressOpts) => ( + + {customerData => { + const createAddressTransitionState = getMutationState( + createCustomerAddressOpts.called, + createCustomerAddressOpts.loading, + maybe( + () => + createCustomerAddressOpts.data.addressCreate + .errors, + [] + ) + ); + + const updateAddressTransitionState = getMutationState( + updateCustomerAddressOpts.called, + updateCustomerAddressOpts.loading, + maybe( + () => + updateCustomerAddressOpts.data.addressUpdate + .errors, + [] + ) + ); + + const removeAddressTransitionState = getMutationState( + removeCustomerAddressOpts.called, + removeCustomerAddressOpts.loading, + maybe( + () => + removeCustomerAddressOpts.data.addressDelete + .errors, + [] + ) + ); + return ( + <> + customerData.data.user.email)} + /> + customerData.data.user)} + disabled={customerData.loading} + onAdd={() => openModal("add")} + onBack={() => navigate(customerUrl(id))} + onEdit={addressId => openModal("edit", addressId)} + onRemove={addressId => + openModal("remove", addressId) + } + onSetAsDefault={(addressId, type) => + setCustomerDefaultAddress({ + variables: { addressId, type, userId: id } + }) + } + /> + + shop.countries.map(country => ({ + code: country.code, + label: country.country + })), + [] + )} + errors={maybe( + () => + createCustomerAddressOpts.data.addressCreate + .errors, + [] + )} + open={params.action === "add"} + variant="create" + onClose={closeModal} + onConfirm={formData => + createCustomerAddress({ + variables: { + id, + input: { + ...formData, + country: formData.country.value + } + } + }) + } + /> + + customerData.data.user.addresses.find( + addr => addr.id === params.id + ) + )} + confirmButtonState={updateAddressTransitionState} + countries={[]} + errors={maybe( + () => + updateCustomerAddressOpts.data.addressUpdate + .errors, + [] + )} + open={params.action === "edit"} + variant="edit" + onClose={closeModal} + onConfirm={formData => + updateCustomerAddress({ + variables: { + id: params.id, + input: { + ...formData, + country: formData.country.value + } + } + }) + } + /> + + removeCustomerAddress({ + variables: { + id: params.id + } + }) + } + > + + {i18n.t( + "Are you sure you want to remove this address from users address book?" + )} + + + + ); + }} + + )} + + )} + + )} + + )} + + ); +}; +export default CustomerAddresses; diff --git a/src/customers/views/CustomerCreate.tsx b/src/customers/views/CustomerCreate.tsx new file mode 100644 index 000000000..62d83e07d --- /dev/null +++ b/src/customers/views/CustomerCreate.tsx @@ -0,0 +1,95 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../i18n"; +import { maybe } from "../../misc"; +import CustomerCreatePage from "../components/CustomerCreatePage"; +import { TypedCreateCustomerMutation } from "../mutations"; +import { TypedCustomerCreateDataQuery } from "../queries"; +import { CreateCustomer } from "../types/CreateCustomer"; +import { customerListUrl, customerUrl } from "../urls"; + +export const CustomerCreate: React.StatelessComponent<{}> = () => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const handleCreateCustomerSuccess = (data: CreateCustomer) => { + if (data.customerCreate.errors.length === 0) { + notify({ + text: i18n.t("Customer created", { + context: "notification" + }) + }); + navigate(customerUrl(data.customerCreate.user.id)); + } + }; + return ( + + {({ data, loading }) => ( + + {(createCustomer, createCustomerOpts) => ( + <> + + data.shop.countries, [])} + disabled={loading || createCustomerOpts.loading} + errors={maybe(() => { + const errs = createCustomerOpts.data.customerCreate.errors; + return errs.map(err => + err.field.split(":").length > 1 + ? { + ...err, + field: err.field.split(":")[1] + } + : err + ); + }, [])} + saveButtonBar={ + createCustomerOpts.loading ? "loading" : "default" + } + onBack={() => navigate(customerListUrl())} + onSubmit={formData => { + const address = { + city: formData.city, + cityArea: formData.cityArea, + companyName: formData.companyName, + country: formData.country, + countryArea: formData.countryArea, + firstName: formData.firstName, + lastName: formData.lastName, + phone: formData.phone, + postalCode: formData.postalCode, + streetAddress1: formData.streetAddress1, + streetAddress2: formData.streetAddress2 + }; + createCustomer({ + variables: { + input: { + defaultBillingAddress: { + ...address, + country: address.country.value + }, + defaultShippingAddress: { + ...address, + country: address.country.value + }, + email: formData.email, + firstName: formData.customerFirstName, + lastName: formData.customerLastName, + note: formData.note, + sendPasswordEmail: true + } + } + }); + }} + /> + + )} + + )} + + ); +}; +export default CustomerCreate; diff --git a/src/customers/views/CustomerDetails.tsx b/src/customers/views/CustomerDetails.tsx new file mode 100644 index 000000000..e6e9ab6aa --- /dev/null +++ b/src/customers/views/CustomerDetails.tsx @@ -0,0 +1,166 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import { orderListUrl, orderUrl } from "../../orders/urls"; +import CustomerDetailsPage from "../components/CustomerDetailsPage/CustomerDetailsPage"; +import { + TypedRemoveCustomerMutation, + TypedUpdateCustomerMutation +} from "../mutations"; +import { TypedCustomerDetailsQuery } from "../queries"; +import { RemoveCustomer } from "../types/RemoveCustomer"; +import { UpdateCustomer } from "../types/UpdateCustomer"; +import { + customerAddressesUrl, + customerListUrl, + customerUrl, + CustomerUrlQueryParams +} from "../urls"; + +interface CustomerDetailsViewProps { + id: string; + params: CustomerUrlQueryParams; +} + +export const CustomerDetailsView: React.StatelessComponent< + CustomerDetailsViewProps +> = ({ id, params }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const handleCustomerUpdateSuccess = (data: UpdateCustomer) => { + if (data.customerUpdate.errors.length === 0) { + notify({ + text: i18n.t("Customer updated", { + context: "notification" + }) + }); + } + }; + const handleCustomerRemoveSuccess = (data: RemoveCustomer) => { + if (data.customerDelete.errors.length === 0) { + notify({ + text: i18n.t("Customer removed", { + context: "notification" + }) + }); + navigate(customerListUrl()); + } + }; + return ( + + {(removeCustomer, removeCustomerOpts) => ( + + {(updateCustomer, updateCustomerOpts) => ( + + {customerDetails => { + const formTransitionState = getMutationState( + updateCustomerOpts.called, + updateCustomerOpts.loading, + maybe(() => updateCustomerOpts.data.customerUpdate.errors) + ); + const removeTransitionState = getMutationState( + removeCustomerOpts.called, + removeCustomerOpts.loading, + maybe(() => removeCustomerOpts.data.customerDelete.errors) + ); + + return ( + <> + customerDetails.data.user.email)} + /> + updateCustomerOpts.data.customerUpdate.errors + )} + saveButtonBar={formTransitionState} + onAddressManageClick={() => + navigate(customerAddressesUrl(id)) + } + onBack={() => navigate(customerListUrl())} + onRowClick={id => navigate(orderUrl(id))} + onSubmit={formData => + updateCustomer({ + variables: { + id, + input: { + email: formData.email, + firstName: formData.firstName, + isActive: formData.isActive, + lastName: formData.lastName, + note: formData.note + } + } + }) + } + onDelete={() => + navigate( + customerUrl(id, { + action: "remove" + }) + ) + } + onViewAllOrdersClick={() => + navigate( + orderListUrl({ + email: maybe(() => customerDetails.data.user.email) + }) + ) + } + /> + navigate(customerUrl(id), true)} + onConfirm={() => removeCustomer()} + title={i18n.t("Remove customer", { + context: "modal title" + })} + variant="delete" + open={params.action === "remove"} + > + {{ email }}?", + { + context: "modal content", + email: maybe( + () => customerDetails.data.user.email, + "..." + ) + } + ) + }} + /> + + + ); + }} + + )} + + )} + + ); +}; +export default CustomerDetailsView; diff --git a/src/customers/views/CustomerList.tsx b/src/customers/views/CustomerList.tsx new file mode 100644 index 000000000..6961261af --- /dev/null +++ b/src/customers/views/CustomerList.tsx @@ -0,0 +1,153 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { PAGINATE_BY } from "../../config"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import CustomerListPage from "../components/CustomerListPage"; +import { TypedBulkRemoveCustomers } from "../mutations"; +import { TypedCustomerListQuery } from "../queries"; +import { BulkRemoveCustomers } from "../types/BulkRemoveCustomers"; +import { + customerAddUrl, + customerListUrl, + CustomerListUrlQueryParams, + customerUrl +} from "../urls"; + +interface CustomerListProps { + params: CustomerListUrlQueryParams; +} + +export const CustomerList: React.StatelessComponent = ({ + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const closeModal = () => + navigate( + customerListUrl({ + ...params, + action: undefined, + ids: undefined + }), + true + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + + return ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.customers.pageInfo), + paginationState, + params + ); + + const handleBulkCustomerDelete = (data: BulkRemoveCustomers) => { + if (data.customerBulkDelete.errors.length === 0) { + notify({ + text: i18n.t("Customers removed") + }); + reset(); + refetch(); + closeModal(); + } + }; + + return ( + + {(bulkRemoveCustomers, bulkRemoveCustomersOpts) => { + const removeTransitionState = getMutationState( + bulkRemoveCustomersOpts.called, + bulkRemoveCustomersOpts.loading, + maybe( + () => bulkRemoveCustomersOpts.data.customerBulkDelete.errors + ) + ); + + return ( + <> + + data.customers.edges.map(edge => edge.node) + )} + disabled={loading} + pageInfo={pageInfo} + onAdd={() => navigate(customerAddUrl)} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRowClick={id => () => navigate(customerUrl(id))} + toolbar={ + + navigate( + customerListUrl({ + action: "remove", + ids: listElements + }) + ) + } + > + + + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + /> + + bulkRemoveCustomers({ + variables: { + ids: params.ids + } + }) + } + variant="delete" + title={i18n.t("Remove customers")} + > + {{ number }} customers?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + ); + }} + + ); +}; +export default CustomerList; diff --git a/src/discounts/components/DiscountCategories/DiscountCategories.tsx b/src/discounts/components/DiscountCategories/DiscountCategories.tsx new file mode 100644 index 000000000..a608481f5 --- /dev/null +++ b/src/discounts/components/DiscountCategories/DiscountCategories.tsx @@ -0,0 +1,173 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { SaleDetails_sale } from "../../types/SaleDetails"; +import { VoucherDetails_voucher } from "../../types/VoucherDetails"; + +export interface DiscountCategoriesProps extends ListProps, ListActions { + discount: SaleDetails_sale | VoucherDetails_voucher; + onCategoryAssign: () => void; + onCategoryUnassign: (id: string) => void; +} + +const styles = (theme: Theme) => + createStyles({ + iconCell: { + "&:last-child": { + paddingRight: 0 + }, + width: 48 + theme.spacing.unit / 2 + }, + tableRow: { + cursor: "pointer" + }, + textRight: { + textAlign: "right" + }, + wideColumn: { + width: "60%" + } + }); +const DiscountCategories = withStyles(styles, { + name: "DiscountCategories" +})( + ({ + discount: sale, + classes, + disabled, + pageInfo, + onCategoryAssign, + onCategoryUnassign, + onRowClick, + onPreviousPage, + onNextPage, + toolbar, + toggle, + toggleAll, + selected, + isChecked + }: DiscountCategoriesProps & WithStyles) => ( + + sale.name) + })} + toolbar={ + + } + /> + + sale.categories.edges.map(edge => edge.node))} + toggleAll={toggleAll} + toolbar={toolbar} + > + <> + + + {i18n.t("Category name")} + + + {i18n.t("Products")} + + + + + + + + + + + {renderCollection( + maybe(() => sale.categories.edges.map(edge => edge.node)), + category => { + const isSelected = category ? isChecked(category.id) : false; + + return ( + + + toggle(category.id)} + /> + + + {maybe(() => category.name, )} + + + {maybe( + () => category.products.totalCount, + + )} + + + { + event.stopPropagation(); + onCategoryUnassign(category.id); + }} + > + + + + + ); + }, + () => ( + + + {i18n.t("No categories found")} + + + ) + )} + +
    +
    + ) +); +DiscountCategories.displayName = "DiscountCategories"; +export default DiscountCategories; diff --git a/src/discounts/components/DiscountCategories/index.ts b/src/discounts/components/DiscountCategories/index.ts new file mode 100644 index 000000000..00e781deb --- /dev/null +++ b/src/discounts/components/DiscountCategories/index.ts @@ -0,0 +1,2 @@ +export { default } from "./DiscountCategories"; +export * from "./DiscountCategories"; diff --git a/src/discounts/components/DiscountCollections/DiscountCollections.tsx b/src/discounts/components/DiscountCollections/DiscountCollections.tsx new file mode 100644 index 000000000..ec1f7900e --- /dev/null +++ b/src/discounts/components/DiscountCollections/DiscountCollections.tsx @@ -0,0 +1,171 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { SaleDetails_sale } from "../../types/SaleDetails"; +import { VoucherDetails_voucher } from "../../types/VoucherDetails"; + +export interface DiscountCollectionsProps extends ListProps, ListActions { + discount: SaleDetails_sale | VoucherDetails_voucher; + onCollectionAssign: () => void; + onCollectionUnassign: (id: string) => void; +} + +const styles = (theme: Theme) => + createStyles({ + iconCell: { + "&:last-child": { + paddingRight: 0 + }, + width: 48 + theme.spacing.unit / 2 + }, + tableRow: { + cursor: "pointer" + }, + textRight: { + textAlign: "right" + }, + wideColumn: { + width: "60%" + } + }); +const DiscountCollections = withStyles(styles, { + name: "DiscountCollections" +})( + ({ + discount: sale, + classes, + disabled, + pageInfo, + onCollectionAssign, + onCollectionUnassign, + onRowClick, + onPreviousPage, + onNextPage, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: DiscountCollectionsProps & WithStyles) => ( + + sale.name) + })} + toolbar={ + + } + /> + + sale.collections.edges.map(edge => edge.node))} + toggleAll={toggleAll} + toolbar={toolbar} + > + + {i18n.t("Collection name")} + + + {i18n.t("Products")} + + + + + + + + + {renderCollection( + maybe(() => sale.collections.edges.map(edge => edge.node)), + collection => { + const isSelected = collection ? isChecked(collection.id) : false; + return ( + + + toggle(collection.id)} + /> + + + {maybe( + () => collection.name, + + )} + + + {maybe( + () => collection.products.totalCount, + + )} + + + { + event.stopPropagation(); + onCollectionUnassign(collection.id); + }} + > + + + + + ); + }, + () => ( + + + {i18n.t("No collections found")} + + + ) + )} + +
    +
    + ) +); +DiscountCollections.displayName = "DiscountCollections"; +export default DiscountCollections; diff --git a/src/discounts/components/DiscountCollections/index.ts b/src/discounts/components/DiscountCollections/index.ts new file mode 100644 index 000000000..5cd22c3a1 --- /dev/null +++ b/src/discounts/components/DiscountCollections/index.ts @@ -0,0 +1,2 @@ +export { default } from "./DiscountCollections"; +export * from "./DiscountCollections"; diff --git a/src/discounts/components/DiscountCountrySelectDialog/DiscountCountrySelectDialog.tsx b/src/discounts/components/DiscountCountrySelectDialog/DiscountCountrySelectDialog.tsx new file mode 100644 index 000000000..3a5aadaec --- /dev/null +++ b/src/discounts/components/DiscountCountrySelectDialog/DiscountCountrySelectDialog.tsx @@ -0,0 +1,190 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import { filter } from "fuzzaldrin"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import FormSpacer from "@saleor/components/FormSpacer"; +import Hr from "@saleor/components/Hr"; +// tslint:disable no-submodule-imports +import { ShopInfo_shop_countries } from "@saleor/components/Shop/types/ShopInfo"; +import i18n from "../../../i18n"; + +interface FormData { + allCountries: boolean; + countries: string[]; + query: string; +} + +export interface DiscountCountrySelectDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + countries: ShopInfo_shop_countries[]; + initial: string[]; + open: boolean; + onClose: () => void; + onConfirm: (data: FormData) => void; +} + +const styles = (theme: Theme) => + createStyles({ + checkboxCell: { + paddingLeft: 0 + }, + container: { + maxHeight: 500 + }, + heading: { + marginBottom: theme.spacing.unit * 2, + marginTop: theme.spacing.unit * 2 + }, + wideCell: { + width: "100%" + } + }); +const DiscountCountrySelectDialog = withStyles(styles, { + name: "DiscountCountrySelectDialog" +})( + ({ + classes, + confirmButtonState, + onClose, + countries, + open, + initial, + onConfirm + }: DiscountCountrySelectDialogProps & WithStyles) => { + const initialForm: FormData = { + allCountries: true, + countries: initial, + query: "" + }; + return ( + +
    + {({ data, change }) => { + const countrySelectionMap = countries.reduce((acc, country) => { + acc[country.code] = !!data.countries.find( + selectedCountries => selectedCountries === country.code + ); + return acc; + }, {}); + + return ( + <> + {i18n.t("Assign Countries")} + + + {i18n.t( + "Choose countries, you want voucher to be limited to, from the list below" + )} + + + change(event, () => fetch(data.query))} + label={i18n.t("Search Countries", { + context: "country search input label" + })} + placeholder={i18n.t("Search by country name", { + context: "country search input placeholder" + })} + fullWidth + /> + +
    + + + {i18n.t("Countries A to Z", { + context: "country selection" + })} + + + + {filter(countries, data.query, { + key: "country" + }).map(country => { + const isChecked = countrySelectionMap[country.code]; + + return ( + + + {country.country} + + + + isChecked + ? change({ + target: { + name: "countries" as keyof FormData, + value: data.countries.filter( + selectedCountries => + selectedCountries !== country.code + ) + } + } as any) + : change({ + target: { + name: "countries" as keyof FormData, + value: [ + ...data.countries, + country.code + ] + } + } as any) + } + /> + + + ); + })} + +
    +
    + + + + {i18n.t("Assign countries", { context: "button" })} + + + + ); + }} +
    +
    + ); + } +); +DiscountCountrySelectDialog.displayName = "DiscountCountrySelectDialog"; +export default DiscountCountrySelectDialog; diff --git a/src/discounts/components/DiscountCountrySelectDialog/index.ts b/src/discounts/components/DiscountCountrySelectDialog/index.ts new file mode 100644 index 000000000..cbbee8a48 --- /dev/null +++ b/src/discounts/components/DiscountCountrySelectDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from './DiscountCountrySelectDialog'; +export * from './DiscountCountrySelectDialog'; \ No newline at end of file diff --git a/src/discounts/components/DiscountProducts/DiscountProducts.tsx b/src/discounts/components/DiscountProducts/DiscountProducts.tsx new file mode 100644 index 000000000..3df6478f1 --- /dev/null +++ b/src/discounts/components/DiscountProducts/DiscountProducts.tsx @@ -0,0 +1,199 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { SaleDetails_sale } from "../../types/SaleDetails"; +import { VoucherDetails_voucher } from "../../types/VoucherDetails"; + +export interface SaleProductsProps extends ListProps, ListActions { + discount: SaleDetails_sale | VoucherDetails_voucher; + onProductAssign: () => void; + onProductUnassign: (id: string) => void; +} + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colName: {}, + colPublished: { + width: 150 + }, + colType: { + width: 200 + } + }, + colName: {}, + colPublished: {}, + colType: {}, + iconCell: { + "&:last-child": { + paddingRight: 0 + }, + width: 48 + theme.spacing.unit / 2 + }, + tableRow: { + cursor: "pointer" + } + }); +const DiscountProducts = withStyles(styles, { + name: "DiscountProducts" +})( + ({ + discount: sale, + classes, + disabled, + pageInfo, + onRowClick, + onPreviousPage, + onProductAssign, + onProductUnassign, + onNextPage, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: SaleProductsProps & WithStyles) => ( + + sale.name) + })} + toolbar={ + + } + /> + + sale.products.edges.map(edge => edge.node))} + toggleAll={toggleAll} + toolbar={toolbar} + > + + + + {i18n.t("Product name")} + + + {i18n.t("Product Type")} + + + {i18n.t("Published")} + + + + + + + + + + {renderCollection( + maybe(() => sale.products.edges.map(edge => edge.node)), + product => { + const isSelected = product ? isChecked(product.id) : false; + return ( + + + toggle(product.id)} + /> + + product.thumbnail.url)} + /> + + {maybe(() => product.name, )} + + + {maybe( + () => product.productType.name, + + )} + + + {product && product.isPublished !== undefined ? ( + + ) : ( + + )} + + + { + event.stopPropagation(); + onProductUnassign(product.id); + }} + > + + + + + ); + }, + () => ( + + {i18n.t("No products found")} + + ) + )} + +
    +
    + ) +); +DiscountProducts.displayName = "DiscountProducts"; +export default DiscountProducts; diff --git a/src/discounts/components/DiscountProducts/index.ts b/src/discounts/components/DiscountProducts/index.ts new file mode 100644 index 000000000..acd26089a --- /dev/null +++ b/src/discounts/components/DiscountProducts/index.ts @@ -0,0 +1,2 @@ +export { default } from "./DiscountProducts"; +export * from "./DiscountProducts"; diff --git a/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx b/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx new file mode 100644 index 000000000..d5dd1945d --- /dev/null +++ b/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx @@ -0,0 +1,85 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { UserError } from "../../../types"; +import { SaleType } from "../../../types/globalTypes"; +import SaleInfo from "../SaleInfo"; +import SalePricing from "../SalePricing"; + +export interface FormData { + name: string; + startDate: string; + endDate: string; + value: string; + type: SaleType; +} + +export interface SaleCreatePageProps { + defaultCurrency: string; + disabled: boolean; + errors: UserError[]; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onSubmit: (data: FormData) => void; +} + +const SaleCreatePage: React.StatelessComponent = ({ + defaultCurrency, + disabled, + errors, + onSubmit, + saveButtonBarState, + onBack +}) => { + const initialForm: FormData = { + endDate: "", + name: "", + startDate: "", + type: SaleType.FIXED, + value: "" + }; + return ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Sales")} + + +
    + + + +
    +
    + +
    + )} +
    + ); +}; +SaleCreatePage.displayName = "SaleCreatePage"; +export default SaleCreatePage; diff --git a/src/discounts/components/SaleCreatePage/index.ts b/src/discounts/components/SaleCreatePage/index.ts new file mode 100644 index 000000000..5621f967a --- /dev/null +++ b/src/discounts/components/SaleCreatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SaleCreatePage"; +export * from "./SaleCreatePage"; diff --git a/src/discounts/components/SaleDetailsPage/SaleDetailsPage.tsx b/src/discounts/components/SaleDetailsPage/SaleDetailsPage.tsx new file mode 100644 index 000000000..d760c43f0 --- /dev/null +++ b/src/discounts/components/SaleDetailsPage/SaleDetailsPage.tsx @@ -0,0 +1,238 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import { Tab, TabContainer } from "@saleor/components/Tab"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { ListProps, TabListActions, UserError } from "../../../types"; +import { SaleType } from "../../../types/globalTypes"; +import { SaleDetails_sale } from "../../types/SaleDetails"; +import DiscountCategories from "../DiscountCategories"; +import DiscountCollections from "../DiscountCollections"; +import DiscountProducts from "../DiscountProducts"; +import SaleInfo from "../SaleInfo"; +import SalePricing from "../SalePricing"; +import SaleSummary from "../SaleSummary"; + +export interface FormData { + name: string; + startDate: string; + endDate: string; + value: string; + type: SaleType; +} + +export enum SaleDetailsPageTab { + categories = "categories", + collections = "collections", + products = "products" +} +export function saleDetailsPageTab(tab: string): SaleDetailsPageTab { + return tab === SaleDetailsPageTab.products + ? SaleDetailsPageTab.products + : tab === SaleDetailsPageTab.collections + ? SaleDetailsPageTab.collections + : SaleDetailsPageTab.categories; +} + +export interface SaleDetailsPageProps + extends Pick>, + TabListActions< + "categoryListToolbar" | "collectionListToolbar" | "productListToolbar" + > { + activeTab: SaleDetailsPageTab; + defaultCurrency: string; + errors: UserError[]; + sale: SaleDetails_sale; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onCategoryAssign: () => void; + onCategoryUnassign: (id: string) => void; + onCategoryClick: (id: string) => () => void; + onCollectionAssign: () => void; + onCollectionUnassign: (id: string) => void; + onCollectionClick: (id: string) => () => void; + onProductAssign: () => void; + onProductUnassign: (id: string) => void; + onProductClick: (id: string) => () => void; + onRemove: () => void; + onSubmit: (data: FormData) => void; + onTabClick: (index: SaleDetailsPageTab) => void; +} + +const CategoriesTab = Tab(SaleDetailsPageTab.categories); +const CollectionsTab = Tab(SaleDetailsPageTab.collections); +const ProductsTab = Tab(SaleDetailsPageTab.products); + +const SaleDetailsPage: React.StatelessComponent = ({ + activeTab, + defaultCurrency, + disabled, + errors, + onRemove, + onSubmit, + onTabClick, + pageInfo, + sale, + saveButtonBarState, + onBack, + onCategoryAssign, + onCategoryUnassign, + onCategoryClick, + onCollectionAssign, + onCollectionUnassign, + onCollectionClick, + onNextPage, + onPreviousPage, + onProductAssign, + onProductUnassign, + onProductClick, + categoryListToolbar, + collectionListToolbar, + productListToolbar, + isChecked, + selected, + toggle, + toggleAll +}) => { + const initialForm: FormData = { + endDate: maybe(() => (sale.endDate ? sale.endDate : ""), ""), + name: maybe(() => sale.name, ""), + startDate: maybe(() => sale.startDate, ""), + type: maybe(() => sale.type, SaleType.FIXED), + value: maybe(() => sale.value.toString(), "") + }; + return ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Sales")} + sale.name)} /> + +
    + + + + + + + {i18n.t("Categories ({{ number }})", { + number: maybe( + () => sale.categories.totalCount.toString(), + "…" + ) + })} + + + {i18n.t("Collections ({{ number }})", { + number: maybe( + () => sale.collections.totalCount.toString(), + "…" + ) + })} + + + {i18n.t("Products ({{ number }})", { + number: maybe( + () => sale.products.totalCount.toString(), + "…" + ) + })} + + + + {activeTab === SaleDetailsPageTab.categories ? ( + + ) : activeTab === SaleDetailsPageTab.collections ? ( + + ) : ( + + )} +
    +
    + +
    +
    + +
    + )} +
    + ); +}; +SaleDetailsPage.displayName = "SaleDetailsPage"; +export default SaleDetailsPage; diff --git a/src/discounts/components/SaleDetailsPage/index.ts b/src/discounts/components/SaleDetailsPage/index.ts new file mode 100644 index 000000000..32c43a08b --- /dev/null +++ b/src/discounts/components/SaleDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SaleDetailsPage"; +export * from "./SaleDetailsPage"; diff --git a/src/discounts/components/SaleInfo/SaleInfo.tsx b/src/discounts/components/SaleInfo/SaleInfo.tsx new file mode 100644 index 000000000..606cf94a6 --- /dev/null +++ b/src/discounts/components/SaleInfo/SaleInfo.tsx @@ -0,0 +1,62 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + WithStyles, + withStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; +import { FormData } from "../SaleDetailsPage"; + +export interface SaleInfoProps { + data: FormData; + disabled: boolean; + errors: { + name?: string; + }; + onChange: (event: React.ChangeEvent) => void; +} + +const styles = (theme: Theme) => + createStyles({ + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: "3fr 1fr" + } + }); + +const SaleInfo = withStyles(styles, { + name: "SaleInfo" +})( + ({ + classes, + data, + disabled, + errors, + onChange + }: SaleInfoProps & WithStyles) => ( + + + + + + + ) +); +SaleInfo.displayName = "SaleInfo"; +export default SaleInfo; diff --git a/src/discounts/components/SaleInfo/index.ts b/src/discounts/components/SaleInfo/index.ts new file mode 100644 index 000000000..2abfa07d8 --- /dev/null +++ b/src/discounts/components/SaleInfo/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SaleInfo"; +export * from "./SaleInfo"; diff --git a/src/discounts/components/SaleList/SaleList.tsx b/src/discounts/components/SaleList/SaleList.tsx new file mode 100644 index 000000000..80a174b36 --- /dev/null +++ b/src/discounts/components/SaleList/SaleList.tsx @@ -0,0 +1,197 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + WithStyles, + withStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import Date from "@saleor/components/Date"; +import Money from "@saleor/components/Money"; +import Percent from "@saleor/components/Percent"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { SaleType } from "../../../types/globalTypes"; +import { SaleList_sales_edges_node } from "../../types/SaleList"; + +export interface SaleListProps extends ListProps, ListActions { + defaultCurrency: string; + sales: SaleList_sales_edges_node[]; +} + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colEnd: { + width: 250 + }, + colName: {}, + colStart: { + width: 250 + }, + colValue: { + width: 200 + } + }, + colEnd: { + textAlign: "right" + }, + colName: {}, + colStart: { + textAlign: "right" + }, + colValue: { + textAlign: "right" + }, + tableRow: { + cursor: "pointer" + } + }); + +const SaleList = withStyles(styles, { + name: "SaleList" +})( + ({ + classes, + defaultCurrency, + disabled, + onNextPage, + onPreviousPage, + onRowClick, + pageInfo, + sales, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: SaleListProps & WithStyles) => ( + + + + + {i18n.t("Name", { + context: "sale list table header" + })} + + + {i18n.t("Starts", { + context: "sale list table header" + })} + + + {i18n.t("Ends", { + context: "sale list table header" + })} + + + {i18n.t("Value", { + context: "sale list table header" + })} + + + + + + + + + {renderCollection( + sales, + sale => { + const isSelected = sale ? isChecked(sale.id) : false; + + return ( + + + toggle(sale.id)} + /> + + + {maybe(() => sale.name, )} + + + {sale && sale.startDate ? ( + + ) : ( + + )} + + + {sale && sale.endDate ? ( + + ) : sale && sale.endDate === null ? ( + "-" + ) : ( + + )} + + + {sale && sale.type && sale.value ? ( + sale.type === SaleType.FIXED ? ( + + ) : ( + + ) + ) : ( + + )} + + + ); + }, + () => ( + + {i18n.t("No sales found")} + + ) + )} + +
    +
    + ) +); +SaleList.displayName = "SaleList"; +export default SaleList; diff --git a/src/discounts/components/SaleList/index.ts b/src/discounts/components/SaleList/index.ts new file mode 100644 index 000000000..20d8fef01 --- /dev/null +++ b/src/discounts/components/SaleList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SaleList"; +export * from "./SaleList"; diff --git a/src/discounts/components/SaleListPage/SaleListPage.tsx b/src/discounts/components/SaleListPage/SaleListPage.tsx new file mode 100644 index 000000000..0d49e9c22 --- /dev/null +++ b/src/discounts/components/SaleListPage/SaleListPage.tsx @@ -0,0 +1,32 @@ +import Button from "@material-ui/core/Button"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { SaleList_sales_edges_node } from "../../types/SaleList"; +import SaleList from "../SaleList"; + +export interface SaleListPageProps extends PageListProps, ListActions { + defaultCurrency: string; + sales: SaleList_sales_edges_node[]; +} + +const SaleListPage: React.StatelessComponent = ({ + onAdd, + ...listProps +}) => ( + + + + + + +); +SaleListPage.displayName = "SaleListPage"; +export default SaleListPage; diff --git a/src/discounts/components/SaleListPage/index.ts b/src/discounts/components/SaleListPage/index.ts new file mode 100644 index 000000000..59dd2585a --- /dev/null +++ b/src/discounts/components/SaleListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SaleListPage"; +export * from "./SaleListPage"; diff --git a/src/discounts/components/SalePricing/SalePricing.tsx b/src/discounts/components/SalePricing/SalePricing.tsx new file mode 100644 index 000000000..45eb60472 --- /dev/null +++ b/src/discounts/components/SalePricing/SalePricing.tsx @@ -0,0 +1,117 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + WithStyles, + withStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Hr from "@saleor/components/Hr"; +import TextFieldWithChoice from "@saleor/components/TextFieldWithChoice"; +import i18n from "../../../i18n"; +import { FormErrors } from "../../../types"; +import { SaleType } from "../../../types/globalTypes"; +import { FormData } from "../SaleDetailsPage"; + +export interface SalePricingProps { + data: FormData; + defaultCurrency: string; + disabled: boolean; + errors: FormErrors<"startDate" | "endDate" | "value">; + onChange: (event: React.ChangeEvent) => void; +} + +const styles = (theme: Theme) => + createStyles({ + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: "1fr 1fr" + }, + subheading: { + gridColumnEnd: "span 2", + marginBottom: theme.spacing.unit * 2 + } + }); + +const SalePricing = withStyles(styles, { + name: "SalePricing" +})( + ({ + classes, + data, + defaultCurrency, + disabled, + errors, + onChange + }: SalePricingProps & WithStyles) => ( + + + + + +
    + + + {i18n.t("Time Frame")} + + + + +
    + ) +); +SalePricing.displayName = "SalePricing"; +export default SalePricing; diff --git a/src/discounts/components/SalePricing/index.ts b/src/discounts/components/SalePricing/index.ts new file mode 100644 index 000000000..347c08adc --- /dev/null +++ b/src/discounts/components/SalePricing/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SalePricing"; +export * from "./SalePricing"; diff --git a/src/discounts/components/SaleSummary/SaleSummary.tsx b/src/discounts/components/SaleSummary/SaleSummary.tsx new file mode 100644 index 000000000..5cfa73db8 --- /dev/null +++ b/src/discounts/components/SaleSummary/SaleSummary.tsx @@ -0,0 +1,82 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardSpacer from "@saleor/components/CardSpacer"; +import CardTitle from "@saleor/components/CardTitle"; +import Date from "@saleor/components/Date"; +import FormSpacer from "@saleor/components/FormSpacer"; +import Hr from "@saleor/components/Hr"; +import Money from "@saleor/components/Money"; +import Percent from "@saleor/components/Percent"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { SaleType } from "../../../types/globalTypes"; +import { SaleDetails_sale } from "../../types/SaleDetails"; + +export interface SaleSummaryProps { + defaultCurrency: string; + sale: SaleDetails_sale; +} + +const SaleSummary: React.StatelessComponent = ({ + defaultCurrency, + sale +}) => ( + + + + {i18n.t("Name")} + + {maybe(() => sale.name, )} + + + + {i18n.t("Value")} + + {maybe( + () => + sale.type === SaleType.FIXED ? ( + + ) : ( + + ), + + )} + + + +
    + + + {i18n.t("Start Date")} + + {maybe( + () => ( + + ), + + )} + + + + {i18n.t("End Date")} + + {maybe( + () => + sale.endDate === null ? "-" : , + + )} + +
    +
    +); +SaleSummary.displayName = "SaleSummary"; +export default SaleSummary; diff --git a/src/discounts/components/SaleSummary/index.ts b/src/discounts/components/SaleSummary/index.ts new file mode 100644 index 000000000..6e0a510f5 --- /dev/null +++ b/src/discounts/components/SaleSummary/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SaleSummary"; +export * from "./SaleSummary"; diff --git a/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx b/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx new file mode 100644 index 000000000..46147595f --- /dev/null +++ b/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx @@ -0,0 +1,101 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { UserError } from "../../../types"; +import { + VoucherDiscountValueType, + VoucherType +} from "../../../types/globalTypes"; +import VoucherInfo from "../VoucherInfo"; +import VoucherOptions from "../VoucherOptions"; + +export interface FormData { + applyOncePerOrder: boolean; + code: string; + discountType: VoucherDiscountValueType; + endDate: string; + minAmountSpent: number; + name: string; + startDate: string; + type: VoucherType; + usageLimit: number; + value: number; +} + +export interface VoucherCreatePageProps { + defaultCurrency: string; + disabled: boolean; + errors: UserError[]; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onSubmit: (data: FormData) => void; +} + +const VoucherCreatePage: React.StatelessComponent = ({ + defaultCurrency, + disabled, + errors, + saveButtonBarState, + onBack, + onSubmit +}) => { + const initialForm: FormData = { + applyOncePerOrder: false, + code: "", + discountType: VoucherDiscountValueType.FIXED, + endDate: "", + minAmountSpent: 0, + name: "", + startDate: "", + type: VoucherType.VALUE, + usageLimit: 0, + value: 0 + }; + + return ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Vouchers")} + + +
    + + + + +
    +
    + +
    + )} +
    + ); +}; +VoucherCreatePage.displayName = "VoucherCreatePage"; +export default VoucherCreatePage; diff --git a/src/discounts/components/VoucherCreatePage/index.ts b/src/discounts/components/VoucherCreatePage/index.ts new file mode 100644 index 000000000..b38cb8083 --- /dev/null +++ b/src/discounts/components/VoucherCreatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from './VoucherCreatePage'; +export * from './VoucherCreatePage'; \ No newline at end of file diff --git a/src/discounts/components/VoucherDetailsPage/VoucherDetailsPage.tsx b/src/discounts/components/VoucherDetailsPage/VoucherDetailsPage.tsx new file mode 100644 index 000000000..fec9980d7 --- /dev/null +++ b/src/discounts/components/VoucherDetailsPage/VoucherDetailsPage.tsx @@ -0,0 +1,290 @@ +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import CountryList from "@saleor/components/CountryList"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import { Tab, TabContainer } from "@saleor/components/Tab"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { ListProps, TabListActions, UserError } from "../../../types"; +import { + VoucherDiscountValueType, + VoucherType +} from "../../../types/globalTypes"; +import { VoucherDetails_voucher } from "../../types/VoucherDetails"; +import DiscountCategories from "../DiscountCategories"; +import DiscountCollections from "../DiscountCollections"; +import DiscountProducts from "../DiscountProducts"; +import VoucherInfo from "../VoucherInfo"; +import VoucherOptions from "../VoucherOptions"; +import VoucherSummary from "../VoucherSummary"; + +export enum VoucherDetailsPageTab { + categories = "categories", + collections = "collections", + products = "products" +} +export function voucherDetailsPageTab(tab: string): VoucherDetailsPageTab { + return tab === VoucherDetailsPageTab.products + ? VoucherDetailsPageTab.products + : tab === VoucherDetailsPageTab.collections + ? VoucherDetailsPageTab.collections + : VoucherDetailsPageTab.categories; +} + +export interface FormData { + applyOncePerOrder: boolean; + code: string; + discountType: VoucherDiscountValueType; + endDate: string; + minAmountSpent: number; + name: string; + startDate: string; + type: VoucherType; + usageLimit: number; + value: number; +} + +export interface VoucherDetailsPageProps + extends Pick>, + TabListActions< + "categoryListToolbar" | "collectionListToolbar" | "productListToolbar" + > { + activeTab: VoucherDetailsPageTab; + defaultCurrency: string; + errors: UserError[]; + saveButtonBarState: ConfirmButtonTransitionState; + voucher: VoucherDetails_voucher; + onBack: () => void; + onCategoryAssign: () => void; + onCategoryUnassign: (id: string) => void; + onCategoryClick: (id: string) => () => void; + onCollectionAssign: () => void; + onCollectionUnassign: (id: string) => void; + onCollectionClick: (id: string) => () => void; + onCountryAssign: () => void; + onCountryUnassign: (code: string) => void; + onProductAssign: () => void; + onProductUnassign: (id: string) => void; + onProductClick: (id: string) => () => void; + onRemove: () => void; + onSubmit: (data: FormData) => void; + onTabClick: (index: VoucherDetailsPageTab) => void; +} + +const CategoriesTab = Tab(VoucherDetailsPageTab.categories); +const CollectionsTab = Tab(VoucherDetailsPageTab.collections); +const ProductsTab = Tab(VoucherDetailsPageTab.products); + +const VoucherDetailsPage: React.StatelessComponent = ({ + activeTab, + defaultCurrency, + disabled, + errors, + pageInfo, + saveButtonBarState, + voucher, + onBack, + onCategoryAssign, + onCategoryClick, + onCategoryUnassign, + onCountryAssign, + onCountryUnassign, + onCollectionAssign, + onCollectionClick, + onCollectionUnassign, + onNextPage, + onPreviousPage, + onProductAssign, + onProductClick, + onProductUnassign, + onTabClick, + onRemove, + onSubmit, + toggle, + toggleAll, + selected, + isChecked, + categoryListToolbar, + collectionListToolbar, + productListToolbar +}) => { + const initialForm: FormData = { + applyOncePerOrder: maybe(() => voucher.applyOncePerOrder, false), + code: maybe(() => voucher.code, ""), + discountType: maybe( + () => voucher.discountValueType, + VoucherDiscountValueType.FIXED + ), + endDate: maybe(() => voucher.endDate, ""), + minAmountSpent: maybe(() => voucher.minAmountSpent.amount, 0), + name: maybe(() => voucher.name, ""), + startDate: maybe(() => voucher.startDate, ""), + type: maybe(() => voucher.type, VoucherType.VALUE), + usageLimit: maybe(() => voucher.usageLimit || 0, 0), + value: maybe(() => voucher.discountValue, 0) + }; + + return ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Vouchers")} + voucher.name)} /> + +
    + + + + + {data.type === VoucherType.CATEGORY || + data.type === VoucherType.COLLECTION || + data.type === VoucherType.PRODUCT ? ( + <> + + + {i18n.t("Categories ({{ number }})", { + number: maybe( + () => voucher.categories.totalCount.toString(), + "…" + ) + })} + + + {i18n.t("Collections ({{ number }})", { + number: maybe( + () => voucher.collections.totalCount.toString(), + "…" + ) + })} + + + {i18n.t("Products ({{ number }})", { + number: maybe( + () => voucher.products.totalCount.toString(), + "…" + ) + })} + + + + {activeTab === VoucherDetailsPageTab.categories ? ( + + ) : activeTab === VoucherDetailsPageTab.collections ? ( + + ) : ( + + )} + + ) : data.type === VoucherType.SHIPPING ? ( + voucher.countries)} + disabled={disabled} + emptyText={i18n.t("Voucher applies to all countries")} + title={ + <> + {i18n.t("Countries assigned to {{ voucherName }}", { + voucherName: maybe(() => voucher.name) + })} + + {i18n.t("Vouchers limited to these countries")} + + + } + onCountryAssign={onCountryAssign} + onCountryUnassign={onCountryUnassign} + /> + ) : null} +
    +
    + +
    +
    + +
    + )} +
    + ); +}; +VoucherDetailsPage.displayName = "VoucherDetailsPage"; + +export default VoucherDetailsPage; diff --git a/src/discounts/components/VoucherDetailsPage/index.ts b/src/discounts/components/VoucherDetailsPage/index.ts new file mode 100644 index 000000000..d165924b6 --- /dev/null +++ b/src/discounts/components/VoucherDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./VoucherDetailsPage"; +export * from "./VoucherDetailsPage"; diff --git a/src/discounts/components/VoucherInfo/VoucherInfo.tsx b/src/discounts/components/VoucherInfo/VoucherInfo.tsx new file mode 100644 index 000000000..7395fe33f --- /dev/null +++ b/src/discounts/components/VoucherInfo/VoucherInfo.tsx @@ -0,0 +1,101 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import FormSpacer from "@saleor/components/FormSpacer"; +import SingleSelectField from "@saleor/components/SingleSelectField"; +import i18n from "../../../i18n"; +import { FormErrors } from "../../../types"; +import { VoucherType } from "../../../types/globalTypes"; +import { translateVoucherTypes } from "../../translations"; +import { FormData } from "../VoucherDetailsPage"; + +interface VoucherInfoProps { + data: FormData; + errors: FormErrors<"name" | "code" | "type">; + disabled: boolean; + variant: "create" | "update"; + onChange: (event: React.ChangeEvent) => void; +} + +const styles = (theme: Theme) => + createStyles({ + nameInput: { + gridColumnEnd: "span 2" + }, + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: "1fr 1fr" + } + }); + +const VoucherInfo = withStyles(styles, { + name: "VoucherInfo" +})( + ({ + classes, + data, + disabled, + errors, + variant, + onChange + }: VoucherInfoProps & WithStyles) => { + const translatedVoucherTypes = translateVoucherTypes(); + const voucherTypeChoices = Object.values(VoucherType).map(type => ({ + label: translatedVoucherTypes[type], + value: type + })); + + return ( + + + + + +
    + + +
    +
    +
    + ); + } +); +export default VoucherInfo; diff --git a/src/discounts/components/VoucherInfo/index.ts b/src/discounts/components/VoucherInfo/index.ts new file mode 100644 index 000000000..0f852b910 --- /dev/null +++ b/src/discounts/components/VoucherInfo/index.ts @@ -0,0 +1,2 @@ +export { default } from "./VoucherInfo"; +export * from "./VoucherInfo"; diff --git a/src/discounts/components/VoucherList/VoucherList.tsx b/src/discounts/components/VoucherList/VoucherList.tsx new file mode 100644 index 000000000..f18df8d5a --- /dev/null +++ b/src/discounts/components/VoucherList/VoucherList.tsx @@ -0,0 +1,243 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + WithStyles, + withStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import Date from "@saleor/components/Date"; +import Money from "@saleor/components/Money"; +import Percent from "@saleor/components/Percent"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { VoucherDiscountValueType } from "../../../types/globalTypes"; +import { VoucherList_vouchers_edges_node } from "../../types/VoucherList"; + +export interface VoucherListProps extends ListProps, ListActions { + defaultCurrency: string; + vouchers: VoucherList_vouchers_edges_node[]; +} + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colEnd: { + width: 180 + }, + colMinSpent: { + width: 150 + }, + colName: {}, + colStart: { + width: 180 + }, + colUses: { + width: 150 + }, + colValue: { + width: 150 + } + }, + colEnd: { + textAlign: "right" + }, + colMinSpent: { + textAlign: "right" + }, + colName: {}, + colStart: { + textAlign: "right" + }, + colUses: { + textAlign: "right" + }, + colValue: { + textAlign: "right" + }, + tableRow: { + cursor: "pointer" + }, + textRight: { + textAlign: "right" + } + }); + +const VoucherList = withStyles(styles, { + name: "VoucherList" +})( + ({ + classes, + defaultCurrency, + disabled, + onNextPage, + onPreviousPage, + onRowClick, + pageInfo, + vouchers, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: VoucherListProps & WithStyles) => ( + + + + + {i18n.t("Name", { + context: "voucher list table header" + })} + + + {i18n.t("Min. Spent", { + context: "voucher list table header" + })} + + + {i18n.t("Starts", { + context: "voucher list table header" + })} + + + {i18n.t("Ends", { + context: "voucher list table header" + })} + + + {i18n.t("Value", { + context: "voucher list table header" + })} + + + {i18n.t("Uses", { + context: "voucher list table header" + })} + + + + + + + + + {renderCollection( + vouchers, + voucher => { + const isSelected = voucher ? isChecked(voucher.id) : false; + + return ( + + + toggle(voucher.id)} + /> + + + {maybe(() => voucher.name, )} + + + {voucher && voucher.minAmountSpent ? ( + + ) : voucher && voucher.minAmountSpent === null ? ( + "-" + ) : ( + + )} + + + {voucher && voucher.startDate ? ( + + ) : ( + + )} + + + {voucher && voucher.endDate ? ( + + ) : voucher && voucher.endDate === null ? ( + "-" + ) : ( + + )} + + + {voucher && + voucher.discountValueType && + voucher.discountValue ? ( + voucher.discountValueType === + VoucherDiscountValueType.FIXED ? ( + + ) : ( + + ) + ) : ( + + )} + + + {voucher && voucher.usageLimit ? ( + voucher.usageLimit + ) : voucher && voucher.usageLimit === null ? ( + "-" + ) : ( + + )} + + + ); + }, + () => ( + + {i18n.t("No vouchers found")} + + ) + )} + +
    +
    + ) +); +VoucherList.displayName = "VoucherList"; +export default VoucherList; diff --git a/src/discounts/components/VoucherList/index.ts b/src/discounts/components/VoucherList/index.ts new file mode 100644 index 000000000..c84409632 --- /dev/null +++ b/src/discounts/components/VoucherList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./VoucherList"; +export * from "./VoucherList"; diff --git a/src/discounts/components/VoucherListPage/VoucherListPage.tsx b/src/discounts/components/VoucherListPage/VoucherListPage.tsx new file mode 100644 index 000000000..cf40fff3f --- /dev/null +++ b/src/discounts/components/VoucherListPage/VoucherListPage.tsx @@ -0,0 +1,56 @@ +import Button from "@material-ui/core/Button"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { VoucherList_vouchers_edges_node } from "../../types/VoucherList"; +import VoucherList from "../VoucherList"; + +export interface VoucherListPageProps extends PageListProps, ListActions { + defaultCurrency: string; + vouchers: VoucherList_vouchers_edges_node[]; +} + +const VoucherListPage: React.StatelessComponent = ({ + defaultCurrency, + disabled, + onAdd, + onNextPage, + onPreviousPage, + onRowClick, + pageInfo, + vouchers, + isChecked, + selected, + toggle, + toggleAll, + toolbar +}) => ( + + + + + + +); +VoucherListPage.displayName = "VoucherListPage"; +export default VoucherListPage; diff --git a/src/discounts/components/VoucherListPage/index.ts b/src/discounts/components/VoucherListPage/index.ts new file mode 100644 index 000000000..84b3fa702 --- /dev/null +++ b/src/discounts/components/VoucherListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./VoucherListPage"; +export * from "./VoucherListPage"; diff --git a/src/discounts/components/VoucherOptions/VoucherOptions.tsx b/src/discounts/components/VoucherOptions/VoucherOptions.tsx new file mode 100644 index 000000000..c9bde716b --- /dev/null +++ b/src/discounts/components/VoucherOptions/VoucherOptions.tsx @@ -0,0 +1,177 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import ControlledSwitch from "@saleor/components/ControlledSwitch"; +import FormSpacer from "@saleor/components/FormSpacer"; +import Hr from "@saleor/components/Hr"; +import TextFieldWithChoice from "@saleor/components/TextFieldWithChoice"; +import i18n from "../../../i18n"; +import { FormErrors } from "../../../types"; +import { VoucherDiscountValueType } from "../../../types/globalTypes"; +import { FormData } from "../VoucherDetailsPage"; + +interface VoucherOptionsProps { + data: FormData; + defaultCurrency: string; + disabled: boolean; + errors: FormErrors< + | "discountType" + | "discountValue" + | "endDate" + | "minAmountSpent" + | "startDate" + | "usageLimit" + >; + onChange: (event: React.ChangeEvent) => void; +} + +const styles = (theme: Theme) => + createStyles({ + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: "1fr 1fr" + } + }); + +const VoucherOptions = withStyles(styles, { + name: "VoucherOptions" +})( + ({ + classes, + data, + defaultCurrency, + disabled, + errors, + onChange + }: VoucherOptionsProps & WithStyles) => ( + + + + + + +
    + + + {i18n.t("Discount Specific Information")} + + +
    + +
    + + + {i18n.t("Only once per order", { + context: "voucher application" + })} + + {i18n.t( + "If this option is disabled, discount will be counted for every eligible product" + )} + + + } + onChange={onChange} + name={"applyOncePerOrder" as keyof FormData} + disabled={disabled} + /> +
    +
    + + {i18n.t("Time Frame")} + +
    + + +
    +
    +
    + ) +); +export default VoucherOptions; diff --git a/src/discounts/components/VoucherOptions/index.ts b/src/discounts/components/VoucherOptions/index.ts new file mode 100644 index 000000000..3b2411d35 --- /dev/null +++ b/src/discounts/components/VoucherOptions/index.ts @@ -0,0 +1,2 @@ +export { default } from "./VoucherOptions"; +export * from "./VoucherOptions"; diff --git a/src/discounts/components/VoucherSummary/VoucherSummary.tsx b/src/discounts/components/VoucherSummary/VoucherSummary.tsx new file mode 100644 index 000000000..e3035f126 --- /dev/null +++ b/src/discounts/components/VoucherSummary/VoucherSummary.tsx @@ -0,0 +1,126 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardSpacer from "@saleor/components/CardSpacer"; +import CardTitle from "@saleor/components/CardTitle"; +import Date from "@saleor/components/Date"; +import FormSpacer from "@saleor/components/FormSpacer"; +import Hr from "@saleor/components/Hr"; +import Money from "@saleor/components/Money"; +import Percent from "@saleor/components/Percent"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { VoucherDiscountValueType } from "../../../types/globalTypes"; +import { translateVoucherTypes } from "../../translations"; +import { VoucherDetails_voucher } from "../../types/VoucherDetails"; + +export interface VoucherSummaryProps { + defaultCurrency: string; + voucher: VoucherDetails_voucher; +} + +const VoucherSummary: React.StatelessComponent = ({ + defaultCurrency, + voucher +}) => { + const translatedVoucherTypes = translateVoucherTypes(); + + return ( + + + + {i18n.t("Name")} + + {maybe(() => voucher.name, )} + + + + {i18n.t("Applies to")} + + {maybe( + () => translatedVoucherTypes[voucher.type], + + )} + + + + {i18n.t("Value")} + + {maybe( + () => + voucher.discountValueType === VoucherDiscountValueType.FIXED ? ( + + ) : ( + + ), + + )} + + + +
    + + + {i18n.t("Start Date")} + + {maybe( + () => ( + + ), + + )} + + + + {i18n.t("End Date")} + + {maybe( + () => + voucher.endDate === null ? ( + "-" + ) : ( + + ), + + )} + + + +
    + + + {i18n.t("Min. Order Value")} + + {maybe( + () => + voucher.minAmountSpent ? ( + + ) : ( + "-" + ), + + )} + + + + {i18n.t("Usage Limit")} + + {maybe( + () => (voucher.usageLimit === null ? "-" : voucher.usageLimit), + + )} + +
    +
    + ); +}; +VoucherSummary.displayName = "VoucherSummary"; +export default VoucherSummary; diff --git a/src/discounts/components/VoucherSummary/index.ts b/src/discounts/components/VoucherSummary/index.ts new file mode 100644 index 000000000..a7c1bebc1 --- /dev/null +++ b/src/discounts/components/VoucherSummary/index.ts @@ -0,0 +1,2 @@ +export { default } from "./VoucherSummary"; +export * from "./VoucherSummary"; diff --git a/src/discounts/fixtures.ts b/src/discounts/fixtures.ts new file mode 100644 index 000000000..7f4cef125 --- /dev/null +++ b/src/discounts/fixtures.ts @@ -0,0 +1,303 @@ +import * as placeholderImage from "@assets/images/placeholder60x60.png"; +import { + SaleType, + VoucherDiscountValueType, + VoucherType +} from "../types/globalTypes"; +import { SaleDetails_sale } from "./types/SaleDetails"; +import { SaleList_sales_edges_node } from "./types/SaleList"; +import { VoucherDetails_voucher } from "./types/VoucherDetails"; +import { VoucherList_vouchers_edges_node } from "./types/VoucherList"; + +export const saleList: SaleList_sales_edges_node[] = [ + { + __typename: "Sale" as "Sale", + endDate: null, + id: "U2FsZTo0", + name: "Happy front day!", + startDate: "2019-01-03", + type: "PERCENTAGE" as SaleType, + value: 40 + }, + { + __typename: "Sale" as "Sale", + endDate: null, + id: "U2FsZTo1", + name: "Happy minute day!", + startDate: "2019-01-03", + type: "FIXED" as SaleType, + value: 30 + }, + { + __typename: "Sale" as "Sale", + endDate: null, + id: "U2FsZTox", + name: "Happy class day!", + startDate: "2019-01-03", + type: "PERCENTAGE" as SaleType, + value: 10 + }, + { + __typename: "Sale" as "Sale", + endDate: null, + id: "U2FsZToy", + name: "Happy human day!", + startDate: "2019-01-03", + type: "PERCENTAGE" as SaleType, + value: 20 + }, + { + __typename: "Sale" as "Sale", + endDate: null, + id: "U2FsZToz", + name: "Happy year day!", + startDate: "2019-01-03", + type: "PERCENTAGE" as SaleType, + value: 10 + } +]; + +export const voucherList: VoucherList_vouchers_edges_node[] = [ + { + __typename: "Voucher" as "Voucher", + countries: [ + { + __typename: "CountryDisplay", + code: "DE", + country: "Germany" + } + ], + discountValue: 100, + discountValueType: "PERCENTAGE" as VoucherDiscountValueType, + endDate: null, + id: "Vm91Y2hlcjox", + minAmountSpent: null, + name: "Free shipping", + startDate: "2019-01-03", + usageLimit: null + }, + { + __typename: "Voucher" as "Voucher", + countries: [], + discountValue: 25, + discountValueType: "FIXED" as VoucherDiscountValueType, + endDate: null, + id: "Vm91Y2hlcjoy", + minAmountSpent: { + __typename: "Money" as "Money", + amount: 200, + currency: "USD" + }, + name: "Big order discount", + startDate: "2019-01-03", + usageLimit: 150 + } +]; + +export const sale: SaleDetails_sale = { + __typename: "Sale", + categories: { + __typename: "CategoryCountableConnection", + edges: [ + { + __typename: "CategoryCountableEdge", + node: { + __typename: "Category", + id: "U2FsZTo1=", + name: "Apparel", + products: { + __typename: "ProductCountableConnection", + totalCount: 18 + } + } + } + ], + pageInfo: { + __typename: "PageInfo", + endCursor: null, + hasNextPage: false, + hasPreviousPage: false, + startCursor: null + }, + totalCount: 2 + }, + collections: { + __typename: "CollectionCountableConnection", + edges: [ + { + __typename: "CollectionCountableEdge", + node: { + __typename: "Collection", + id: "U2FsZBo4=", + name: "Winter Collection", + products: { + __typename: "ProductCountableConnection", + totalCount: 110 + } + } + } + ], + pageInfo: { + __typename: "PageInfo", + endCursor: null, + hasNextPage: false, + hasPreviousPage: false, + startCursor: null + }, + totalCount: 4 + }, + endDate: null, + id: "U2FsZTo1", + name: "Happy minute day!", + products: { + __typename: "ProductCountableConnection", + edges: [ + { + __typename: "ProductCountableEdge", + node: { + __typename: "Product", + id: "UHJvZHVjdDo3MQ==", + isPublished: true, + name: "Orange Juice", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6OQ==", + name: "Juice" + }, + thumbnail: { + __typename: "Image", + url: placeholderImage + } + } + }, + { + __typename: "ProductCountableEdge", + node: { + __typename: "Product", + id: "UHJvZHVjdDo3Mw==", + isPublished: true, + name: "Carrot Juice", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6OQ==", + name: "Juice" + }, + thumbnail: { + __typename: "Image", + url: placeholderImage + } + } + }, + { + __typename: "ProductCountableEdge", + node: { + __typename: "Product", + id: "UHJvZHVjdDo3OQ==", + isPublished: true, + name: "Bean Juice", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6OQ==", + name: "Juice" + }, + thumbnail: { + __typename: "Image", + url: placeholderImage + } + } + }, + { + __typename: "ProductCountableEdge", + node: { + __typename: "Product", + id: "UHJvZHVjdDoxMTU=", + isPublished: true, + name: "Black Hoodie", + productType: { + __typename: "ProductType", + id: "UHJvZHVjdFR5cGU6MTQ=", + name: "Top (clothing)" + }, + thumbnail: { + __typename: "Image", + url: placeholderImage + } + } + } + ], + pageInfo: { + __typename: "PageInfo", + endCursor: "YXJyYXljb25uZWN0aW9uOjM=", + hasNextPage: false, + hasPreviousPage: false, + startCursor: "YXJyYXljb25uZWN0aW9uOjA=" + }, + totalCount: 4 + }, + startDate: "2019-01-03", + type: "PERCENTAGE" as SaleType, + value: 30 +}; + +export const voucherDetails: VoucherDetails_voucher = { + __typename: "Voucher", + applyOncePerOrder: false, + categories: { + __typename: "CategoryCountableConnection", + edges: [], + pageInfo: { + __typename: "PageInfo", + endCursor: "YXJyYXljb25uZWN0aW9uOjM=", + hasNextPage: false, + hasPreviousPage: false, + startCursor: "YXJyYXljb25uZWN0aW9uOjA=" + }, + totalCount: 0 + }, + code: "DISCOUNT", + collections: { + __typename: "CollectionCountableConnection", + edges: [], + pageInfo: { + __typename: "PageInfo", + endCursor: "YXJyYXljb25uZWN0aW9uOjM=", + hasNextPage: false, + hasPreviousPage: false, + startCursor: "YXJyYXljb25uZWN0aW9uOjA=" + }, + totalCount: 0 + }, + countries: [ + { + __typename: "CountryDisplay", + code: "DE", + country: "Germany" + } + ], + discountValue: 25, + discountValueType: VoucherDiscountValueType.FIXED, + endDate: null, + id: "Vm91Y2hlcjoy", + minAmountSpent: { + __typename: "Money", + amount: 200, + currency: "USD" + }, + name: "Big order discount", + products: { + __typename: "ProductCountableConnection", + edges: [], + pageInfo: { + __typename: "PageInfo", + endCursor: "YXJyYXljb25uZWN0aW9uOjM=", + hasNextPage: false, + hasPreviousPage: false, + startCursor: "YXJyYXljb25uZWN0aW9uOjA=" + }, + totalCount: 0 + }, + startDate: "2018-11-27", + type: VoucherType.VALUE, + usageLimit: null, + used: 0 +}; diff --git a/src/discounts/index.tsx b/src/discounts/index.tsx new file mode 100644 index 000000000..40d4ba0b8 --- /dev/null +++ b/src/discounts/index.tsx @@ -0,0 +1,89 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { saleDetailsPageTab } from "./components/SaleDetailsPage"; +import { voucherDetailsPageTab } from "./components/VoucherDetailsPage"; +import { + saleAddPath, + saleListPath, + SaleListUrlQueryParams, + salePath, + SaleUrlQueryParams, + voucherAddPath, + voucherListPath, + VoucherListUrlQueryParams, + voucherPath, + VoucherUrlQueryParams +} from "./urls"; +import SaleCreateView from "./views/SaleCreate"; +import SaleDetailsViewComponent from "./views/SaleDetails"; +import SaleListViewComponent from "./views/SaleList"; +import VoucherCreateView from "./views/VoucherCreate"; +import VoucherDetailsViewComponent from "./views/VoucherDetails"; +import VoucherListViewComponent from "./views/VoucherList"; + +const SaleListView: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: SaleListUrlQueryParams = qs; + return ; +}; + +const SaleDetailsView: React.StatelessComponent< + RouteComponentProps<{ id: string }> +> = ({ match, location }) => { + const { activeTab, ...qs } = parseQs(location.search.substr(1)); + const params: SaleUrlQueryParams = { + ...qs, + activeTab: saleDetailsPageTab(activeTab) + }; + return ( + + ); +}; + +const VoucherListView: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: VoucherListUrlQueryParams = qs; + return ; +}; + +const VoucherDetailsView: React.StatelessComponent< + RouteComponentProps<{ id: string }> +> = ({ match, location }) => { + const { activeTab, ...qs } = parseQs(location.search.substr(1)); + const params: VoucherUrlQueryParams = { + ...qs, + activeTab: voucherDetailsPageTab(activeTab) + }; + return ( + + ); +}; + +export const DiscountSection: React.StatelessComponent<{}> = () => ( + <> + + + + + + + + + + +); +export default DiscountSection; diff --git a/src/discounts/mutations.ts b/src/discounts/mutations.ts new file mode 100644 index 000000000..0a3529b52 --- /dev/null +++ b/src/discounts/mutations.ts @@ -0,0 +1,276 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { + saleDetailsFragment, + saleFragment, + voucherDetailsFragment, + voucherFragment +} from "./queries"; +import { + SaleBulkDelete, + SaleBulkDeleteVariables +} from "./types/SaleBulkDelete"; +import { + SaleCataloguesAdd, + SaleCataloguesAddVariables +} from "./types/SaleCataloguesAdd"; +import { + SaleCataloguesRemove, + SaleCataloguesRemoveVariables +} from "./types/SaleCataloguesRemove"; +import { SaleCreate, SaleCreateVariables } from "./types/SaleCreate"; +import { SaleDelete, SaleDeleteVariables } from "./types/SaleDelete"; +import { SaleUpdate, SaleUpdateVariables } from "./types/SaleUpdate"; +import { + VoucherBulkDelete, + VoucherBulkDeleteVariables +} from "./types/VoucherBulkDelete"; +import { + VoucherCataloguesAdd, + VoucherCataloguesAddVariables +} from "./types/VoucherCataloguesAdd"; +import { + VoucherCataloguesRemove, + VoucherCataloguesRemoveVariables +} from "./types/VoucherCataloguesRemove"; +import { VoucherCreate, VoucherCreateVariables } from "./types/VoucherCreate"; +import { VoucherDelete, VoucherDeleteVariables } from "./types/VoucherDelete"; +import { VoucherUpdate, VoucherUpdateVariables } from "./types/VoucherUpdate"; + +const saleUpdate = gql` + ${saleFragment} + mutation SaleUpdate($input: SaleInput!, $id: ID!) { + saleUpdate(id: $id, input: $input) { + errors { + field + message + } + sale { + ...SaleFragment + } + } + } +`; +export const TypedSaleUpdate = TypedMutation( + saleUpdate +); + +const saleCataloguesAdd = gql` + ${saleDetailsFragment} + mutation SaleCataloguesAdd( + $input: CatalogueInput! + $id: ID! + $after: String + $before: String + $first: Int + $last: Int + ) { + saleCataloguesAdd(id: $id, input: $input) { + errors { + field + message + } + sale { + ...SaleDetailsFragment + } + } + } +`; +export const TypedSaleCataloguesAdd = TypedMutation< + SaleCataloguesAdd, + SaleCataloguesAddVariables +>(saleCataloguesAdd); + +const saleCataloguesRemove = gql` + ${saleDetailsFragment} + mutation SaleCataloguesRemove( + $input: CatalogueInput! + $id: ID! + $after: String + $before: String + $first: Int + $last: Int + ) { + saleCataloguesRemove(id: $id, input: $input) { + errors { + field + message + } + sale { + ...SaleDetailsFragment + } + } + } +`; +export const TypedSaleCataloguesRemove = TypedMutation< + SaleCataloguesRemove, + SaleCataloguesRemoveVariables +>(saleCataloguesRemove); + +const saleCreate = gql` + ${saleFragment} + mutation SaleCreate($input: SaleInput!) { + saleCreate(input: $input) { + errors { + field + message + } + sale { + ...SaleFragment + } + } + } +`; +export const TypedSaleCreate = TypedMutation( + saleCreate +); + +const saleDelete = gql` + mutation SaleDelete($id: ID!) { + saleDelete(id: $id) { + errors { + field + message + } + } + } +`; +export const TypedSaleDelete = TypedMutation( + saleDelete +); + +const saleBulkDelete = gql` + mutation SaleBulkDelete($ids: [ID]!) { + saleBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedSaleBulkDelete = TypedMutation< + SaleBulkDelete, + SaleBulkDeleteVariables +>(saleBulkDelete); + +const voucherUpdate = gql` + ${voucherFragment} + mutation VoucherUpdate($input: VoucherInput!, $id: ID!) { + voucherUpdate(id: $id, input: $input) { + errors { + field + message + } + voucher { + ...VoucherFragment + } + } + } +`; +export const TypedVoucherUpdate = TypedMutation< + VoucherUpdate, + VoucherUpdateVariables +>(voucherUpdate); + +const voucherCataloguesAdd = gql` + ${voucherDetailsFragment} + mutation VoucherCataloguesAdd( + $input: CatalogueInput! + $id: ID! + $after: String + $before: String + $first: Int + $last: Int + ) { + voucherCataloguesAdd(id: $id, input: $input) { + errors { + field + message + } + voucher { + ...VoucherDetailsFragment + } + } + } +`; +export const TypedVoucherCataloguesAdd = TypedMutation< + VoucherCataloguesAdd, + VoucherCataloguesAddVariables +>(voucherCataloguesAdd); + +const voucherCataloguesRemove = gql` + ${voucherDetailsFragment} + mutation VoucherCataloguesRemove( + $input: CatalogueInput! + $id: ID! + $after: String + $before: String + $first: Int + $last: Int + ) { + voucherCataloguesRemove(id: $id, input: $input) { + errors { + field + message + } + voucher { + ...VoucherDetailsFragment + } + } + } +`; +export const TypedVoucherCataloguesRemove = TypedMutation< + VoucherCataloguesRemove, + VoucherCataloguesRemoveVariables +>(voucherCataloguesRemove); + +const voucherCreate = gql` + ${voucherFragment} + mutation VoucherCreate($input: VoucherInput!) { + voucherCreate(input: $input) { + errors { + field + message + } + voucher { + ...VoucherFragment + } + } + } +`; +export const TypedVoucherCreate = TypedMutation< + VoucherCreate, + VoucherCreateVariables +>(voucherCreate); + +const voucherDelete = gql` + mutation VoucherDelete($id: ID!) { + voucherDelete(id: $id) { + errors { + field + message + } + } + } +`; +export const TypedVoucherDelete = TypedMutation< + VoucherDelete, + VoucherDeleteVariables +>(voucherDelete); + +const voucherBulkDelete = gql` + mutation VoucherBulkDelete($ids: [ID]!) { + voucherBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedVoucherBulkDelete = TypedMutation< + VoucherBulkDelete, + VoucherBulkDeleteVariables +>(voucherBulkDelete); diff --git a/src/discounts/queries.ts b/src/discounts/queries.ts new file mode 100644 index 000000000..e5905952b --- /dev/null +++ b/src/discounts/queries.ts @@ -0,0 +1,237 @@ +import gql from "graphql-tag"; + +import { pageInfoFragment, TypedQuery } from "../queries"; +import { SaleDetails, SaleDetailsVariables } from "./types/SaleDetails"; +import { SaleList, SaleListVariables } from "./types/SaleList"; +import { + VoucherDetails, + VoucherDetailsVariables +} from "./types/VoucherDetails"; +import { VoucherList, VoucherListVariables } from "./types/VoucherList"; + +export const saleFragment = gql` + fragment SaleFragment on Sale { + id + name + type + startDate + endDate + value + } +`; + +export const saleDetailsFragment = gql` + ${pageInfoFragment} + ${saleFragment} + fragment SaleDetailsFragment on Sale { + ...SaleFragment + products(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + id + name + isPublished + productType { + id + name + } + thumbnail { + url + } + } + } + pageInfo { + ...PageInfoFragment + } + totalCount + } + categories(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + id + name + products { + totalCount + } + } + } + pageInfo { + ...PageInfoFragment + } + totalCount + } + collections(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + id + name + products { + totalCount + } + } + } + pageInfo { + ...PageInfoFragment + } + totalCount + } + } +`; + +export const voucherFragment = gql` + fragment VoucherFragment on Voucher { + id + name + startDate + endDate + usageLimit + discountValueType + discountValue + countries { + code + country + } + minAmountSpent { + currency + amount + } + } +`; + +export const voucherDetailsFragment = gql` + ${pageInfoFragment} + ${voucherFragment} + fragment VoucherDetailsFragment on Voucher { + ...VoucherFragment + type + code + usageLimit + used + applyOncePerOrder + products(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + id + name + productType { + id + name + } + isPublished + thumbnail { + url + } + } + } + totalCount + pageInfo { + ...PageInfoFragment + } + } + collections(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + id + name + products { + totalCount + } + } + } + totalCount + pageInfo { + ...PageInfoFragment + } + } + categories(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + id + name + products { + totalCount + } + } + } + totalCount + pageInfo { + ...PageInfoFragment + } + } + } +`; + +export const saleList = gql` + ${pageInfoFragment} + ${saleFragment} + query SaleList($after: String, $before: String, $first: Int, $last: Int) { + sales(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + ...SaleFragment + } + } + pageInfo { + ...PageInfoFragment + } + } + } +`; +export const TypedSaleList = TypedQuery(saleList); + +export const voucherList = gql` + ${pageInfoFragment} + ${voucherFragment} + query VoucherList($after: String, $before: String, $first: Int, $last: Int) { + vouchers(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + ...VoucherFragment + } + } + pageInfo { + ...PageInfoFragment + } + } + } +`; +export const TypedVoucherList = TypedQuery( + voucherList +); + +export const saleDetails = gql` + ${saleDetailsFragment} + query SaleDetails( + $id: ID! + $after: String + $before: String + $first: Int + $last: Int + ) { + sale(id: $id) { + ...SaleDetailsFragment + } + } +`; +export const TypedSaleDetails = TypedQuery( + saleDetails +); + +const voucherDetails = gql` + ${voucherDetailsFragment} + query VoucherDetails( + $id: ID! + $after: String + $before: String + $first: Int + $last: Int + ) { + voucher(id: $id) { + ...VoucherDetailsFragment + } + } +`; +export const TypedVoucherDetails = TypedQuery< + VoucherDetails, + VoucherDetailsVariables +>(voucherDetails); diff --git a/src/discounts/translations.ts b/src/discounts/translations.ts new file mode 100644 index 000000000..b6f6af8e5 --- /dev/null +++ b/src/discounts/translations.ts @@ -0,0 +1,10 @@ +import i18n from "../i18n"; +import { VoucherType } from "../types/globalTypes"; + +export const translateVoucherTypes = () => ({ + [VoucherType.CATEGORY]: i18n.t("Selected Categories"), + [VoucherType.COLLECTION]: i18n.t("Selected Collections"), + [VoucherType.PRODUCT]: i18n.t("Selected Products"), + [VoucherType.SHIPPING]: i18n.t("Shipment"), + [VoucherType.VALUE]: i18n.t("All Products") +}); diff --git a/src/discounts/types/SaleBulkDelete.ts b/src/discounts/types/SaleBulkDelete.ts new file mode 100644 index 000000000..e02fcbac0 --- /dev/null +++ b/src/discounts/types/SaleBulkDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: SaleBulkDelete +// ==================================================== + +export interface SaleBulkDelete_saleBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface SaleBulkDelete_saleBulkDelete { + __typename: "SaleBulkDelete"; + errors: SaleBulkDelete_saleBulkDelete_errors[] | null; +} + +export interface SaleBulkDelete { + saleBulkDelete: SaleBulkDelete_saleBulkDelete | null; +} + +export interface SaleBulkDeleteVariables { + ids: (string | null)[]; +} diff --git a/src/discounts/types/SaleCataloguesAdd.ts b/src/discounts/types/SaleCataloguesAdd.ts new file mode 100644 index 000000000..3f1302316 --- /dev/null +++ b/src/discounts/types/SaleCataloguesAdd.ts @@ -0,0 +1,151 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CatalogueInput, SaleType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: SaleCataloguesAdd +// ==================================================== + +export interface SaleCataloguesAdd_saleCataloguesAdd_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_products_edges_node { + __typename: "Product"; + id: string; + name: string; + isPublished: boolean; + productType: SaleCataloguesAdd_saleCataloguesAdd_sale_products_edges_node_productType; + thumbnail: SaleCataloguesAdd_saleCataloguesAdd_sale_products_edges_node_thumbnail | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_products_edges { + __typename: "ProductCountableEdge"; + node: SaleCataloguesAdd_saleCataloguesAdd_sale_products_edges_node; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_products { + __typename: "ProductCountableConnection"; + edges: SaleCataloguesAdd_saleCataloguesAdd_sale_products_edges[]; + pageInfo: SaleCataloguesAdd_saleCataloguesAdd_sale_products_pageInfo; + totalCount: number | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + products: SaleCataloguesAdd_saleCataloguesAdd_sale_categories_edges_node_products | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_categories_edges { + __typename: "CategoryCountableEdge"; + node: SaleCataloguesAdd_saleCataloguesAdd_sale_categories_edges_node; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_categories_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_categories { + __typename: "CategoryCountableConnection"; + edges: SaleCataloguesAdd_saleCataloguesAdd_sale_categories_edges[]; + pageInfo: SaleCataloguesAdd_saleCataloguesAdd_sale_categories_pageInfo; + totalCount: number | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_collections_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_collections_edges_node { + __typename: "Collection"; + id: string; + name: string; + products: SaleCataloguesAdd_saleCataloguesAdd_sale_collections_edges_node_products | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_collections_edges { + __typename: "CollectionCountableEdge"; + node: SaleCataloguesAdd_saleCataloguesAdd_sale_collections_edges_node; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_collections_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale_collections { + __typename: "CollectionCountableConnection"; + edges: SaleCataloguesAdd_saleCataloguesAdd_sale_collections_edges[]; + pageInfo: SaleCataloguesAdd_saleCataloguesAdd_sale_collections_pageInfo; + totalCount: number | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd_sale { + __typename: "Sale"; + id: string; + name: string; + type: SaleType; + startDate: any; + endDate: any | null; + value: number; + products: SaleCataloguesAdd_saleCataloguesAdd_sale_products | null; + categories: SaleCataloguesAdd_saleCataloguesAdd_sale_categories | null; + collections: SaleCataloguesAdd_saleCataloguesAdd_sale_collections | null; +} + +export interface SaleCataloguesAdd_saleCataloguesAdd { + __typename: "SaleAddCatalogues"; + errors: SaleCataloguesAdd_saleCataloguesAdd_errors[] | null; + sale: SaleCataloguesAdd_saleCataloguesAdd_sale | null; +} + +export interface SaleCataloguesAdd { + saleCataloguesAdd: SaleCataloguesAdd_saleCataloguesAdd | null; +} + +export interface SaleCataloguesAddVariables { + input: CatalogueInput; + id: string; + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/discounts/types/SaleCataloguesRemove.ts b/src/discounts/types/SaleCataloguesRemove.ts new file mode 100644 index 000000000..96746e461 --- /dev/null +++ b/src/discounts/types/SaleCataloguesRemove.ts @@ -0,0 +1,151 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CatalogueInput, SaleType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: SaleCataloguesRemove +// ==================================================== + +export interface SaleCataloguesRemove_saleCataloguesRemove_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_products_edges_node { + __typename: "Product"; + id: string; + name: string; + isPublished: boolean; + productType: SaleCataloguesRemove_saleCataloguesRemove_sale_products_edges_node_productType; + thumbnail: SaleCataloguesRemove_saleCataloguesRemove_sale_products_edges_node_thumbnail | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_products_edges { + __typename: "ProductCountableEdge"; + node: SaleCataloguesRemove_saleCataloguesRemove_sale_products_edges_node; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_products { + __typename: "ProductCountableConnection"; + edges: SaleCataloguesRemove_saleCataloguesRemove_sale_products_edges[]; + pageInfo: SaleCataloguesRemove_saleCataloguesRemove_sale_products_pageInfo; + totalCount: number | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + products: SaleCataloguesRemove_saleCataloguesRemove_sale_categories_edges_node_products | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_categories_edges { + __typename: "CategoryCountableEdge"; + node: SaleCataloguesRemove_saleCataloguesRemove_sale_categories_edges_node; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_categories_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_categories { + __typename: "CategoryCountableConnection"; + edges: SaleCataloguesRemove_saleCataloguesRemove_sale_categories_edges[]; + pageInfo: SaleCataloguesRemove_saleCataloguesRemove_sale_categories_pageInfo; + totalCount: number | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_collections_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_collections_edges_node { + __typename: "Collection"; + id: string; + name: string; + products: SaleCataloguesRemove_saleCataloguesRemove_sale_collections_edges_node_products | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_collections_edges { + __typename: "CollectionCountableEdge"; + node: SaleCataloguesRemove_saleCataloguesRemove_sale_collections_edges_node; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_collections_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale_collections { + __typename: "CollectionCountableConnection"; + edges: SaleCataloguesRemove_saleCataloguesRemove_sale_collections_edges[]; + pageInfo: SaleCataloguesRemove_saleCataloguesRemove_sale_collections_pageInfo; + totalCount: number | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove_sale { + __typename: "Sale"; + id: string; + name: string; + type: SaleType; + startDate: any; + endDate: any | null; + value: number; + products: SaleCataloguesRemove_saleCataloguesRemove_sale_products | null; + categories: SaleCataloguesRemove_saleCataloguesRemove_sale_categories | null; + collections: SaleCataloguesRemove_saleCataloguesRemove_sale_collections | null; +} + +export interface SaleCataloguesRemove_saleCataloguesRemove { + __typename: "SaleRemoveCatalogues"; + errors: SaleCataloguesRemove_saleCataloguesRemove_errors[] | null; + sale: SaleCataloguesRemove_saleCataloguesRemove_sale | null; +} + +export interface SaleCataloguesRemove { + saleCataloguesRemove: SaleCataloguesRemove_saleCataloguesRemove | null; +} + +export interface SaleCataloguesRemoveVariables { + input: CatalogueInput; + id: string; + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/discounts/types/SaleCreate.ts b/src/discounts/types/SaleCreate.ts new file mode 100644 index 000000000..0f30617fc --- /dev/null +++ b/src/discounts/types/SaleCreate.ts @@ -0,0 +1,39 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { SaleInput, SaleType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: SaleCreate +// ==================================================== + +export interface SaleCreate_saleCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface SaleCreate_saleCreate_sale { + __typename: "Sale"; + id: string; + name: string; + type: SaleType; + startDate: any; + endDate: any | null; + value: number; +} + +export interface SaleCreate_saleCreate { + __typename: "SaleCreate"; + errors: SaleCreate_saleCreate_errors[] | null; + sale: SaleCreate_saleCreate_sale | null; +} + +export interface SaleCreate { + saleCreate: SaleCreate_saleCreate | null; +} + +export interface SaleCreateVariables { + input: SaleInput; +} diff --git a/src/discounts/types/SaleDelete.ts b/src/discounts/types/SaleDelete.ts new file mode 100644 index 000000000..b11575381 --- /dev/null +++ b/src/discounts/types/SaleDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: SaleDelete +// ==================================================== + +export interface SaleDelete_saleDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface SaleDelete_saleDelete { + __typename: "SaleDelete"; + errors: SaleDelete_saleDelete_errors[] | null; +} + +export interface SaleDelete { + saleDelete: SaleDelete_saleDelete | null; +} + +export interface SaleDeleteVariables { + id: string; +} diff --git a/src/discounts/types/SaleDetails.ts b/src/discounts/types/SaleDetails.ts new file mode 100644 index 000000000..938563606 --- /dev/null +++ b/src/discounts/types/SaleDetails.ts @@ -0,0 +1,138 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { SaleType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: SaleDetails +// ==================================================== + +export interface SaleDetails_sale_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface SaleDetails_sale_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface SaleDetails_sale_products_edges_node { + __typename: "Product"; + id: string; + name: string; + isPublished: boolean; + productType: SaleDetails_sale_products_edges_node_productType; + thumbnail: SaleDetails_sale_products_edges_node_thumbnail | null; +} + +export interface SaleDetails_sale_products_edges { + __typename: "ProductCountableEdge"; + node: SaleDetails_sale_products_edges_node; +} + +export interface SaleDetails_sale_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleDetails_sale_products { + __typename: "ProductCountableConnection"; + edges: SaleDetails_sale_products_edges[]; + pageInfo: SaleDetails_sale_products_pageInfo; + totalCount: number | null; +} + +export interface SaleDetails_sale_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface SaleDetails_sale_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + products: SaleDetails_sale_categories_edges_node_products | null; +} + +export interface SaleDetails_sale_categories_edges { + __typename: "CategoryCountableEdge"; + node: SaleDetails_sale_categories_edges_node; +} + +export interface SaleDetails_sale_categories_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleDetails_sale_categories { + __typename: "CategoryCountableConnection"; + edges: SaleDetails_sale_categories_edges[]; + pageInfo: SaleDetails_sale_categories_pageInfo; + totalCount: number | null; +} + +export interface SaleDetails_sale_collections_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface SaleDetails_sale_collections_edges_node { + __typename: "Collection"; + id: string; + name: string; + products: SaleDetails_sale_collections_edges_node_products | null; +} + +export interface SaleDetails_sale_collections_edges { + __typename: "CollectionCountableEdge"; + node: SaleDetails_sale_collections_edges_node; +} + +export interface SaleDetails_sale_collections_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleDetails_sale_collections { + __typename: "CollectionCountableConnection"; + edges: SaleDetails_sale_collections_edges[]; + pageInfo: SaleDetails_sale_collections_pageInfo; + totalCount: number | null; +} + +export interface SaleDetails_sale { + __typename: "Sale"; + id: string; + name: string; + type: SaleType; + startDate: any; + endDate: any | null; + value: number; + products: SaleDetails_sale_products | null; + categories: SaleDetails_sale_categories | null; + collections: SaleDetails_sale_collections | null; +} + +export interface SaleDetails { + sale: SaleDetails_sale | null; +} + +export interface SaleDetailsVariables { + id: string; + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/discounts/types/SaleDetailsFragment.ts b/src/discounts/types/SaleDetailsFragment.ts new file mode 100644 index 000000000..be8362a70 --- /dev/null +++ b/src/discounts/types/SaleDetailsFragment.ts @@ -0,0 +1,126 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { SaleType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: SaleDetailsFragment +// ==================================================== + +export interface SaleDetailsFragment_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface SaleDetailsFragment_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface SaleDetailsFragment_products_edges_node { + __typename: "Product"; + id: string; + name: string; + isPublished: boolean; + productType: SaleDetailsFragment_products_edges_node_productType; + thumbnail: SaleDetailsFragment_products_edges_node_thumbnail | null; +} + +export interface SaleDetailsFragment_products_edges { + __typename: "ProductCountableEdge"; + node: SaleDetailsFragment_products_edges_node; +} + +export interface SaleDetailsFragment_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleDetailsFragment_products { + __typename: "ProductCountableConnection"; + edges: SaleDetailsFragment_products_edges[]; + pageInfo: SaleDetailsFragment_products_pageInfo; + totalCount: number | null; +} + +export interface SaleDetailsFragment_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface SaleDetailsFragment_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + products: SaleDetailsFragment_categories_edges_node_products | null; +} + +export interface SaleDetailsFragment_categories_edges { + __typename: "CategoryCountableEdge"; + node: SaleDetailsFragment_categories_edges_node; +} + +export interface SaleDetailsFragment_categories_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleDetailsFragment_categories { + __typename: "CategoryCountableConnection"; + edges: SaleDetailsFragment_categories_edges[]; + pageInfo: SaleDetailsFragment_categories_pageInfo; + totalCount: number | null; +} + +export interface SaleDetailsFragment_collections_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface SaleDetailsFragment_collections_edges_node { + __typename: "Collection"; + id: string; + name: string; + products: SaleDetailsFragment_collections_edges_node_products | null; +} + +export interface SaleDetailsFragment_collections_edges { + __typename: "CollectionCountableEdge"; + node: SaleDetailsFragment_collections_edges_node; +} + +export interface SaleDetailsFragment_collections_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleDetailsFragment_collections { + __typename: "CollectionCountableConnection"; + edges: SaleDetailsFragment_collections_edges[]; + pageInfo: SaleDetailsFragment_collections_pageInfo; + totalCount: number | null; +} + +export interface SaleDetailsFragment { + __typename: "Sale"; + id: string; + name: string; + type: SaleType; + startDate: any; + endDate: any | null; + value: number; + products: SaleDetailsFragment_products | null; + categories: SaleDetailsFragment_categories | null; + collections: SaleDetailsFragment_collections | null; +} diff --git a/src/discounts/types/SaleFragment.ts b/src/discounts/types/SaleFragment.ts new file mode 100644 index 000000000..ef6a4ff0e --- /dev/null +++ b/src/discounts/types/SaleFragment.ts @@ -0,0 +1,19 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { SaleType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: SaleFragment +// ==================================================== + +export interface SaleFragment { + __typename: "Sale"; + id: string; + name: string; + type: SaleType; + startDate: any; + endDate: any | null; + value: number; +} diff --git a/src/discounts/types/SaleList.ts b/src/discounts/types/SaleList.ts new file mode 100644 index 000000000..0667b9b72 --- /dev/null +++ b/src/discounts/types/SaleList.ts @@ -0,0 +1,49 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { SaleType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: SaleList +// ==================================================== + +export interface SaleList_sales_edges_node { + __typename: "Sale"; + id: string; + name: string; + type: SaleType; + startDate: any; + endDate: any | null; + value: number; +} + +export interface SaleList_sales_edges { + __typename: "SaleCountableEdge"; + node: SaleList_sales_edges_node; +} + +export interface SaleList_sales_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SaleList_sales { + __typename: "SaleCountableConnection"; + edges: SaleList_sales_edges[]; + pageInfo: SaleList_sales_pageInfo; +} + +export interface SaleList { + sales: SaleList_sales | null; +} + +export interface SaleListVariables { + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/discounts/types/SaleUpdate.ts b/src/discounts/types/SaleUpdate.ts new file mode 100644 index 000000000..ca835efb5 --- /dev/null +++ b/src/discounts/types/SaleUpdate.ts @@ -0,0 +1,40 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { SaleInput, SaleType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: SaleUpdate +// ==================================================== + +export interface SaleUpdate_saleUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface SaleUpdate_saleUpdate_sale { + __typename: "Sale"; + id: string; + name: string; + type: SaleType; + startDate: any; + endDate: any | null; + value: number; +} + +export interface SaleUpdate_saleUpdate { + __typename: "SaleUpdate"; + errors: SaleUpdate_saleUpdate_errors[] | null; + sale: SaleUpdate_saleUpdate_sale | null; +} + +export interface SaleUpdate { + saleUpdate: SaleUpdate_saleUpdate | null; +} + +export interface SaleUpdateVariables { + input: SaleInput; + id: string; +} diff --git a/src/discounts/types/VoucherBulkDelete.ts b/src/discounts/types/VoucherBulkDelete.ts new file mode 100644 index 000000000..ac3277e75 --- /dev/null +++ b/src/discounts/types/VoucherBulkDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: VoucherBulkDelete +// ==================================================== + +export interface VoucherBulkDelete_voucherBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VoucherBulkDelete_voucherBulkDelete { + __typename: "VoucherBulkDelete"; + errors: VoucherBulkDelete_voucherBulkDelete_errors[] | null; +} + +export interface VoucherBulkDelete { + voucherBulkDelete: VoucherBulkDelete_voucherBulkDelete | null; +} + +export interface VoucherBulkDeleteVariables { + ids: (string | null)[]; +} diff --git a/src/discounts/types/VoucherCataloguesAdd.ts b/src/discounts/types/VoucherCataloguesAdd.ts new file mode 100644 index 000000000..f005d2e19 --- /dev/null +++ b/src/discounts/types/VoucherCataloguesAdd.ts @@ -0,0 +1,170 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CatalogueInput, VoucherDiscountValueType, VoucherType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: VoucherCataloguesAdd +// ==================================================== + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_minAmountSpent { + __typename: "Money"; + currency: string; + amount: number; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_edges_node { + __typename: "Product"; + id: string; + name: string; + productType: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_edges_node_productType; + isPublished: boolean; + thumbnail: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_edges_node_thumbnail | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_edges { + __typename: "ProductCountableEdge"; + node: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_edges_node; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products { + __typename: "ProductCountableConnection"; + edges: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_edges[]; + totalCount: number | null; + pageInfo: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products_pageInfo; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections_edges_node { + __typename: "Collection"; + id: string; + name: string; + products: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections_edges_node_products | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections_edges { + __typename: "CollectionCountableEdge"; + node: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections_edges_node; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections { + __typename: "CollectionCountableConnection"; + edges: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections_edges[]; + totalCount: number | null; + pageInfo: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections_pageInfo; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + products: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories_edges_node_products | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories_edges { + __typename: "CategoryCountableEdge"; + node: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories_edges_node; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories { + __typename: "CategoryCountableConnection"; + edges: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories_edges[]; + totalCount: number | null; + pageInfo: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories_pageInfo; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd_voucher { + __typename: "Voucher"; + id: string; + name: string | null; + startDate: any; + endDate: any | null; + usageLimit: number | null; + discountValueType: VoucherDiscountValueType; + discountValue: number; + countries: (VoucherCataloguesAdd_voucherCataloguesAdd_voucher_countries | null)[] | null; + minAmountSpent: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_minAmountSpent | null; + type: VoucherType; + code: string; + used: number; + applyOncePerOrder: boolean; + products: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_products | null; + collections: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_collections | null; + categories: VoucherCataloguesAdd_voucherCataloguesAdd_voucher_categories | null; +} + +export interface VoucherCataloguesAdd_voucherCataloguesAdd { + __typename: "VoucherAddCatalogues"; + errors: VoucherCataloguesAdd_voucherCataloguesAdd_errors[] | null; + voucher: VoucherCataloguesAdd_voucherCataloguesAdd_voucher | null; +} + +export interface VoucherCataloguesAdd { + voucherCataloguesAdd: VoucherCataloguesAdd_voucherCataloguesAdd | null; +} + +export interface VoucherCataloguesAddVariables { + input: CatalogueInput; + id: string; + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/discounts/types/VoucherCataloguesRemove.ts b/src/discounts/types/VoucherCataloguesRemove.ts new file mode 100644 index 000000000..417934c69 --- /dev/null +++ b/src/discounts/types/VoucherCataloguesRemove.ts @@ -0,0 +1,170 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { CatalogueInput, VoucherDiscountValueType, VoucherType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: VoucherCataloguesRemove +// ==================================================== + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_minAmountSpent { + __typename: "Money"; + currency: string; + amount: number; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_edges_node { + __typename: "Product"; + id: string; + name: string; + productType: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_edges_node_productType; + isPublished: boolean; + thumbnail: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_edges_node_thumbnail | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_edges { + __typename: "ProductCountableEdge"; + node: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_edges_node; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products { + __typename: "ProductCountableConnection"; + edges: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_edges[]; + totalCount: number | null; + pageInfo: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products_pageInfo; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections_edges_node { + __typename: "Collection"; + id: string; + name: string; + products: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections_edges_node_products | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections_edges { + __typename: "CollectionCountableEdge"; + node: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections_edges_node; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections { + __typename: "CollectionCountableConnection"; + edges: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections_edges[]; + totalCount: number | null; + pageInfo: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections_pageInfo; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + products: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories_edges_node_products | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories_edges { + __typename: "CategoryCountableEdge"; + node: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories_edges_node; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories { + __typename: "CategoryCountableConnection"; + edges: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories_edges[]; + totalCount: number | null; + pageInfo: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories_pageInfo; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove_voucher { + __typename: "Voucher"; + id: string; + name: string | null; + startDate: any; + endDate: any | null; + usageLimit: number | null; + discountValueType: VoucherDiscountValueType; + discountValue: number; + countries: (VoucherCataloguesRemove_voucherCataloguesRemove_voucher_countries | null)[] | null; + minAmountSpent: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_minAmountSpent | null; + type: VoucherType; + code: string; + used: number; + applyOncePerOrder: boolean; + products: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_products | null; + collections: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_collections | null; + categories: VoucherCataloguesRemove_voucherCataloguesRemove_voucher_categories | null; +} + +export interface VoucherCataloguesRemove_voucherCataloguesRemove { + __typename: "VoucherRemoveCatalogues"; + errors: VoucherCataloguesRemove_voucherCataloguesRemove_errors[] | null; + voucher: VoucherCataloguesRemove_voucherCataloguesRemove_voucher | null; +} + +export interface VoucherCataloguesRemove { + voucherCataloguesRemove: VoucherCataloguesRemove_voucherCataloguesRemove | null; +} + +export interface VoucherCataloguesRemoveVariables { + input: CatalogueInput; + id: string; + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/discounts/types/VoucherCreate.ts b/src/discounts/types/VoucherCreate.ts new file mode 100644 index 000000000..eca02664f --- /dev/null +++ b/src/discounts/types/VoucherCreate.ts @@ -0,0 +1,54 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { VoucherInput, VoucherDiscountValueType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: VoucherCreate +// ==================================================== + +export interface VoucherCreate_voucherCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VoucherCreate_voucherCreate_voucher_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface VoucherCreate_voucherCreate_voucher_minAmountSpent { + __typename: "Money"; + currency: string; + amount: number; +} + +export interface VoucherCreate_voucherCreate_voucher { + __typename: "Voucher"; + id: string; + name: string | null; + startDate: any; + endDate: any | null; + usageLimit: number | null; + discountValueType: VoucherDiscountValueType; + discountValue: number; + countries: (VoucherCreate_voucherCreate_voucher_countries | null)[] | null; + minAmountSpent: VoucherCreate_voucherCreate_voucher_minAmountSpent | null; +} + +export interface VoucherCreate_voucherCreate { + __typename: "VoucherCreate"; + errors: VoucherCreate_voucherCreate_errors[] | null; + voucher: VoucherCreate_voucherCreate_voucher | null; +} + +export interface VoucherCreate { + voucherCreate: VoucherCreate_voucherCreate | null; +} + +export interface VoucherCreateVariables { + input: VoucherInput; +} diff --git a/src/discounts/types/VoucherDelete.ts b/src/discounts/types/VoucherDelete.ts new file mode 100644 index 000000000..7a0fc7f4c --- /dev/null +++ b/src/discounts/types/VoucherDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: VoucherDelete +// ==================================================== + +export interface VoucherDelete_voucherDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VoucherDelete_voucherDelete { + __typename: "VoucherDelete"; + errors: VoucherDelete_voucherDelete_errors[] | null; +} + +export interface VoucherDelete { + voucherDelete: VoucherDelete_voucherDelete | null; +} + +export interface VoucherDeleteVariables { + id: string; +} diff --git a/src/discounts/types/VoucherDetails.ts b/src/discounts/types/VoucherDetails.ts new file mode 100644 index 000000000..dae5f8b1a --- /dev/null +++ b/src/discounts/types/VoucherDetails.ts @@ -0,0 +1,157 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { VoucherDiscountValueType, VoucherType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: VoucherDetails +// ==================================================== + +export interface VoucherDetails_voucher_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface VoucherDetails_voucher_minAmountSpent { + __typename: "Money"; + currency: string; + amount: number; +} + +export interface VoucherDetails_voucher_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface VoucherDetails_voucher_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface VoucherDetails_voucher_products_edges_node { + __typename: "Product"; + id: string; + name: string; + productType: VoucherDetails_voucher_products_edges_node_productType; + isPublished: boolean; + thumbnail: VoucherDetails_voucher_products_edges_node_thumbnail | null; +} + +export interface VoucherDetails_voucher_products_edges { + __typename: "ProductCountableEdge"; + node: VoucherDetails_voucher_products_edges_node; +} + +export interface VoucherDetails_voucher_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherDetails_voucher_products { + __typename: "ProductCountableConnection"; + edges: VoucherDetails_voucher_products_edges[]; + totalCount: number | null; + pageInfo: VoucherDetails_voucher_products_pageInfo; +} + +export interface VoucherDetails_voucher_collections_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface VoucherDetails_voucher_collections_edges_node { + __typename: "Collection"; + id: string; + name: string; + products: VoucherDetails_voucher_collections_edges_node_products | null; +} + +export interface VoucherDetails_voucher_collections_edges { + __typename: "CollectionCountableEdge"; + node: VoucherDetails_voucher_collections_edges_node; +} + +export interface VoucherDetails_voucher_collections_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherDetails_voucher_collections { + __typename: "CollectionCountableConnection"; + edges: VoucherDetails_voucher_collections_edges[]; + totalCount: number | null; + pageInfo: VoucherDetails_voucher_collections_pageInfo; +} + +export interface VoucherDetails_voucher_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface VoucherDetails_voucher_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + products: VoucherDetails_voucher_categories_edges_node_products | null; +} + +export interface VoucherDetails_voucher_categories_edges { + __typename: "CategoryCountableEdge"; + node: VoucherDetails_voucher_categories_edges_node; +} + +export interface VoucherDetails_voucher_categories_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherDetails_voucher_categories { + __typename: "CategoryCountableConnection"; + edges: VoucherDetails_voucher_categories_edges[]; + totalCount: number | null; + pageInfo: VoucherDetails_voucher_categories_pageInfo; +} + +export interface VoucherDetails_voucher { + __typename: "Voucher"; + id: string; + name: string | null; + startDate: any; + endDate: any | null; + usageLimit: number | null; + discountValueType: VoucherDiscountValueType; + discountValue: number; + countries: (VoucherDetails_voucher_countries | null)[] | null; + minAmountSpent: VoucherDetails_voucher_minAmountSpent | null; + type: VoucherType; + code: string; + used: number; + applyOncePerOrder: boolean; + products: VoucherDetails_voucher_products | null; + collections: VoucherDetails_voucher_collections | null; + categories: VoucherDetails_voucher_categories | null; +} + +export interface VoucherDetails { + voucher: VoucherDetails_voucher | null; +} + +export interface VoucherDetailsVariables { + id: string; + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/discounts/types/VoucherDetailsFragment.ts b/src/discounts/types/VoucherDetailsFragment.ts new file mode 100644 index 000000000..b34b7d793 --- /dev/null +++ b/src/discounts/types/VoucherDetailsFragment.ts @@ -0,0 +1,145 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { VoucherDiscountValueType, VoucherType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: VoucherDetailsFragment +// ==================================================== + +export interface VoucherDetailsFragment_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface VoucherDetailsFragment_minAmountSpent { + __typename: "Money"; + currency: string; + amount: number; +} + +export interface VoucherDetailsFragment_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface VoucherDetailsFragment_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface VoucherDetailsFragment_products_edges_node { + __typename: "Product"; + id: string; + name: string; + productType: VoucherDetailsFragment_products_edges_node_productType; + isPublished: boolean; + thumbnail: VoucherDetailsFragment_products_edges_node_thumbnail | null; +} + +export interface VoucherDetailsFragment_products_edges { + __typename: "ProductCountableEdge"; + node: VoucherDetailsFragment_products_edges_node; +} + +export interface VoucherDetailsFragment_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherDetailsFragment_products { + __typename: "ProductCountableConnection"; + edges: VoucherDetailsFragment_products_edges[]; + totalCount: number | null; + pageInfo: VoucherDetailsFragment_products_pageInfo; +} + +export interface VoucherDetailsFragment_collections_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface VoucherDetailsFragment_collections_edges_node { + __typename: "Collection"; + id: string; + name: string; + products: VoucherDetailsFragment_collections_edges_node_products | null; +} + +export interface VoucherDetailsFragment_collections_edges { + __typename: "CollectionCountableEdge"; + node: VoucherDetailsFragment_collections_edges_node; +} + +export interface VoucherDetailsFragment_collections_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherDetailsFragment_collections { + __typename: "CollectionCountableConnection"; + edges: VoucherDetailsFragment_collections_edges[]; + totalCount: number | null; + pageInfo: VoucherDetailsFragment_collections_pageInfo; +} + +export interface VoucherDetailsFragment_categories_edges_node_products { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface VoucherDetailsFragment_categories_edges_node { + __typename: "Category"; + id: string; + name: string; + products: VoucherDetailsFragment_categories_edges_node_products | null; +} + +export interface VoucherDetailsFragment_categories_edges { + __typename: "CategoryCountableEdge"; + node: VoucherDetailsFragment_categories_edges_node; +} + +export interface VoucherDetailsFragment_categories_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherDetailsFragment_categories { + __typename: "CategoryCountableConnection"; + edges: VoucherDetailsFragment_categories_edges[]; + totalCount: number | null; + pageInfo: VoucherDetailsFragment_categories_pageInfo; +} + +export interface VoucherDetailsFragment { + __typename: "Voucher"; + id: string; + name: string | null; + startDate: any; + endDate: any | null; + usageLimit: number | null; + discountValueType: VoucherDiscountValueType; + discountValue: number; + countries: (VoucherDetailsFragment_countries | null)[] | null; + minAmountSpent: VoucherDetailsFragment_minAmountSpent | null; + type: VoucherType; + code: string; + used: number; + applyOncePerOrder: boolean; + products: VoucherDetailsFragment_products | null; + collections: VoucherDetailsFragment_collections | null; + categories: VoucherDetailsFragment_categories | null; +} diff --git a/src/discounts/types/VoucherFragment.ts b/src/discounts/types/VoucherFragment.ts new file mode 100644 index 000000000..c8d8aab47 --- /dev/null +++ b/src/discounts/types/VoucherFragment.ts @@ -0,0 +1,34 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { VoucherDiscountValueType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: VoucherFragment +// ==================================================== + +export interface VoucherFragment_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface VoucherFragment_minAmountSpent { + __typename: "Money"; + currency: string; + amount: number; +} + +export interface VoucherFragment { + __typename: "Voucher"; + id: string; + name: string | null; + startDate: any; + endDate: any | null; + usageLimit: number | null; + discountValueType: VoucherDiscountValueType; + discountValue: number; + countries: (VoucherFragment_countries | null)[] | null; + minAmountSpent: VoucherFragment_minAmountSpent | null; +} diff --git a/src/discounts/types/VoucherList.ts b/src/discounts/types/VoucherList.ts new file mode 100644 index 000000000..cce0df721 --- /dev/null +++ b/src/discounts/types/VoucherList.ts @@ -0,0 +1,64 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { VoucherDiscountValueType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: VoucherList +// ==================================================== + +export interface VoucherList_vouchers_edges_node_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface VoucherList_vouchers_edges_node_minAmountSpent { + __typename: "Money"; + currency: string; + amount: number; +} + +export interface VoucherList_vouchers_edges_node { + __typename: "Voucher"; + id: string; + name: string | null; + startDate: any; + endDate: any | null; + usageLimit: number | null; + discountValueType: VoucherDiscountValueType; + discountValue: number; + countries: (VoucherList_vouchers_edges_node_countries | null)[] | null; + minAmountSpent: VoucherList_vouchers_edges_node_minAmountSpent | null; +} + +export interface VoucherList_vouchers_edges { + __typename: "VoucherCountableEdge"; + node: VoucherList_vouchers_edges_node; +} + +export interface VoucherList_vouchers_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface VoucherList_vouchers { + __typename: "VoucherCountableConnection"; + edges: VoucherList_vouchers_edges[]; + pageInfo: VoucherList_vouchers_pageInfo; +} + +export interface VoucherList { + vouchers: VoucherList_vouchers | null; +} + +export interface VoucherListVariables { + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/discounts/types/VoucherUpdate.ts b/src/discounts/types/VoucherUpdate.ts new file mode 100644 index 000000000..2dd2521b2 --- /dev/null +++ b/src/discounts/types/VoucherUpdate.ts @@ -0,0 +1,55 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { VoucherInput, VoucherDiscountValueType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: VoucherUpdate +// ==================================================== + +export interface VoucherUpdate_voucherUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VoucherUpdate_voucherUpdate_voucher_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface VoucherUpdate_voucherUpdate_voucher_minAmountSpent { + __typename: "Money"; + currency: string; + amount: number; +} + +export interface VoucherUpdate_voucherUpdate_voucher { + __typename: "Voucher"; + id: string; + name: string | null; + startDate: any; + endDate: any | null; + usageLimit: number | null; + discountValueType: VoucherDiscountValueType; + discountValue: number; + countries: (VoucherUpdate_voucherUpdate_voucher_countries | null)[] | null; + minAmountSpent: VoucherUpdate_voucherUpdate_voucher_minAmountSpent | null; +} + +export interface VoucherUpdate_voucherUpdate { + __typename: "VoucherUpdate"; + errors: VoucherUpdate_voucherUpdate_errors[] | null; + voucher: VoucherUpdate_voucherUpdate_voucher | null; +} + +export interface VoucherUpdate { + voucherUpdate: VoucherUpdate_voucherUpdate | null; +} + +export interface VoucherUpdateVariables { + input: VoucherInput; + id: string; +} diff --git a/src/discounts/urls.ts b/src/discounts/urls.ts new file mode 100644 index 000000000..a33556ed8 --- /dev/null +++ b/src/discounts/urls.ts @@ -0,0 +1,61 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { ActiveTab, BulkAction, Dialog, Pagination } from "../types"; +import { SaleDetailsPageTab } from "./components/SaleDetailsPage"; +import { VoucherDetailsPageTab } from "./components/VoucherDetailsPage"; + +export const discountSection = "/discounts/"; + +export const saleSection = urlJoin(discountSection, "sales"); +export const saleListPath = saleSection; +export type SaleListUrlDialog = "remove"; +export type SaleListUrlQueryParams = BulkAction & + Dialog & + Pagination; +export const saleListUrl = (params?: SaleListUrlQueryParams) => + saleListPath + "?" + stringifyQs(params); +export const salePath = (id: string) => urlJoin(saleSection, id); +export type SaleUrlDialog = + | "assign-category" + | "assign-collection" + | "assign-product" + | "unassign-category" + | "unassign-collection" + | "unassign-product" + | "remove"; +export type SaleUrlQueryParams = Pagination & + BulkAction & + Dialog & + ActiveTab; +export const saleUrl = (id: string, params?: SaleUrlQueryParams) => + salePath(encodeURIComponent(id)) + "?" + stringifyQs(params); +export const saleAddPath = urlJoin(saleSection, "add"); +export const saleAddUrl = saleAddPath; + +export const voucherSection = urlJoin(discountSection, "vouchers"); +export const voucherListPath = voucherSection; +export type VoucherListUrlDialog = "remove"; +export type VoucherListUrlQueryParams = BulkAction & + Dialog & + Pagination; +export const voucherListUrl = (params?: VoucherListUrlQueryParams) => + voucherListPath + "?" + stringifyQs(params); +export const voucherPath = (id: string) => urlJoin(voucherSection, id); +export type VoucherUrlDialog = + | "assign-category" + | "assign-collection" + | "assign-country" + | "assign-product" + | "unassign-category" + | "unassign-collection" + | "unassign-product" + | "remove"; +export type VoucherUrlQueryParams = Pagination & + BulkAction & + Dialog & + ActiveTab; +export const voucherUrl = (id: string, params?: VoucherUrlQueryParams) => + voucherPath(encodeURIComponent(id)) + "?" + stringifyQs(params); +export const voucherAddPath = urlJoin(voucherSection, "add"); +export const voucherAddUrl = voucherAddPath; diff --git a/src/discounts/views/SaleCreate.tsx b/src/discounts/views/SaleCreate.tsx new file mode 100644 index 000000000..eb5a55f80 --- /dev/null +++ b/src/discounts/views/SaleCreate.tsx @@ -0,0 +1,77 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import useShop from "@saleor/hooks/useShop"; +import i18n from "../../i18n"; +import { decimal, getMutationState, maybe } from "../../misc"; +import { DiscountValueTypeEnum, SaleType } from "../../types/globalTypes"; +import SaleCreatePage from "../components/SaleCreatePage"; +import { TypedSaleCreate } from "../mutations"; +import { SaleCreate } from "../types/SaleCreate"; +import { saleListUrl, saleUrl } from "../urls"; + +function discountValueTypeEnum(type: SaleType): DiscountValueTypeEnum { + return type.toString() === DiscountValueTypeEnum.FIXED + ? DiscountValueTypeEnum.FIXED + : DiscountValueTypeEnum.PERCENTAGE; +} + +export const SaleDetails: React.StatelessComponent = () => { + const navigate = useNavigator(); + const pushMessage = useNotifier(); + const shop = useShop(); + + const handleSaleCreate = (data: SaleCreate) => { + if (data.saleCreate.errors.length === 0) { + pushMessage({ + text: i18n.t("Successfully created sale", { + context: "notification" + }) + }); + navigate(saleUrl(data.saleCreate.sale.id), true); + } + }; + + return ( + + {(saleCreate, saleCreateOpts) => { + const formTransitionState = getMutationState( + saleCreateOpts.called, + saleCreateOpts.loading, + maybe(() => saleCreateOpts.data.saleCreate.errors) + ); + + return ( + <> + + shop.defaultCurrency)} + disabled={saleCreateOpts.loading} + errors={maybe(() => saleCreateOpts.data.saleCreate.errors)} + onBack={() => navigate(saleListUrl())} + onSubmit={formData => + saleCreate({ + variables: { + input: { + endDate: + formData.endDate === "" ? null : formData.endDate, + name: formData.name, + startDate: + formData.startDate === "" ? null : formData.startDate, + type: discountValueTypeEnum(formData.type), + value: decimal(formData.value) + } + } + }) + } + saveButtonBarState={formTransitionState} + /> + + ); + }} + + ); +}; +export default SaleDetails; diff --git a/src/discounts/views/SaleDetails.tsx b/src/discounts/views/SaleDetails.tsx new file mode 100644 index 000000000..b0a3c473f --- /dev/null +++ b/src/discounts/views/SaleDetails.tsx @@ -0,0 +1,548 @@ +import Button from "@material-ui/core/Button"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import AssignCategoriesDialog from "@saleor/components/AssignCategoryDialog"; +import AssignCollectionDialog from "@saleor/components/AssignCollectionDialog"; +import AssignProductDialog from "@saleor/components/AssignProductDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import useShop from "@saleor/hooks/useShop"; +import { categoryUrl } from "../../categories/urls"; +import { collectionUrl } from "../../collections/urls"; +import { DEFAULT_INITIAL_SEARCH_DATA, PAGINATE_BY } from "../../config"; +import SearchCategories from "../../containers/SearchCategories"; +import SearchCollections from "../../containers/SearchCollections"; +import SearchProducts from "../../containers/SearchProducts"; +import i18n from "../../i18n"; +import { decimal, getMutationState, maybe } from "../../misc"; +import { productUrl } from "../../products/urls"; +import { DiscountValueTypeEnum, SaleType } from "../../types/globalTypes"; +import SaleDetailsPage, { + SaleDetailsPageTab +} from "../components/SaleDetailsPage"; +import { + TypedSaleCataloguesAdd, + TypedSaleCataloguesRemove, + TypedSaleDelete, + TypedSaleUpdate +} from "../mutations"; +import { TypedSaleDetails } from "../queries"; +import { SaleCataloguesAdd } from "../types/SaleCataloguesAdd"; +import { SaleCataloguesRemove } from "../types/SaleCataloguesRemove"; +import { SaleDelete } from "../types/SaleDelete"; +import { SaleUpdate } from "../types/SaleUpdate"; +import { + saleListUrl, + saleUrl, + SaleUrlDialog, + SaleUrlQueryParams +} from "../urls"; + +interface SaleDetailsProps { + id: string; + params: SaleUrlQueryParams; +} + +function discountValueTypeEnum(type: SaleType): DiscountValueTypeEnum { + return type.toString() === DiscountValueTypeEnum.FIXED + ? DiscountValueTypeEnum.FIXED + : DiscountValueTypeEnum.PERCENTAGE; +} + +export const SaleDetails: React.StatelessComponent = ({ + id, + params +}) => { + const navigate = useNavigator(); + const paginate = usePaginator(); + const notify = useNotifier(); + const shop = useShop(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + const changeTab = (tab: SaleDetailsPageTab) => { + reset(); + navigate( + saleUrl(id, { + activeTab: tab + }) + ); + }; + + const handleSaleDelete = (data: SaleDelete) => { + if (data.saleDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed sale", { + context: "notification" + }) + }); + navigate(saleListUrl(), true); + } + }; + + const handleSaleUpdate = (data: SaleUpdate) => { + if (data.saleUpdate.errors.length === 0) { + notify({ + text: i18n.t("Updated sale", { + context: "notification" + }) + }); + } + }; + + const closeModal = () => + navigate( + saleUrl(id, { + ...params, + action: undefined, + ids: undefined + }), + true + ); + + const openModal = (action: SaleUrlDialog, ids?: string[]) => + navigate( + saleUrl(id, { + ...params, + action, + ids + }) + ); + + const handleCatalogueAdd = (data: SaleCataloguesAdd) => { + if (data.saleCataloguesAdd.errors.length === 0) { + closeModal(); + } + }; + + const handleCatalogueRemove = (data: SaleCataloguesRemove) => { + if (data.saleCataloguesRemove.errors.length === 0) { + closeModal(); + reset(); + } + }; + + return ( + + {(saleCataloguesRemove, saleCataloguesRemoveOpts) => ( + + {(saleCataloguesAdd, saleCataloguesAddOpts) => ( + + {(saleUpdate, saleUpdateOpts) => ( + + {(saleDelete, saleDeleteOpts) => ( + + {({ data, loading }) => { + const tabPageInfo = + params.activeTab === SaleDetailsPageTab.categories + ? maybe(() => data.sale.categories.pageInfo) + : params.activeTab === + SaleDetailsPageTab.collections + ? maybe(() => data.sale.collections.pageInfo) + : maybe(() => data.sale.products.pageInfo); + const formTransitionState = getMutationState( + saleUpdateOpts.called, + saleUpdateOpts.loading, + maybe(() => saleUpdateOpts.data.saleUpdate.errors) + ); + const assignTransitionState = getMutationState( + saleCataloguesAddOpts.called, + saleCataloguesAddOpts.loading, + maybe( + () => + saleCataloguesAddOpts.data.saleCataloguesAdd + .errors + ) + ); + const unassignTransitionState = getMutationState( + saleCataloguesRemoveOpts.called, + saleCataloguesRemoveOpts.loading, + maybe( + () => + saleCataloguesRemoveOpts.data.saleCataloguesRemove + .errors + ) + ); + const removeTransitionState = getMutationState( + saleDeleteOpts.called, + saleDeleteOpts.loading, + maybe(() => saleDeleteOpts.data.saleDelete.errors) + ); + + const handleCategoriesUnassign = (ids: string[]) => + saleCataloguesRemove({ + variables: { + ...paginationState, + id, + input: { + categories: ids + } + } + }); + + const handleCollectionsUnassign = (ids: string[]) => + saleCataloguesRemove({ + variables: { + ...paginationState, + id, + input: { + collections: ids + } + } + }); + + const handleProductsUnassign = (ids: string[]) => + saleCataloguesRemove({ + variables: { + ...paginationState, + id, + input: { + products: ids + } + } + }); + + const { + loadNextPage, + loadPreviousPage, + pageInfo + } = paginate(tabPageInfo, paginationState, params); + + return ( + <> + + shop.defaultCurrency + )} + sale={maybe(() => data.sale)} + disabled={ + loading || saleCataloguesRemoveOpts.loading + } + errors={maybe( + () => saleUpdateOpts.data.saleUpdate.errors + )} + pageInfo={pageInfo} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onCategoryAssign={() => + openModal("assign-category") + } + onCategoryClick={id => () => + navigate(categoryUrl(id))} + onCollectionAssign={() => + openModal("assign-collection") + } + onCollectionUnassign={collectionId => + handleCollectionsUnassign([collectionId]) + } + onCategoryUnassign={categoryId => + handleCategoriesUnassign([categoryId]) + } + onCollectionClick={id => () => + navigate(collectionUrl(id))} + onProductAssign={() => + openModal("assign-product") + } + onProductUnassign={productId => + handleProductsUnassign([productId]) + } + onProductClick={id => () => + navigate(productUrl(id))} + activeTab={params.activeTab} + onBack={() => navigate(saleListUrl())} + onTabClick={changeTab} + onSubmit={formData => + saleUpdate({ + variables: { + id, + input: { + endDate: + formData.endDate === "" + ? null + : formData.endDate, + name: formData.name, + startDate: + formData.startDate === "" + ? null + : formData.startDate, + type: discountValueTypeEnum( + formData.type + ), + value: decimal(formData.value) + } + } + }) + } + onRemove={() => openModal("remove")} + saveButtonBarState={formTransitionState} + categoryListToolbar={ + + } + collectionListToolbar={ + + } + productListToolbar={ + + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + /> + + {({ + search: searchProducts, + result: searchProductsOpts + }) => ( + + saleCataloguesAdd({ + variables: { + ...paginationState, + id, + input: { + products: formData.products.map( + product => product.id + ) + } + } + }) + } + products={maybe(() => + searchProductsOpts.data.products.edges + .map(edge => edge.node) + .filter( + suggestedProduct => suggestedProduct.id + ) + )} + /> + )} + + + {({ + search: searchCategories, + result: searchCategoriesOpts + }) => ( + + searchCategoriesOpts.data.categories.edges + .map(edge => edge.node) + .filter( + suggestedCategory => + suggestedCategory.id + ) + )} + confirmButtonState={assignTransitionState} + open={params.action === "assign-category"} + onFetch={searchCategories} + loading={searchCategoriesOpts.loading} + onClose={closeModal} + onSubmit={formData => + saleCataloguesAdd({ + variables: { + ...paginationState, + id, + input: { + categories: formData.categories.map( + product => product.id + ) + } + } + }) + } + /> + )} + + + {({ + search: searchCollections, + result: searchCollectionsOpts + }) => ( + + searchCollectionsOpts.data.collections.edges + .map(edge => edge.node) + .filter( + suggestedCategory => + suggestedCategory.id + ) + )} + confirmButtonState={assignTransitionState} + open={params.action === "assign-collection"} + onFetch={searchCollections} + loading={searchCollectionsOpts.loading} + onClose={closeModal} + onSubmit={formData => + saleCataloguesAdd({ + variables: { + ...paginationState, + id, + input: { + collections: formData.collections.map( + product => product.id + ) + } + } + }) + } + /> + )} + + + handleCategoriesUnassign(params.ids) + } + > + {{ saleName }} categories?", + { + saleName: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + handleCollectionsUnassign(params.ids) + } + > + {{ saleName }} collections?", + { + saleName: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + handleProductsUnassign(params.ids) + } + > + {{ saleName }} products?", + { + saleName: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + saleDelete({ + variables: { id } + }) + } + > + {{ saleName }}?", + { + saleName: maybe( + () => data.sale.name, + "..." + ) + } + ) + }} + /> + + + ); + }} + + )} + + )} + + )} + + )} + + ); +}; +export default SaleDetails; diff --git a/src/discounts/views/SaleList.tsx b/src/discounts/views/SaleList.tsx new file mode 100644 index 000000000..97e1a302e --- /dev/null +++ b/src/discounts/views/SaleList.tsx @@ -0,0 +1,146 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import useShop from "@saleor/hooks/useShop"; +import { PAGINATE_BY } from "../../config"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import SaleListPage from "../components/SaleListPage"; +import { TypedSaleBulkDelete } from "../mutations"; +import { TypedSaleList } from "../queries"; +import { SaleBulkDelete } from "../types/SaleBulkDelete"; +import { + saleAddUrl, + saleListUrl, + SaleListUrlQueryParams, + saleUrl +} from "../urls"; + +interface SaleListProps { + params: SaleListUrlQueryParams; +} + +export const SaleList: React.StatelessComponent = ({ + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const shop = useShop(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const closeModal = () => navigate(saleListUrl(), true); + + const paginationState = createPaginationState(PAGINATE_BY, params); + + return ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.sales.pageInfo), + paginationState, + params + ); + + const handleSaleBulkDelete = (data: SaleBulkDelete) => { + if (data.saleBulkDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed sales") + }); + reset(); + closeModal(); + refetch(); + } + }; + + return ( + + {(saleBulkDelete, saleBulkDeleteOpts) => { + const bulkRemoveTransitionState = getMutationState( + saleBulkDeleteOpts.called, + saleBulkDeleteOpts.loading, + maybe(() => saleBulkDeleteOpts.data.saleBulkDelete.errors) + ); + const onSaleBulkDelete = () => + saleBulkDelete({ + variables: { + ids: params.ids + } + }); + + return ( + <> + + shop.defaultCurrency)} + sales={maybe(() => data.sales.edges.map(edge => edge.node))} + disabled={loading} + pageInfo={pageInfo} + onAdd={() => navigate(saleAddUrl)} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRowClick={id => () => navigate(saleUrl(id))} + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + toolbar={ + + navigate( + saleListUrl({ + action: "remove", + ids: listElements + }) + ) + } + > + + + } + /> + + {{ number }} sales?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + ); + }} + + ); +}; +export default SaleList; diff --git a/src/discounts/views/VoucherCreate.tsx b/src/discounts/views/VoucherCreate.tsx new file mode 100644 index 000000000..00efa1210 --- /dev/null +++ b/src/discounts/views/VoucherCreate.tsx @@ -0,0 +1,88 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import useShop from "@saleor/hooks/useShop"; +import i18n from "../../i18n"; +import { decimal, getMutationState, maybe } from "../../misc"; +import { + DiscountValueTypeEnum, + VoucherDiscountValueType, + VoucherTypeEnum +} from "../../types/globalTypes"; +import VoucherCreatePage from "../components/VoucherCreatePage"; +import { TypedVoucherCreate } from "../mutations"; +import { VoucherCreate } from "../types/VoucherCreate"; +import { voucherListUrl, voucherUrl } from "../urls"; + +function discountValueTypeEnum( + type: VoucherDiscountValueType +): DiscountValueTypeEnum { + return type.toString() === DiscountValueTypeEnum.FIXED + ? DiscountValueTypeEnum.FIXED + : DiscountValueTypeEnum.PERCENTAGE; +} + +export const VoucherDetails: React.StatelessComponent = () => { + const navigate = useNavigator(); + const notify = useNotifier(); + const shop = useShop(); + + const handleVoucherCreate = (data: VoucherCreate) => { + if (data.voucherCreate.errors.length === 0) { + notify({ + text: i18n.t("Successfully created voucher", { + context: "notification" + }) + }); + navigate(voucherUrl(data.voucherCreate.voucher.id), true); + } + }; + + return ( + + {(voucherCreate, voucherCreateOpts) => { + const formTransitionState = getMutationState( + voucherCreateOpts.called, + voucherCreateOpts.loading, + maybe(() => voucherCreateOpts.data.voucherCreate.errors) + ); + + return ( + <> + + shop.defaultCurrency)} + disabled={voucherCreateOpts.loading} + errors={maybe(() => voucherCreateOpts.data.voucherCreate.errors)} + onBack={() => navigate(voucherListUrl())} + onSubmit={formData => + voucherCreate({ + variables: { + input: { + code: formData.code, + discountValue: decimal(formData.value), + discountValueType: discountValueTypeEnum( + formData.discountType + ), + endDate: + formData.endDate === "" ? null : formData.endDate, + minAmountSpent: formData.minAmountSpent, + name: formData.name, + startDate: + formData.startDate === "" ? null : formData.startDate, + type: VoucherTypeEnum[formData.type] + } + } + }) + } + saveButtonBarState={formTransitionState} + /> + + ); + }} + + ); +}; +export default VoucherDetails; diff --git a/src/discounts/views/VoucherDetails.tsx b/src/discounts/views/VoucherDetails.tsx new file mode 100644 index 000000000..b3ef7ec5e --- /dev/null +++ b/src/discounts/views/VoucherDetails.tsx @@ -0,0 +1,625 @@ +import Button from "@material-ui/core/Button"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import AssignCategoriesDialog from "@saleor/components/AssignCategoryDialog"; +import AssignCollectionDialog from "@saleor/components/AssignCollectionDialog"; +import AssignProductDialog from "@saleor/components/AssignProductDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import useShop from "@saleor/hooks/useShop"; +import { categoryUrl } from "../../categories/urls"; +import { collectionUrl } from "../../collections/urls"; +import { DEFAULT_INITIAL_SEARCH_DATA, PAGINATE_BY } from "../../config"; +import SearchCategories from "../../containers/SearchCategories"; +import SearchCollections from "../../containers/SearchCollections"; +import SearchProducts from "../../containers/SearchProducts"; +import i18n from "../../i18n"; +import { decimal, getMutationState, maybe } from "../../misc"; +import { productUrl } from "../../products/urls"; +import { + DiscountValueTypeEnum, + VoucherDiscountValueType +} from "../../types/globalTypes"; +import DiscountCountrySelectDialog from "../components/DiscountCountrySelectDialog"; +import VoucherDetailsPage, { + VoucherDetailsPageTab +} from "../components/VoucherDetailsPage"; +import { + TypedVoucherCataloguesAdd, + TypedVoucherCataloguesRemove, + TypedVoucherDelete, + TypedVoucherUpdate +} from "../mutations"; +import { TypedVoucherDetails } from "../queries"; +import { VoucherCataloguesAdd } from "../types/VoucherCataloguesAdd"; +import { VoucherCataloguesRemove } from "../types/VoucherCataloguesRemove"; +import { VoucherDelete } from "../types/VoucherDelete"; +import { VoucherUpdate } from "../types/VoucherUpdate"; +import { + voucherListUrl, + voucherUrl, + VoucherUrlDialog, + VoucherUrlQueryParams +} from "../urls"; + +interface VoucherDetailsProps { + id: string; + params: VoucherUrlQueryParams; +} + +function discountValueTypeEnum( + type: VoucherDiscountValueType +): DiscountValueTypeEnum { + return type.toString() === DiscountValueTypeEnum.FIXED + ? DiscountValueTypeEnum.FIXED + : DiscountValueTypeEnum.PERCENTAGE; +} + +export const VoucherDetails: React.StatelessComponent = ({ + id, + params +}) => { + const navigate = useNavigator(); + const paginate = usePaginator(); + const notify = useNotifier(); + const shop = useShop(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + const changeTab = (tab: VoucherDetailsPageTab) => { + reset(); + navigate( + voucherUrl(id, { + activeTab: tab + }) + ); + }; + + const handleVoucherDelete = (data: VoucherDelete) => { + if (data.voucherDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed voucher", { + context: "notification" + }) + }); + navigate(voucherListUrl(), true); + } + }; + + const handleVoucherUpdate = (data: VoucherUpdate) => { + if (data.voucherUpdate.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Updated voucher", { + context: "notification" + }) + }); + } + }; + + const closeModal = () => + navigate( + voucherUrl(id, { + ...params, + action: undefined + }), + true + ); + + const openModal = (action: VoucherUrlDialog, ids?: string[]) => + navigate( + voucherUrl(id, { + ...params, + action, + ids + }) + ); + + const handleCatalogueAdd = (data: VoucherCataloguesAdd) => { + if (data.voucherCataloguesAdd.errors.length === 0) { + closeModal(); + } + }; + + const handleCatalogueRemove = (data: VoucherCataloguesRemove) => { + if (data.voucherCataloguesRemove.errors.length === 0) { + closeModal(); + reset(); + } + }; + + return ( + + {(voucherCataloguesRemove, voucherCataloguesRemoveOpts) => ( + + {(voucherCataloguesAdd, voucherCataloguesAddOpts) => ( + + {(voucherUpdate, voucherUpdateOpts) => ( + + {(voucherDelete, voucherDeleteOpts) => ( + + {({ data, loading }) => { + const tabPageInfo = + params.activeTab === VoucherDetailsPageTab.categories + ? maybe(() => data.voucher.categories.pageInfo) + : params.activeTab === + VoucherDetailsPageTab.collections + ? maybe(() => data.voucher.collections.pageInfo) + : maybe(() => data.voucher.products.pageInfo); + const formTransitionState = getMutationState( + voucherUpdateOpts.called, + voucherUpdateOpts.loading, + maybe( + () => voucherUpdateOpts.data.voucherUpdate.errors + ) + ); + const assignTransitionState = getMutationState( + voucherCataloguesAddOpts.called, + voucherCataloguesAddOpts.loading, + maybe( + () => + voucherCataloguesAddOpts.data.voucherCataloguesAdd + .errors + ) + ); + const unassignTransitionState = getMutationState( + voucherCataloguesRemoveOpts.called, + voucherCataloguesRemoveOpts.loading, + maybe( + () => + voucherCataloguesRemoveOpts.data + .voucherCataloguesRemove.errors + ) + ); + const removeTransitionState = getMutationState( + voucherDeleteOpts.called, + voucherDeleteOpts.loading, + maybe( + () => voucherDeleteOpts.data.voucherDelete.errors + ) + ); + + const handleCategoriesUnassign = (ids: string[]) => + voucherCataloguesRemove({ + variables: { + ...paginationState, + id, + input: { + categories: ids + } + } + }); + + const handleCollectionsUnassign = (ids: string[]) => + voucherCataloguesRemove({ + variables: { + ...paginationState, + id, + input: { + collections: ids + } + } + }); + + const handleProductsUnassign = (ids: string[]) => + voucherCataloguesRemove({ + variables: { + ...paginationState, + id, + input: { + products: ids + } + } + }); + + const { + loadNextPage, + loadPreviousPage, + pageInfo + } = paginate(tabPageInfo, paginationState, params); + + return ( + <> + + shop.defaultCurrency + )} + voucher={maybe(() => data.voucher)} + disabled={ + loading || voucherCataloguesRemoveOpts.loading + } + errors={maybe( + () => + voucherUpdateOpts.data.voucherUpdate.errors + )} + pageInfo={pageInfo} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onCategoryAssign={() => + openModal("assign-category") + } + onCategoryClick={id => () => + navigate(categoryUrl(id))} + onCollectionAssign={() => + openModal("assign-collection") + } + onCollectionUnassign={collectionId => + voucherCataloguesRemove({ + variables: { + ...paginationState, + id, + input: { + collections: [collectionId] + } + } + }) + } + onCountryAssign={() => + openModal("assign-country") + } + onCountryUnassign={countryCode => + voucherUpdate({ + variables: { + ...paginationState, + id, + input: { + countries: data.voucher.countries + .filter( + country => + country.code !== countryCode + ) + .map(country => country.code) + } + } + }) + } + onCategoryUnassign={categoryId => + voucherCataloguesRemove({ + variables: { + ...paginationState, + id, + input: { + categories: [categoryId] + } + } + }) + } + onCollectionClick={id => () => + navigate(collectionUrl(id))} + onProductAssign={() => + openModal("assign-product") + } + onProductUnassign={productId => + voucherCataloguesRemove({ + variables: { + ...paginationState, + id, + input: { + products: [productId] + } + } + }) + } + onProductClick={id => () => + navigate(productUrl(id))} + activeTab={params.activeTab} + onBack={() => navigate(voucherListUrl())} + onTabClick={changeTab} + onSubmit={formData => + voucherUpdate({ + variables: { + id, + input: { + discountValue: decimal(formData.value), + discountValueType: discountValueTypeEnum( + formData.discountType + ), + endDate: + formData.endDate === "" + ? null + : formData.endDate, + name: formData.name, + startDate: + formData.startDate === "" + ? null + : formData.startDate + } + } + }) + } + onRemove={() => openModal("remove")} + saveButtonBarState={formTransitionState} + categoryListToolbar={ + + } + collectionListToolbar={ + + } + productListToolbar={ + + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + /> + + {({ + search: searchCategories, + result: searchCategoriesOpts + }) => ( + + searchCategoriesOpts.data.categories.edges + .map(edge => edge.node) + .filter( + suggestedCategory => + suggestedCategory.id + ) + )} + confirmButtonState={assignTransitionState} + open={params.action === "assign-category"} + onFetch={searchCategories} + loading={searchCategoriesOpts.loading} + onClose={closeModal} + onSubmit={formData => + voucherCataloguesAdd({ + variables: { + ...paginationState, + id, + input: { + categories: formData.categories.map( + product => product.id + ) + } + } + }) + } + /> + )} + + + {({ + search: searchCollections, + result: searchCollectionsOpts + }) => ( + + searchCollectionsOpts.data.collections.edges + .map(edge => edge.node) + .filter( + suggestedCategory => + suggestedCategory.id + ) + )} + confirmButtonState={assignTransitionState} + open={params.action === "assign-collection"} + onFetch={searchCollections} + loading={searchCollectionsOpts.loading} + onClose={closeModal} + onSubmit={formData => + voucherCataloguesAdd({ + variables: { + ...paginationState, + id, + input: { + collections: formData.collections.map( + product => product.id + ) + } + } + }) + } + /> + )} + + shop.countries, [])} + onClose={() => navigate(voucherUrl(id))} + onConfirm={formData => + voucherUpdate({ + variables: { + id, + input: { + countries: formData.countries + } + } + }) + } + open={params.action === "assign-country"} + initial={maybe( + () => + data.voucher.countries.map( + country => country.code + ), + [] + )} + /> + + {({ + search: searchProducts, + result: searchProductsOpts + }) => ( + + voucherCataloguesAdd({ + variables: { + ...paginationState, + id, + input: { + products: formData.products.map( + product => product.id + ) + } + } + }) + } + products={maybe(() => + searchProductsOpts.data.products.edges + .map(edge => edge.node) + .filter( + suggestedProduct => suggestedProduct.id + ) + )} + /> + )} + + + handleCategoriesUnassign(params.ids) + } + > + {{ saleName }} categories?", + { + saleName: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + handleCollectionsUnassign(params.ids) + } + > + {{ saleName }} collections?", + { + saleName: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + handleProductsUnassign(params.ids) + } + > + {{ saleName }} products?", + { + saleName: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + voucherDelete({ + variables: { id } + }) + } + > + {{ voucherName }}?", + { + voucherName: maybe( + () => data.voucher.name, + "..." + ) + } + ) + }} + /> + + + ); + }} + + )} + + )} + + )} + + )} + + ); +}; +export default VoucherDetails; diff --git a/src/discounts/views/VoucherList.tsx b/src/discounts/views/VoucherList.tsx new file mode 100644 index 000000000..e8ca0d404 --- /dev/null +++ b/src/discounts/views/VoucherList.tsx @@ -0,0 +1,147 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import useShop from "@saleor/hooks/useShop"; +import { PAGINATE_BY } from "../../config"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import VoucherListPage from "../components/VoucherListPage"; +import { TypedVoucherBulkDelete } from "../mutations"; +import { TypedVoucherList } from "../queries"; +import { VoucherBulkDelete } from "../types/VoucherBulkDelete"; +import { + voucherAddUrl, + voucherListUrl, + VoucherListUrlQueryParams, + voucherUrl +} from "../urls"; + +interface VoucherListProps { + params: VoucherListUrlQueryParams; +} + +export const VoucherList: React.StatelessComponent = ({ + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const shop = useShop(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const closeModal = () => navigate(voucherListUrl(), true); + + const paginationState = createPaginationState(PAGINATE_BY, params); + + return ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.vouchers.pageInfo), + paginationState, + params + ); + + const handleVoucherBulkDelete = (data: VoucherBulkDelete) => { + if (data.voucherBulkDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed vouchers") + }); + reset(); + closeModal(); + refetch(); + } + }; + + return ( + + {(voucherBulkDelete, voucherBulkDeleteOpts) => { + const bulkRemoveTransitionState = getMutationState( + voucherBulkDeleteOpts.called, + voucherBulkDeleteOpts.loading, + maybe(() => voucherBulkDeleteOpts.data.voucherBulkDelete.errors) + ); + const onVoucherBulkDelete = () => + voucherBulkDelete({ + variables: { + ids: params.ids + } + }); + return ( + <> + + shop.defaultCurrency)} + vouchers={maybe(() => + data.vouchers.edges.map(edge => edge.node) + )} + disabled={loading} + pageInfo={pageInfo} + onAdd={() => navigate(voucherAddUrl)} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRowClick={id => () => navigate(voucherUrl(id))} + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + toolbar={ + + navigate( + voucherListUrl({ + action: "remove", + ids: listElements + }) + ) + } + > + + + } + /> + + {{ number }} vouchers?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + ); + }} + + ); +}; +export default VoucherList; diff --git a/src/fixtures.ts b/src/fixtures.ts new file mode 100644 index 000000000..ef1d1aeec --- /dev/null +++ b/src/fixtures.ts @@ -0,0 +1,125 @@ +import { Filter } from "./components/TableFilter"; +import { FilterPageProps, ListActions, PageListProps } from "./types"; + +const pageInfo = { + hasNextPage: true, + hasPreviousPage: false +}; +export const pageListProps: { [key: string]: PageListProps } = { + default: { + disabled: false, + onAdd: undefined, + onNextPage: undefined, + onPreviousPage: undefined, + onRowClick: () => undefined, + pageInfo + }, + loading: { + disabled: true, + onAdd: undefined, + onNextPage: undefined, + onPreviousPage: undefined, + onRowClick: () => undefined, + pageInfo + } +}; +export const listActionsProps: ListActions = { + isChecked: () => undefined, + selected: 0, + toggle: () => undefined, + toggleAll: () => undefined, + toolbar: null +}; + +export const countries = [ + { code: "AF", label: "Afghanistan" }, + { code: "AX", label: "Åland Islands" }, + { code: "AL", label: "Albania" }, + { code: "DZ", label: "Algeria" }, + { code: "AS", label: "American Samoa" } +]; + +export const filterPageProps: FilterPageProps<{}> = { + currencySymbol: "USD", + currentTab: 0, + filterTabs: [ + { + data: {}, + name: "Tab X" + } + ], + filtersList: [], + initialSearch: "", + onAll: () => undefined, + onFilterAdd: () => undefined, + onFilterDelete: () => undefined, + onFilterSave: () => undefined, + onSearchChange: () => undefined, + onTabChange: () => undefined +}; + +export const filters: Filter[] = [ + { + label: "Property X is ", + onClick: () => undefined + }, + { + label: "Property Y is ", + onClick: () => undefined + }, + { + label: "Property Z is ", + onClick: () => undefined + }, + { + label: "Property X is ", + onClick: () => undefined + }, + { + label: "Property Y is ", + onClick: () => undefined + }, + { + label: "Property Z is ", + onClick: () => undefined + }, + { + label: "Property X is ", + onClick: () => undefined + }, + { + label: "Property Y is ", + onClick: () => undefined + }, + { + label: "Property Z is ", + onClick: () => undefined + }, + { + label: "Property X is ", + onClick: () => undefined + }, + { + label: "Property Y is ", + onClick: () => undefined + }, + { + label: "Property Z is ", + onClick: () => undefined + }, + { + label: "Property X is ", + onClick: () => undefined + }, + { + label: "Property Y is ", + onClick: () => undefined + }, + { + label: "Property Z is ", + onClick: () => undefined + } +].map((filter, filterIndex) => ({ + ...filter, + label: filter.label + filterIndex +})); diff --git a/src/home/components/HomeActivityCard/HomeActivityCard.tsx b/src/home/components/HomeActivityCard/HomeActivityCard.tsx new file mode 100644 index 000000000..f28f72ded --- /dev/null +++ b/src/home/components/HomeActivityCard/HomeActivityCard.tsx @@ -0,0 +1,74 @@ +import Card from "@material-ui/core/Card"; +import List from "@material-ui/core/List"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemText from "@material-ui/core/ListItemText"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import { DateTime } from "@saleor/components/Date"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { renderCollection } from "../../../misc"; +import { Home_activities_edges_node } from "../../types/Home"; +import { getActivityMessage } from "./activityMessages"; + +const styles = createStyles({ + loadingProducts: { + paddingBottom: "10px", + paddingTop: "10px" + }, + noProducts: { + paddingBottom: "16px", + paddingTop: "16px" + } +}); + +interface HomeProductListCardProps extends WithStyles { + activities: Home_activities_edges_node[]; +} + +const HomeProductListCard = withStyles(styles, { name: "HomeProductListCard" })( + ({ classes, activities }: HomeProductListCardProps) => { + return ( + + + + {renderCollection( + activities, + (activity, activityId) => ( + + {activity ? ( + {getActivityMessage(activity)} + } + secondary={} + /> + ) : ( + + + + + + )} + + ), + () => ( + + {i18n.t("No activities found")} + } + /> + + ) + )} + + + ); + } +); +HomeProductListCard.displayName = "HomeProductListCard"; +export default HomeProductListCard; diff --git a/src/home/components/HomeActivityCard/activityMessages.ts b/src/home/components/HomeActivityCard/activityMessages.ts new file mode 100644 index 000000000..b195ccdc2 --- /dev/null +++ b/src/home/components/HomeActivityCard/activityMessages.ts @@ -0,0 +1,26 @@ +import i18n from "../../../i18n"; +import { OrderEventsEnum } from "../../../types/globalTypes"; +import { Home_activities_edges_node } from "../../types/Home"; + +export const getActivityMessage = (activity: Home_activities_edges_node) => { + switch (activity.type) { + case OrderEventsEnum.ORDER_FULLY_PAID: + return i18n.t("Order #{{ orderId }} was fully paid", { + orderId: activity.orderNumber + }); + case OrderEventsEnum.PLACED: + return i18n.t("Order #{{ orderId }} was placed", { + orderId: activity.orderNumber + }); + case OrderEventsEnum.PLACED_FROM_DRAFT: + return i18n.t( + "Order #{{ orderId }} was placed from draft by {{ user }}", + { + orderId: activity.orderNumber, + user: activity.user.email + } + ); + default: + return activity.message; + } +}; diff --git a/src/home/components/HomeActivityCard/index.ts b/src/home/components/HomeActivityCard/index.ts new file mode 100644 index 000000000..bec23d02f --- /dev/null +++ b/src/home/components/HomeActivityCard/index.ts @@ -0,0 +1,2 @@ +export { default } from "./HomeActivityCard"; +export * from "./HomeActivityCard"; diff --git a/src/home/components/HomeAnalyticsCard/HomeAnalyticsCard.tsx b/src/home/components/HomeAnalyticsCard/HomeAnalyticsCard.tsx new file mode 100644 index 000000000..faafc0a2e --- /dev/null +++ b/src/home/components/HomeAnalyticsCard/HomeAnalyticsCard.tsx @@ -0,0 +1,93 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { IconProps } from "@material-ui/core/Icon"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + cardContent: { + "&:last-child": { + paddingBottom: 16 + }, + display: "grid", + gridColumnGap: theme.spacing.unit * 3 + "px", + gridTemplateColumns: "1fr 64px" + }, + cardSpacing: { + [theme.breakpoints.down("sm")]: { + marginBottom: theme.spacing.unit + }, + marginBottom: theme.spacing.unit * 3 + }, + cardSubtitle: { + color: theme.palette.text.secondary, + height: "20px", + lineHeight: 0.9 + }, + cardTitle: { + fontWeight: 600 as 600 + }, + icon: { + color: theme.palette.primary.contrastText, + fontSize: 54, + margin: ".5rem .3rem" + }, + iconBackground: { + backgroundColor: theme.palette.background.default, + borderRadius: "8px", + color: "white", + fontSize: "54px", + height: "100%", + padding: "10px 5px 0px 5px", + width: "100%" + }, + value: { + textAlign: "right" + } + }); + +interface HomeAnalyticsCardProps extends WithStyles { + icon: React.ReactElement; + title: string; + children?: React.ReactNode; +} + +const HomeAnalyticsCard = withStyles(styles, { name: "HomeAnalyticsCard" })( + ({ children, classes, title, icon }: HomeAnalyticsCardProps) => ( + + +
    + + {title} + + + {i18n.t("Today")} + + + {children} + +
    +
    {icon}
    +
    +
    + ) +); +HomeAnalyticsCard.displayName = "HomeAnalyticsCard"; +export default HomeAnalyticsCard; diff --git a/src/home/components/HomeAnalyticsCard/index.ts b/src/home/components/HomeAnalyticsCard/index.ts new file mode 100644 index 000000000..209b4b54e --- /dev/null +++ b/src/home/components/HomeAnalyticsCard/index.ts @@ -0,0 +1,2 @@ +export { default } from "./HomeAnalyticsCard"; +export * from "./HomeAnalyticsCard"; diff --git a/src/home/components/HomeHeader/HomeHeader.tsx b/src/home/components/HomeHeader/HomeHeader.tsx new file mode 100644 index 000000000..ff692eb2a --- /dev/null +++ b/src/home/components/HomeHeader/HomeHeader.tsx @@ -0,0 +1,53 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + headerContainer: { + marginBottom: theme.spacing.unit * 3 + }, + pageHeader: { + fontWeight: 600 as 600 + }, + subtitle: { + color: theme.typography.caption.color + } + }); + +interface HomeOrdersCardProps extends WithStyles { + userName: string; +} + +const HomeOrdersCard = withStyles(styles, { name: "HomeOrdersCard" })( + ({ classes, userName }: HomeOrdersCardProps) => { + return ( +
    + + {userName ? ( + i18n.t("Hello there, {{userName}}", { userName }) + ) : ( + + )} + + + {userName ? ( + i18n.t("Here is some information we gathered about your store") + ) : ( + + )} + +
    + ); + } +); +HomeOrdersCard.displayName = "HomeOrdersCard"; +export default HomeOrdersCard; diff --git a/src/home/components/HomeHeader/index.ts b/src/home/components/HomeHeader/index.ts new file mode 100644 index 000000000..be3bc03ae --- /dev/null +++ b/src/home/components/HomeHeader/index.ts @@ -0,0 +1,2 @@ +export { default } from "./HomeHeader"; +export * from "./HomeHeader"; diff --git a/src/home/components/HomeNotificationTable/HomeNotificationTable.tsx b/src/home/components/HomeNotificationTable/HomeNotificationTable.tsx new file mode 100644 index 000000000..752ca3032 --- /dev/null +++ b/src/home/components/HomeNotificationTable/HomeNotificationTable.tsx @@ -0,0 +1,128 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import Typography from "@material-ui/core/Typography"; +import KeyboardArrowRight from "@material-ui/icons/KeyboardArrowRight"; +import * as React from "react"; + +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + arrowIcon: { + width: theme.spacing.unit * 4 + }, + tableRow: { + cursor: "pointer" + } + }); + +interface HomeNotificationTableProps extends WithStyles { + ordersToCapture: number; + ordersToFulfill: number; + productsOutOfStock: number; + onOrdersToFulfillClick: () => void; + onOrdersToCaptureClick: () => void; + onProductsOutOfStockClick: () => void; +} + +const HomeNotificationTable = withStyles(styles, { + name: "HomeNotificationTable" +})( + ({ + classes, + onOrdersToCaptureClick, + onOrdersToFulfillClick, + onProductsOutOfStockClick, + ordersToCapture, + ordersToFulfill, + productsOutOfStock + }: HomeNotificationTableProps) => { + return ( + + + + + + {ordersToFulfill === undefined ? ( + + ) : ordersToFulfill === 0 ? ( + + {i18n.t("No orders ready to fulfill")} + + ) : ( + {{ amount }} Orders are ready to fulfill", + { amount: ordersToFulfill } + ) + }} + /> + )} + + + + + + + + {ordersToCapture === undefined ? ( + + ) : ordersToCapture === 0 ? ( + + {i18n.t("No payments waiting for capture")} + + ) : ( + {{ amount }} Payments to capture", + { amount: ordersToCapture } + ) + }} + /> + )} + + + + + + + + {productsOutOfStock === undefined ? ( + + ) : productsOutOfStock === 0 ? ( + {i18n.t("No products out of stock")} + ) : ( + {{ amount }} Products out of stock", + { amount: productsOutOfStock } + ) + }} + /> + )} + + + + + + +
    +
    + ); + } +); +HomeNotificationTable.displayName = "HomeNotificationTable"; +export default HomeNotificationTable; diff --git a/src/home/components/HomeNotificationTable/index.ts b/src/home/components/HomeNotificationTable/index.ts new file mode 100644 index 000000000..5f13ce2da --- /dev/null +++ b/src/home/components/HomeNotificationTable/index.ts @@ -0,0 +1,2 @@ +export { default } from "./HomeNotificationTable"; +export * from "./HomeNotificationTable"; diff --git a/src/home/components/HomePage/HomePage.tsx b/src/home/components/HomePage/HomePage.tsx new file mode 100644 index 000000000..af26fe46f --- /dev/null +++ b/src/home/components/HomePage/HomePage.tsx @@ -0,0 +1,123 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import CardSpacer from "@saleor/components/CardSpacer"; +import Container from "@saleor/components/Container"; +import Grid from "@saleor/components/Grid"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import Orders from "../../../icons/Orders"; +import Sales from "../../../icons/Sales"; +import { + Home_activities_edges_node, + Home_productTopToday_edges_node, + Home_salesToday_gross +} from "../../types/Home"; +import HomeActivityCard from "../HomeActivityCard"; +import HomeAnalyticsCard from "../HomeAnalyticsCard"; +import HomeHeader from "../HomeHeader"; +import HomeNotificationTable from "../HomeNotificationTable/HomeNotificationTable"; +import HomeProductListCard from "../HomeProductListCard"; + +const styles = (theme: Theme) => + createStyles({ + cardContainer: { + display: "grid", + gridColumnGap: `${theme.spacing.unit * 3}px`, + gridTemplateColumns: "1fr 1fr", + [theme.breakpoints.down("sm")]: { + gridColumnGap: `${theme.spacing.unit}px` + }, + [theme.breakpoints.down("xs")]: { + gridTemplateColumns: "1fr" + } + } + }); + +export interface HomePageProps extends WithStyles { + activities: Home_activities_edges_node[]; + orders: number; + ordersToCapture: number; + ordersToFulfill: number; + productsOutOfStock: number; + sales: Home_salesToday_gross; + topProducts: Home_productTopToday_edges_node[]; + userName: string; + onOrdersToCaptureClick: () => void; + onOrdersToFulfillClick: () => void; + onProductClick: (productId: string, variantId: string) => void; + onProductsOutOfStockClick: () => void; +} + +const HomePage = withStyles(styles, { name: "HomePage" })( + ({ + classes, + userName, + orders, + sales, + topProducts, + onProductClick, + activities, + onOrdersToCaptureClick, + onOrdersToFulfillClick, + onProductsOutOfStockClick, + ordersToCapture, + ordersToFulfill, + productsOutOfStock + }: HomePageProps) => ( + + + + +
    +
    + } + > + {sales ? ( + + ) : ( + + )} + + } + > + {orders === undefined ? ( + + ) : ( + orders + )} + +
    + + + + +
    +
    + +
    +
    +
    + ) +); +HomePage.displayName = "HomePage"; +export default HomePage; diff --git a/src/home/components/HomePage/index.ts b/src/home/components/HomePage/index.ts new file mode 100644 index 000000000..60f729a6c --- /dev/null +++ b/src/home/components/HomePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./HomePage"; +export * from "./HomePage"; diff --git a/src/home/components/HomeProductListCard/HomeProductListCard.tsx b/src/home/components/HomeProductListCard/HomeProductListCard.tsx new file mode 100644 index 000000000..d6783210a --- /dev/null +++ b/src/home/components/HomeProductListCard/HomeProductListCard.tsx @@ -0,0 +1,130 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import Typography from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { Home_productTopToday_edges_node } from "../../types/Home"; + +const styles = (theme: Theme) => + createStyles({ + avatarProps: { + height: 64, + width: 64 + }, + avatarSpacing: { + paddingBottom: theme.spacing.unit * 2, + paddingTop: theme.spacing.unit * 2 + }, + noProducts: { + paddingBottom: 20, + paddingTop: 20 + }, + tableRow: { + cursor: "pointer" + } + }); + +interface HomeProductListProps extends WithStyles { + topProducts: Home_productTopToday_edges_node[]; + onRowClick: (productId: string, variantId: string) => void; +} + +export const HomeProductList = withStyles(styles, { name: "HomeProductList" })( + ({ classes, topProducts, onRowClick }: HomeProductListProps) => ( + + + + + {renderCollection( + topProducts, + variant => ( + onRowClick(variant.product.id, variant.id) + : undefined + } + > + variant.product.thumbnail.url)} + avatarProps={classes.avatarProps} + /> + + + {variant ? ( + <> + + {variant.product.name} + + + {maybe(() => + variant.attributes + .map(attribute => attribute.value) + .sort((a, b) => + a.sortOrder > b.sortOrder ? 1 : -1 + ) + .map(attribute => attribute.name) + .join(" / ") + )} + + + {i18n.t("{{ordersCount}} Orders", { + ordersCount: variant.quantityOrdered + })} + + + ) : ( + + )} + + + + + {maybe( + () => ( + + ), + + )} + + + + ), + () => ( + + + {i18n.t("No products found")} + + + ) + )} + +
    +
    + ) +); + +HomeProductList.displayName = "HomeProductList"; +export default HomeProductList; diff --git a/src/home/components/HomeProductListCard/index.ts b/src/home/components/HomeProductListCard/index.ts new file mode 100644 index 000000000..139cd4fe3 --- /dev/null +++ b/src/home/components/HomeProductListCard/index.ts @@ -0,0 +1,2 @@ +export { default } from "./HomeProductListCard"; +export * from "./HomeProductListCard"; diff --git a/src/home/components/HomeScreen.tsx b/src/home/components/HomeScreen.tsx new file mode 100644 index 000000000..9c30edce0 --- /dev/null +++ b/src/home/components/HomeScreen.tsx @@ -0,0 +1,40 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../i18n"; + +interface HomeScreenProps { + user: { + email: string; + }; +} + +export const HomeScreen: React.StatelessComponent = ({ + user +}) => ( + + + + + + + {i18n.t( + "The new dashboard and the GraphQL API are preview-quality software." + )} + + + {i18n.t( + "The GraphQL API is beta quality. It is not fully optimized and some mutations or queries may be missing." + )} + + + + +); diff --git a/src/home/fixtures.ts b/src/home/fixtures.ts new file mode 100644 index 000000000..16bb183f9 --- /dev/null +++ b/src/home/fixtures.ts @@ -0,0 +1,340 @@ +import { OrderEventsEnum } from "../types/globalTypes"; +import { Home } from "./types/Home"; + +export const shop: (placeholderImage: string) => Home = ( + placeholderImage: string +) => ({ + activities: { + __typename: "OrderEventCountableConnection", + edges: [ + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-09-14T16:10:27.137126+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDoxOA==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED_FROM_DRAFT, + user: { + __typename: "User", + email: "admin@example.com", + id: "VXNlcjoyMQ==" + } + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-03T13:28:46.325279+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDozNQ==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED, + user: null + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-03T13:29:01.837496+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDozNw==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.ORDER_FULLY_PAID, + user: null + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-04T01:01:51.243723+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo1OA==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED_FROM_DRAFT, + user: { + __typename: "User", + email: "admin@example.com", + id: "VXNlcjoyMQ==" + } + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-04T19:36:18.831561+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo2Nw==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED_FROM_DRAFT, + user: { + __typename: "User", + email: "admin@example.com", + id: "VXNlcjoyMQ==" + } + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-04T19:38:01.420365+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo2OA==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED_FROM_DRAFT, + user: { + __typename: "User", + email: "admin@example.com", + id: "VXNlcjoyMQ==" + } + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-05T12:30:57.268592+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo3MQ==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED_FROM_DRAFT, + user: { + __typename: "User", + email: "admin@example.com", + id: "VXNlcjoyMQ==" + } + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-08T09:50:42.622253+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo3Mw==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED, + user: null + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-12T15:51:11.665838+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo3Nw==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED_FROM_DRAFT, + user: { + __typename: "User", + email: "admin@example.com", + id: "VXNlcjoyMQ==" + } + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-25T11:25:58.843860+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo3OA==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED, + user: null + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-26T09:34:57.580167+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo4MA==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.PLACED, + user: null + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-26T09:38:02.440061+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo4Mg==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.ORDER_FULLY_PAID, + user: null + } + }, + { + __typename: "OrderEventCountableEdge", + node: { + __typename: "OrderEvent", + amount: null, + composedId: null, + date: "2018-10-26T09:38:02.467443+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo4NA==", + message: null, + orderNumber: "15", + oversoldItems: null, + quantity: null, + type: OrderEventsEnum.ORDER_FULLY_PAID, + user: null + } + } + ] + }, + ordersToCapture: { + __typename: "OrderCountableConnection", + totalCount: 0 + }, + ordersToFulfill: { + __typename: "OrderCountableConnection", + totalCount: 1 + }, + ordersToday: { + __typename: "OrderCountableConnection", + totalCount: 1 + }, + productTopToday: { + __typename: "ProductVariantCountableConnection", + edges: [ + { + __typename: "ProductVariantCountableEdge", + node: { + __typename: "ProductVariant", + attributes: [ + { + __typename: "SelectedAttribute", + value: { + __typename: "AttributeValue", + id: "QXR0cmlidXRlVmFsdWU6OTI=", + name: "XS", + sortOrder: 0 + } + } + ], + id: "UHJvZHVjdFZhcmlhbnQ6NDM=", + product: { + __typename: "Product", + basePrice: { + __typename: "Money", + amount: 37.65, + currency: "USD" + }, + id: "UHJvZHVjdDo4", + name: "Gardner-Martin", + thumbnail: { + __typename: "Image", + url: placeholderImage + } + }, + quantityOrdered: 1, + revenue: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 37.65, + currency: "USD" + } + } + } + } + ] + }, + productsOutOfStock: { + __typename: "ProductCountableConnection", + totalCount: 0 + }, + salesToday: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 57.15, + currency: "USD" + } + } +}); diff --git a/src/home/index.tsx b/src/home/index.tsx new file mode 100644 index 000000000..e7520f23f --- /dev/null +++ b/src/home/index.tsx @@ -0,0 +1,7 @@ +import * as React from "react"; + +import HomePage from "./views"; + +const Component = () => ; + +export default Component; diff --git a/src/home/queries.ts b/src/home/queries.ts new file mode 100644 index 000000000..8e5011fdf --- /dev/null +++ b/src/home/queries.ts @@ -0,0 +1,77 @@ +import gql from "graphql-tag"; + +import { TypedQuery } from "../queries"; +import { Home } from "./types/Home"; + +const home = gql` + query Home { + salesToday: ordersTotal(period: TODAY) { + gross { + amount + currency + } + } + ordersToday: orders(created: TODAY) { + totalCount + } + ordersToFulfill: orders(status: READY_TO_FULFILL) { + totalCount + } + ordersToCapture: orders(status: READY_TO_CAPTURE) { + totalCount + } + productsOutOfStock: products(stockAvailability: OUT_OF_STOCK) { + totalCount + } + productTopToday: reportProductSales(period: TODAY, first: 5) { + edges { + node { + id + revenue(period: TODAY) { + gross { + amount + currency + } + } + attributes { + value { + id + name + sortOrder + } + } + product { + id + name + thumbnail { + url + } + } + quantityOrdered + } + } + } + activities: homepageEvents(last: 10) { + edges { + node { + amount + composedId + date + email + emailType + id + message + orderNumber + oversoldItems + quantity + type + user { + id + email + } + } + } + } + } +`; +export const HomePageQuery = TypedQuery(home); diff --git a/src/home/types/Home.ts b/src/home/types/Home.ts new file mode 100644 index 000000000..9400d0adc --- /dev/null +++ b/src/home/types/Home.ts @@ -0,0 +1,136 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: Home +// ==================================================== + +export interface Home_salesToday_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface Home_salesToday { + __typename: "TaxedMoney"; + gross: Home_salesToday_gross; +} + +export interface Home_ordersToday { + __typename: "OrderCountableConnection"; + totalCount: number | null; +} + +export interface Home_ordersToFulfill { + __typename: "OrderCountableConnection"; + totalCount: number | null; +} + +export interface Home_ordersToCapture { + __typename: "OrderCountableConnection"; + totalCount: number | null; +} + +export interface Home_productsOutOfStock { + __typename: "ProductCountableConnection"; + totalCount: number | null; +} + +export interface Home_productTopToday_edges_node_revenue_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface Home_productTopToday_edges_node_revenue { + __typename: "TaxedMoney"; + gross: Home_productTopToday_edges_node_revenue_gross; +} + +export interface Home_productTopToday_edges_node_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + sortOrder: number | null; +} + +export interface Home_productTopToday_edges_node_attributes { + __typename: "SelectedAttribute"; + value: Home_productTopToday_edges_node_attributes_value; +} + +export interface Home_productTopToday_edges_node_product_thumbnail { + __typename: "Image"; + url: string; +} + +export interface Home_productTopToday_edges_node_product { + __typename: "Product"; + id: string; + name: string; + thumbnail: Home_productTopToday_edges_node_product_thumbnail | null; +} + +export interface Home_productTopToday_edges_node { + __typename: "ProductVariant"; + id: string; + revenue: Home_productTopToday_edges_node_revenue | null; + attributes: Home_productTopToday_edges_node_attributes[]; + product: Home_productTopToday_edges_node_product; + quantityOrdered: number | null; +} + +export interface Home_productTopToday_edges { + __typename: "ProductVariantCountableEdge"; + node: Home_productTopToday_edges_node; +} + +export interface Home_productTopToday { + __typename: "ProductVariantCountableConnection"; + edges: Home_productTopToday_edges[]; +} + +export interface Home_activities_edges_node_user { + __typename: "User"; + id: string; + email: string; +} + +export interface Home_activities_edges_node { + __typename: "OrderEvent"; + amount: number | null; + composedId: string | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + id: string; + message: string | null; + orderNumber: string | null; + oversoldItems: (string | null)[] | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: Home_activities_edges_node_user | null; +} + +export interface Home_activities_edges { + __typename: "OrderEventCountableEdge"; + node: Home_activities_edges_node; +} + +export interface Home_activities { + __typename: "OrderEventCountableConnection"; + edges: Home_activities_edges[]; +} + +export interface Home { + salesToday: Home_salesToday | null; + ordersToday: Home_ordersToday | null; + ordersToFulfill: Home_ordersToFulfill | null; + ordersToCapture: Home_ordersToCapture | null; + productsOutOfStock: Home_productsOutOfStock | null; + productTopToday: Home_productTopToday | null; + activities: Home_activities | null; +} diff --git a/src/home/views/index.tsx b/src/home/views/index.tsx new file mode 100644 index 000000000..b0a06a884 --- /dev/null +++ b/src/home/views/index.tsx @@ -0,0 +1,62 @@ +import * as React from "react"; + +import useNavigator from "@saleor/hooks/useNavigator"; +import useUser from "@saleor/hooks/useUser"; +import { getUserName, maybe } from "../../misc"; +import { orderListUrl } from "../../orders/urls"; +import { productListUrl, productVariantEditUrl } from "../../products/urls"; +import { OrderStatusFilter, StockAvailability } from "../../types/globalTypes"; +import HomePage from "../components/HomePage"; +import { HomePageQuery } from "../queries"; + +const HomeSection = () => { + const navigate = useNavigator(); + const { user } = useUser(); + + return ( + + {({ data }) => ( + + data.activities.edges.map(edge => edge.node).reverse() + )} + orders={maybe(() => data.ordersToday.totalCount)} + sales={maybe(() => data.salesToday.gross)} + topProducts={maybe(() => + data.productTopToday.edges.map(edge => edge.node) + )} + onProductClick={(productId, variantId) => + navigate(productVariantEditUrl(productId, variantId)) + } + onOrdersToCaptureClick={() => + navigate( + orderListUrl({ + status: OrderStatusFilter.READY_TO_CAPTURE + }) + ) + } + onOrdersToFulfillClick={() => + navigate( + orderListUrl({ + status: OrderStatusFilter.READY_TO_FULFILL + }) + ) + } + onProductsOutOfStockClick={() => + navigate( + productListUrl({ + status: StockAvailability.OUT_OF_STOCK + }) + ) + } + ordersToCapture={maybe(() => data.ordersToCapture.totalCount)} + ordersToFulfill={maybe(() => data.ordersToFulfill.totalCount)} + productsOutOfStock={maybe(() => data.productsOutOfStock.totalCount)} + userName={getUserName(user, true)} + /> + )} + + ); +}; + +export default HomeSection; diff --git a/src/hooks/useBulkActions.ts b/src/hooks/useBulkActions.ts new file mode 100644 index 000000000..986308782 --- /dev/null +++ b/src/hooks/useBulkActions.ts @@ -0,0 +1,45 @@ +import { useState } from "react"; +import { Node } from "../types"; + +function useBulkActions(initial: string[] = []) { + const [listElements, setListElements] = useState(initial); + + function isSelected(id: string) { + return !!listElements.find(listElement => listElement === id); + } + + function add(id: string) { + setListElements([...listElements, id]); + } + + function remove(id: string) { + setListElements(listElements.filter(listElement => listElement !== id)); + } + + function reset() { + setListElements([]); + } + + function toggle(id: string) { + isSelected(id) ? remove(id) : add(id); + } + + function toggleAll(items: Node[], selected: number) { + const allItems = items.map(item => item.id); + reset(); + if (selected !== allItems.length) { + setListElements(allItems); + } + } + + return { + add, + isSelected, + listElements, + remove, + reset, + toggle, + toggleAll + }; +} +export default useBulkActions; diff --git a/src/hooks/useDateLocalize.ts b/src/hooks/useDateLocalize.ts new file mode 100644 index 000000000..88426f520 --- /dev/null +++ b/src/hooks/useDateLocalize.ts @@ -0,0 +1,15 @@ +import * as moment from "moment-timezone"; +import { useContext } from "react"; + +import { LocaleContext } from "@saleor/components/Locale"; + +function useDateLocalize(): (date: string) => string { + const locale = useContext(LocaleContext); + + return (date: string) => + moment(date) + .locale(locale) + .format("ll"); +} + +export default useDateLocalize; diff --git a/src/hooks/useLocale.ts b/src/hooks/useLocale.ts new file mode 100644 index 000000000..1f1487603 --- /dev/null +++ b/src/hooks/useLocale.ts @@ -0,0 +1,9 @@ +import { useContext } from "react"; + +import { LocaleContext } from "@saleor/components/Locale"; + +function useLocale() { + const themeInfo = useContext(LocaleContext); + return themeInfo; +} +export default useLocale; diff --git a/src/hooks/useNavigator.ts b/src/hooks/useNavigator.ts new file mode 100644 index 000000000..180b1d1bb --- /dev/null +++ b/src/hooks/useNavigator.ts @@ -0,0 +1,21 @@ +import useRouter from "use-react-router"; + +export type UseNavigatorResult = ( + url: string, + replace?: boolean, + preserveQs?: boolean +) => void; +function useNavigator(): UseNavigatorResult { + const { + location: { search }, + history + } = useRouter(); + + return (url: string, replace = false, preserveQs = false) => { + const targetUrl = preserveQs ? url + search : url; + replace ? history.replace(targetUrl) : history.push(targetUrl); + window.scrollTo({ top: 0, behavior: "smooth" }); + }; +} + +export default useNavigator; diff --git a/src/hooks/useNotifier.ts b/src/hooks/useNotifier.ts new file mode 100644 index 000000000..6f18707e9 --- /dev/null +++ b/src/hooks/useNotifier.ts @@ -0,0 +1,10 @@ +import { useContext } from "react"; + +import { IMessageContext, MessageContext } from "@saleor/components/messages"; + +export type UseNotifierResult = IMessageContext; +function useNotifier(): UseNotifierResult { + const notify = useContext(MessageContext); + return notify; +} +export default useNotifier; diff --git a/src/hooks/usePaginator.ts b/src/hooks/usePaginator.ts new file mode 100644 index 000000000..8c67a736a --- /dev/null +++ b/src/hooks/usePaginator.ts @@ -0,0 +1,85 @@ +import { stringify as stringifyQs } from "qs"; + +import { Pagination } from "../types"; +import useNavigator from "./useNavigator"; + +export interface PageInfo { + endCursor: string; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string; +} + +export interface PaginationState { + after?: string; + before?: string; + first?: number; + last?: number; +} + +export function createPaginationState( + paginateBy: number, + queryString: Pagination +): PaginationState { + return queryString && (queryString.before || queryString.after) + ? queryString.after + ? { + after: queryString.after, + first: paginateBy + } + : { + before: queryString.before, + last: paginateBy + } + : { + first: paginateBy + }; +} + +function usePaginator() { + const navigate = useNavigator(); + + function paginate( + pageInfo: PageInfo, + paginationState: PaginationState, + queryString: Pagination + ) { + const loadNextPage = () => + navigate( + "?" + + stringifyQs({ + ...queryString, + after: pageInfo.endCursor, + before: undefined + }), + true + ); + + const loadPreviousPage = () => + navigate( + "?" + + stringifyQs({ + ...queryString, + after: undefined, + before: pageInfo.startCursor + }), + true + ); + + const newPageInfo = pageInfo + ? { + ...pageInfo, + hasNextPage: !!paginationState.before || pageInfo.hasNextPage, + hasPreviousPage: !!paginationState.after || pageInfo.hasPreviousPage + } + : undefined; + + return { + loadNextPage, + loadPreviousPage, + pageInfo: newPageInfo + }; + } + return paginate; +} +export default usePaginator; diff --git a/src/hooks/useScroll.ts b/src/hooks/useScroll.ts new file mode 100644 index 000000000..355ae5e5e --- /dev/null +++ b/src/hooks/useScroll.ts @@ -0,0 +1,25 @@ +// tslint:disable:no-submodule-imports +import * as throttle from "lodash/throttle"; +import { useEffect, useState } from "react"; + +function getPosition() { + return { + x: window.pageXOffset, + y: window.pageYOffset + }; +} + +function useScroll() { + const [scroll, setScroll] = useState(getPosition); + + useEffect(() => { + const handleScroll = throttle(() => setScroll(getPosition()), 250); + + window.addEventListener("scroll", handleScroll); + + return () => window.removeEventListener("scroll", handleScroll); + }, []); + + return scroll; +} +export default useScroll; diff --git a/src/hooks/useShop.ts b/src/hooks/useShop.ts new file mode 100644 index 000000000..22c333e2b --- /dev/null +++ b/src/hooks/useShop.ts @@ -0,0 +1,8 @@ +import { useContext } from "react"; + +import { shopContext } from "@saleor/components/Shop"; + +function useShop() { + return useContext(shopContext); +} +export default useShop; diff --git a/src/hooks/useTheme.ts b/src/hooks/useTheme.ts new file mode 100644 index 000000000..409b09f3d --- /dev/null +++ b/src/hooks/useTheme.ts @@ -0,0 +1,9 @@ +import { useContext } from "react"; + +import { ThemeContext } from "@saleor/components/Theme"; + +function useTheme() { + const themeInfo = useContext(ThemeContext); + return themeInfo; +} +export default useTheme; diff --git a/src/hooks/useUser.ts b/src/hooks/useUser.ts new file mode 100644 index 000000000..13e6c3fd0 --- /dev/null +++ b/src/hooks/useUser.ts @@ -0,0 +1,9 @@ +import { useContext } from "react"; + +import { UserContext } from "../auth"; + +function useUser() { + const user = useContext(UserContext); + return user; +} +export default useUser; diff --git a/src/i18n.ts b/src/i18n.ts new file mode 100644 index 000000000..d15b0883b --- /dev/null +++ b/src/i18n.ts @@ -0,0 +1,18 @@ +import * as i18n from "i18next"; +import * as LanguageDetector from "i18next-browser-languagedetector"; +import * as XHR from "i18next-xhr-backend"; + +i18n.use(XHR); +i18n.use(LanguageDetector); +i18n.init({ + defaultNS: "dashboard", + fallbackLng: "en", + interpolation: { + escapeValue: false + }, + keySeparator: false, + ns: ["dashboard"], + nsSeparator: false +}); + +export default i18n; diff --git a/src/icons/AccountCircle.tsx b/src/icons/AccountCircle.tsx new file mode 100644 index 000000000..49eae5c1e --- /dev/null +++ b/src/icons/AccountCircle.tsx @@ -0,0 +1,20 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const AccountCircle = createSvgIcon( + <> + + + + + + +); +AccountCircle.displayName = "AccountCircle"; +export default AccountCircle; diff --git a/src/icons/ArrowDropdown.tsx b/src/icons/ArrowDropdown.tsx new file mode 100644 index 000000000..e8f324da3 --- /dev/null +++ b/src/icons/ArrowDropdown.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const NoPhoto = createSvgIcon( + + + +); +NoPhoto.displayName = "NoPhoto"; +export default NoPhoto; diff --git a/src/icons/Ballot.tsx b/src/icons/Ballot.tsx new file mode 100644 index 000000000..d5dfb8afe --- /dev/null +++ b/src/icons/Ballot.tsx @@ -0,0 +1,17 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Ballot = createSvgIcon( + <> + + + + + + + + + +); +Ballot.displayName = "Ballot"; +export default Ballot; diff --git a/src/icons/BoldIcon.tsx b/src/icons/BoldIcon.tsx new file mode 100644 index 000000000..ae22592b2 --- /dev/null +++ b/src/icons/BoldIcon.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const BoldIcon = createSvgIcon( + <> + + +); +BoldIcon.displayName = "BoldIcon"; +export default BoldIcon; diff --git a/src/icons/Calendar.tsx b/src/icons/Calendar.tsx new file mode 100644 index 000000000..a67c5e60e --- /dev/null +++ b/src/icons/Calendar.tsx @@ -0,0 +1,28 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Calendar = createSvgIcon( + <> + + + + + + + + +); +Calendar.displayName = "Calendar"; +export default Calendar; diff --git a/src/icons/Draggable.tsx b/src/icons/Draggable.tsx new file mode 100644 index 000000000..948ef738e --- /dev/null +++ b/src/icons/Draggable.tsx @@ -0,0 +1,31 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Draggable = createSvgIcon( + <> + + + + + + + + +); +Draggable.displayName = "Draggable"; +export default Draggable; diff --git a/src/icons/Folder.tsx b/src/icons/Folder.tsx new file mode 100644 index 000000000..f9e6bdb5d --- /dev/null +++ b/src/icons/Folder.tsx @@ -0,0 +1,12 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Folder = createSvgIcon( + <> + + + + +); +Folder.displayName = "Folder"; +export default Folder; diff --git a/src/icons/HeaderOne.tsx b/src/icons/HeaderOne.tsx new file mode 100644 index 000000000..31409752f --- /dev/null +++ b/src/icons/HeaderOne.tsx @@ -0,0 +1,11 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const HeaderOne = createSvgIcon( + <> + + + +); +HeaderOne.displayName = "HeaderOne"; +export default HeaderOne; diff --git a/src/icons/HeaderThree.tsx b/src/icons/HeaderThree.tsx new file mode 100644 index 000000000..8544d68ec --- /dev/null +++ b/src/icons/HeaderThree.tsx @@ -0,0 +1,11 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const HeaderThree = createSvgIcon( + <> + + + +); +HeaderThree.displayName = "HeaderThree"; +export default HeaderThree; diff --git a/src/icons/HeaderTwo.tsx b/src/icons/HeaderTwo.tsx new file mode 100644 index 000000000..8a9b4d289 --- /dev/null +++ b/src/icons/HeaderTwo.tsx @@ -0,0 +1,11 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const HeaderTwo = createSvgIcon( + <> + + + +); +HeaderTwo.displayName = "HeaderTwo"; +export default HeaderTwo; diff --git a/src/icons/Home.tsx b/src/icons/Home.tsx new file mode 100644 index 000000000..1e574e556 --- /dev/null +++ b/src/icons/Home.tsx @@ -0,0 +1,12 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Home = createSvgIcon( + <> + + + + +); +Home.displayName = "Home"; +export default Home; diff --git a/src/icons/Image.tsx b/src/icons/Image.tsx new file mode 100644 index 000000000..3ff31d962 --- /dev/null +++ b/src/icons/Image.tsx @@ -0,0 +1,26 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Image = createSvgIcon( + <> + + + + + + + + +); +Image.displayName = "Image"; +export default Image; diff --git a/src/icons/ItalicIcon.tsx b/src/icons/ItalicIcon.tsx new file mode 100644 index 000000000..ced567f02 --- /dev/null +++ b/src/icons/ItalicIcon.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const ItalicIcon = createSvgIcon( + <> + + +); +ItalicIcon.displayName = "ItalicIcon"; +export default ItalicIcon; diff --git a/src/icons/LinkIcon.tsx b/src/icons/LinkIcon.tsx new file mode 100644 index 000000000..adfd37b6f --- /dev/null +++ b/src/icons/LinkIcon.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const LinkIcon = createSvgIcon( + <> + + +); +LinkIcon.displayName = "LinkIcon"; +export default LinkIcon; diff --git a/src/icons/LocalShipping.tsx b/src/icons/LocalShipping.tsx new file mode 100644 index 000000000..b0440c68e --- /dev/null +++ b/src/icons/LocalShipping.tsx @@ -0,0 +1,12 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const LocalShipping = createSvgIcon( + <> + + + + +); +LocalShipping.displayName = "LocalShipping"; +export default LocalShipping; diff --git a/src/icons/Monetization.tsx b/src/icons/Monetization.tsx new file mode 100644 index 000000000..1dd34af67 --- /dev/null +++ b/src/icons/Monetization.tsx @@ -0,0 +1,14 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Monetization = createSvgIcon( + <> + + + + + + +); +Monetization.displayName = "Monetization"; +export default Monetization; diff --git a/src/icons/Moon.tsx b/src/icons/Moon.tsx new file mode 100644 index 000000000..88df92b0f --- /dev/null +++ b/src/icons/Moon.tsx @@ -0,0 +1,24 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Moon = createSvgIcon( + <> + + + + +); +Moon.displayName = "Moon"; +export default Moon; diff --git a/src/icons/Navigation.tsx b/src/icons/Navigation.tsx new file mode 100644 index 000000000..57b83ec11 --- /dev/null +++ b/src/icons/Navigation.tsx @@ -0,0 +1,45 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Navigation = createSvgIcon( + <> + + + + + + + + + + + + + +); +Navigation.displayName = "Navigation"; +export default Navigation; diff --git a/src/icons/NoPhoto.tsx b/src/icons/NoPhoto.tsx new file mode 100644 index 000000000..60f61c2ab --- /dev/null +++ b/src/icons/NoPhoto.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const NoPhoto = createSvgIcon( + + + +); +NoPhoto.displayName = "NoPhoto"; +export default NoPhoto; diff --git a/src/icons/OrderedListIcon.tsx b/src/icons/OrderedListIcon.tsx new file mode 100644 index 000000000..e203dc794 --- /dev/null +++ b/src/icons/OrderedListIcon.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const OrderedListIcon = createSvgIcon( + <> + + +); +OrderedListIcon.displayName = "OrderedListIcon"; +export default OrderedListIcon; diff --git a/src/icons/Orders.tsx b/src/icons/Orders.tsx new file mode 100644 index 000000000..264a652f3 --- /dev/null +++ b/src/icons/Orders.tsx @@ -0,0 +1,28 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Orders = createSvgIcon( + <> + + + + + + + + +); +Orders.displayName = "Orders"; +export default Orders; diff --git a/src/icons/Pages.tsx b/src/icons/Pages.tsx new file mode 100644 index 000000000..cf4be3c29 --- /dev/null +++ b/src/icons/Pages.tsx @@ -0,0 +1,28 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Pages = createSvgIcon( + <> + + + + + + + + +); +Pages.displayName = "Pages"; +export default Pages; diff --git a/src/icons/ProductTypes.tsx b/src/icons/ProductTypes.tsx new file mode 100644 index 000000000..57d3b88f7 --- /dev/null +++ b/src/icons/ProductTypes.tsx @@ -0,0 +1,28 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const ProductTypes = createSvgIcon( + <> + + + + + + + + +); +ProductTypes.displayName = "ProductTypes"; +export default ProductTypes; diff --git a/src/icons/QuotationIcon.tsx b/src/icons/QuotationIcon.tsx new file mode 100644 index 000000000..16e855053 --- /dev/null +++ b/src/icons/QuotationIcon.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const QuotationIcon = createSvgIcon( + <> + + +); +QuotationIcon.displayName = "QuotationIcon"; +export default QuotationIcon; diff --git a/src/icons/Sales.tsx b/src/icons/Sales.tsx new file mode 100644 index 000000000..dc85268a7 --- /dev/null +++ b/src/icons/Sales.tsx @@ -0,0 +1,28 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Sales = createSvgIcon( + <> + + + + + + + + +); +Sales.displayName = "Sales"; +export default Sales; diff --git a/src/icons/ShippingMethods.tsx b/src/icons/ShippingMethods.tsx new file mode 100644 index 000000000..b695a80d6 --- /dev/null +++ b/src/icons/ShippingMethods.tsx @@ -0,0 +1,28 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const ShippingMethods = createSvgIcon( + <> + + + + + + + + +); +ShippingMethods.displayName = "ShippingMethods"; +export default ShippingMethods; diff --git a/src/icons/Shop.tsx b/src/icons/Shop.tsx new file mode 100644 index 000000000..397a69410 --- /dev/null +++ b/src/icons/Shop.tsx @@ -0,0 +1,14 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Shop = createSvgIcon( + <> + + + + + + +); +Shop.displayName = "Shop"; +export default Shop; diff --git a/src/icons/SiteSettings.tsx b/src/icons/SiteSettings.tsx new file mode 100644 index 000000000..fc7d50bad --- /dev/null +++ b/src/icons/SiteSettings.tsx @@ -0,0 +1,28 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const SiteSettings = createSvgIcon( + <> + + + + + + + + +); +SiteSettings.displayName = "SiteSettings"; +export default SiteSettings; diff --git a/src/icons/StaffMembers.tsx b/src/icons/StaffMembers.tsx new file mode 100644 index 000000000..1a3072e0d --- /dev/null +++ b/src/icons/StaffMembers.tsx @@ -0,0 +1,28 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const StaffMembers = createSvgIcon( + <> + + + + + + + + +); +StaffMembers.displayName = "StaffMembers"; +export default StaffMembers; diff --git a/src/icons/StoreMall.tsx b/src/icons/StoreMall.tsx new file mode 100644 index 000000000..bec5a200c --- /dev/null +++ b/src/icons/StoreMall.tsx @@ -0,0 +1,12 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const StoreMall = createSvgIcon( + <> + + + + +); +StoreMall.displayName = "StoreMall"; +export default StoreMall; diff --git a/src/icons/StrikethroughIcon.tsx b/src/icons/StrikethroughIcon.tsx new file mode 100644 index 000000000..93f8286fc --- /dev/null +++ b/src/icons/StrikethroughIcon.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const HeaderOne = createSvgIcon( + <> + + +); +HeaderOne.displayName = "HeaderOne"; +export default HeaderOne; diff --git a/src/icons/Sun.tsx b/src/icons/Sun.tsx new file mode 100644 index 000000000..ff870b2f9 --- /dev/null +++ b/src/icons/Sun.tsx @@ -0,0 +1,14 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Sun = createSvgIcon( + <> + + +); +Sun.displayName = "Sun"; +export default Sun; diff --git a/src/icons/Taxes.tsx b/src/icons/Taxes.tsx new file mode 100644 index 000000000..bfc3ce334 --- /dev/null +++ b/src/icons/Taxes.tsx @@ -0,0 +1,28 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Taxes = createSvgIcon( + <> + + + + + + + + +); +Taxes.displayName = "Taxes"; +export default Taxes; diff --git a/src/icons/Truck.tsx b/src/icons/Truck.tsx new file mode 100644 index 000000000..edfe088ed --- /dev/null +++ b/src/icons/Truck.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Truck = createSvgIcon( + <> + + +); +Truck.displayName = "Truck"; +export default Truck; diff --git a/src/icons/UnorderedListIcon.tsx b/src/icons/UnorderedListIcon.tsx new file mode 100644 index 000000000..f62a439d3 --- /dev/null +++ b/src/icons/UnorderedListIcon.tsx @@ -0,0 +1,10 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const UnorderedListIcon = createSvgIcon( + <> + + +); +UnorderedListIcon.displayName = "UnorderedListIcon"; +export default UnorderedListIcon; diff --git a/src/icons/Unstyled.tsx b/src/icons/Unstyled.tsx new file mode 100644 index 000000000..c5993628a --- /dev/null +++ b/src/icons/Unstyled.tsx @@ -0,0 +1,14 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import * as React from "react"; + +export const Unstyled = createSvgIcon( + <> + + +); +Unstyled.displayName = "Unstyled"; +export default Unstyled; diff --git a/src/index.html b/src/index.html new file mode 100644 index 000000000..44ad4a630 --- /dev/null +++ b/src/index.html @@ -0,0 +1,11 @@ + + + + + <%= htmlWebpackPlugin.options.title %> + + + +
    + + \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 000000000..229fbe5c8 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,236 @@ +import { defaultDataIdFromObject, InMemoryCache } from "apollo-cache-inmemory"; +import { ApolloClient } from "apollo-client"; +import { ApolloLink } from "apollo-link"; +import { BatchHttpLink } from "apollo-link-batch-http"; +import { setContext } from "apollo-link-context"; +import { ErrorResponse, onError } from "apollo-link-error"; +import { createUploadLink } from "apollo-upload-client"; +import * as React from "react"; +import { ApolloProvider } from "react-apollo"; +import { render } from "react-dom"; +import { BrowserRouter, Route, Switch } from "react-router-dom"; + +import { getAuthToken, removeAuthToken } from "./auth"; +import AuthProvider from "./auth/AuthProvider"; +import LoginLoading from "./auth/components/LoginLoading/LoginLoading"; +import SectionRoute from "./auth/components/SectionRoute"; +import { hasPermission } from "./auth/misc"; +import Login from "./auth/views/Login"; +import CategorySection from "./categories"; +import CollectionSection from "./collections"; +import { AppProgressProvider } from "./components/AppProgress"; +// import { ConfirmFormLeaveDialog } from "./components/ConfirmFormLeaveDialog"; +import { DateProvider } from "./components/Date"; +import { FormProvider } from "./components/Form"; +import { LocaleProvider } from "./components/Locale"; +import { MessageManager } from "./components/messages"; +import { ShopProvider } from "./components/Shop"; +import ThemeProvider from "./components/Theme"; +import { WindowTitle } from "./components/WindowTitle"; +import { API_URI, APP_MOUNT_URI } from "./config"; +import ConfigurationSection, { configurationMenu } from "./configuration"; +import { CustomerSection } from "./customers"; +import DiscountSection from "./discounts"; +import HomePage from "./home"; +import i18n from "./i18n"; +import NavigationSection from "./navigation"; +import { navigationSection } from "./navigation/urls"; +import { NotFound } from "./NotFound"; +import OrdersSection from "./orders"; +import PageSection from "./pages"; +import ProductSection from "./products"; +import ProductTypesSection from "./productTypes"; +import ShippingSection from "./shipping"; +import SiteSettingsSection from "./siteSettings"; +import StaffSection from "./staff"; +import TaxesSection from "./taxes"; +import TranslationsSection from "./translations"; +import { PermissionEnum } from "./types/globalTypes"; + +interface ResponseError extends ErrorResponse { + networkError?: Error & { + statusCode?: number; + bodyText?: string; + }; +} + +const invalidTokenLink = onError((error: ResponseError) => { + if (error.networkError && error.networkError.statusCode === 401) { + removeAuthToken(); + } +}); + +const authLink = setContext((_, context) => { + const authToken = getAuthToken(); + return { + ...context, + headers: { + ...context.headers, + Authorization: authToken ? `JWT ${authToken}` : null + } + }; +}); + +const linkOptions = { + credentials: "same-origin", + uri: API_URI +}; +const uploadLink = createUploadLink(linkOptions); +const batchLink = new BatchHttpLink(linkOptions); + +const link = ApolloLink.split( + operation => operation.getContext().useBatching, + batchLink, + uploadLink +); + +const apolloClient = new ApolloClient({ + cache: new InMemoryCache({ + dataIdFromObject: (obj: any) => { + // We need to set manually shop's ID, since it is singleton and + // API does not return its ID + if (obj.__typename === "Shop") { + return "shop"; + } + return defaultDataIdFromObject(obj); + } + }), + link: invalidTokenLink.concat(authLink.concat(link)) +}); + +const App: React.FC = () => { + const isDark = localStorage.getItem("theme") === "true"; + + return ( + + + + + + + + + + + {/* FIXME: #3424 */} + {/* */} + + {({ + hasToken, + isAuthenticated, + tokenAuthLoading, + tokenVerifyLoading, + user + }) => { + return isAuthenticated && + !tokenAuthLoading && + !tokenVerifyLoading ? ( + + + + + + + + + + + + + + + + + {configurationMenu.filter(menuItem => + hasPermission(menuItem.permission, user) + ).length > 0 && ( + + )} + + + ) : hasToken && tokenVerifyLoading ? ( + + ) : ( + + ); + }} + + + + + + + + + + + ); +}; + +render(, document.querySelector("#dashboard-app")); diff --git a/src/misc.ts b/src/misc.ts new file mode 100644 index 000000000..c41a3b0e7 --- /dev/null +++ b/src/misc.ts @@ -0,0 +1,238 @@ +import * as urlJoin from "url-join"; + +import { MutationFn, MutationResult } from "react-apollo"; +import { ConfirmButtonTransitionState } from "./components/ConfirmButton/ConfirmButton"; +import { APP_MOUNT_URI } from "./config"; +import { AddressType } from "./customers/types"; +import i18n from "./i18n"; +import { PartialMutationProviderOutput, UserError } from "./types"; +import { + AuthorizationKeyType, + OrderStatus, + PaymentChargeStatusEnum, + TaxRateType +} from "./types/globalTypes"; + +export type RequireAtLeastOne = Pick< + T, + Exclude +> & + { [K in Keys]-?: Required> }[Keys]; + +export type RequireOnlyOne = Pick< + T, + Exclude +> & + { + [K in Keys]-?: Required> & + Partial, undefined>> + }[Keys]; + +export function renderCollection( + collection: T[], + renderItem: ( + item: T | undefined, + index: number | undefined, + collection: T[] + ) => any, + renderEmpty?: (collection: T[]) => any +) { + if (collection === undefined) { + return renderItem(undefined, undefined, collection); + } + if (collection.length === 0) { + return !!renderEmpty ? renderEmpty(collection) : null; + } + return collection.map(renderItem); +} + +export function decimal(value: string | number) { + if (typeof value === "string") { + return value === "" ? null : value; + } + return value; +} + +export const removeDoubleSlashes = (url: string) => + url.replace(/([^:]\/)\/+/g, "$1"); + +export const transformPaymentStatus = (status: string) => { + switch (status) { + case PaymentChargeStatusEnum.PARTIALLY_CHARGED: + return { localized: i18n.t("Partially paid"), status: "error" }; + case PaymentChargeStatusEnum.FULLY_CHARGED: + return { localized: i18n.t("Fully paid"), status: "success" }; + case PaymentChargeStatusEnum.PARTIALLY_REFUNDED: + return { localized: i18n.t("Partially refunded"), status: "error" }; + case PaymentChargeStatusEnum.FULLY_REFUNDED: + return { localized: i18n.t("Fully refunded"), status: "success" }; + default: + return { localized: i18n.t("Unpaid"), status: "error" }; + } +}; + +export const transformOrderStatus = (status: string) => { + switch (status) { + case OrderStatus.FULFILLED: + return { localized: i18n.t("Fulfilled"), status: "success" }; + case OrderStatus.PARTIALLY_FULFILLED: + return { localized: i18n.t("Partially fulfilled"), status: "neutral" }; + case OrderStatus.UNFULFILLED: + return { localized: i18n.t("Unfulfilled"), status: "error" }; + case OrderStatus.CANCELED: + return { localized: i18n.t("Cancelled"), status: "error" }; + case OrderStatus.DRAFT: + return { localized: i18n.t("Draft"), status: "error" }; + } + return { + localized: status, + status: "error" + }; +}; + +export const transformAddressToForm = (data: AddressType) => ({ + city: maybe(() => data.city, ""), + cityArea: maybe(() => data.cityArea, ""), + companyName: maybe(() => data.companyName, ""), + country: { + label: maybe(() => data.country.country, ""), + value: maybe(() => data.country.code, "") + }, + countryArea: maybe(() => data.countryArea, ""), + firstName: maybe(() => data.firstName, ""), + lastName: maybe(() => data.lastName, ""), + phone: maybe(() => data.phone, ""), + postalCode: maybe(() => data.postalCode, ""), + streetAddress1: maybe(() => data.streetAddress1, ""), + streetAddress2: maybe(() => data.streetAddress2, "") +}); + +export const translatedTaxRates = () => ({ + [TaxRateType.ACCOMMODATION]: i18n.t("Accommodation"), + [TaxRateType.ADMISSION_TO_CULTURAL_EVENTS]: i18n.t( + "Admission to cultural events" + ), + [TaxRateType.ADMISSION_TO_ENTERTAINMENT_EVENTS]: i18n.t( + "Admission to entertainment events" + ), + [TaxRateType.ADMISSION_TO_SPORTING_EVENTS]: i18n.t( + "Admission to sporting events" + ), + [TaxRateType.ADVERTISING]: i18n.t("Advertising"), + [TaxRateType.AGRICULTURAL_SUPPLIES]: i18n.t("Agricultural supplies"), + [TaxRateType.BABY_FOODSTUFFS]: i18n.t("Baby foodstuffs"), + [TaxRateType.BIKES]: i18n.t("Bikes"), + [TaxRateType.BOOKS]: i18n.t("Books"), + [TaxRateType.CHILDRENS_CLOTHING]: i18n.t("Children's clothing"), + [TaxRateType.DOMESTIC_FUEL]: i18n.t("Domestic fuel"), + [TaxRateType.DOMESTIC_SERVICES]: i18n.t("Domestic services"), + [TaxRateType.E_BOOKS]: i18n.t("E-books"), + [TaxRateType.FOODSTUFFS]: i18n.t("Foodstuffs"), + [TaxRateType.HOTELS]: i18n.t("Hotels"), + [TaxRateType.MEDICAL]: i18n.t("Medical"), + [TaxRateType.NEWSPAPERS]: i18n.t("Newspapers"), + [TaxRateType.PASSENGER_TRANSPORT]: i18n.t("Passenger transport"), + [TaxRateType.PHARMACEUTICALS]: i18n.t("Pharmaceuticals"), + [TaxRateType.PROPERTY_RENOVATIONS]: i18n.t("Property renovations"), + [TaxRateType.RESTAURANTS]: i18n.t("Restaurants"), + [TaxRateType.SOCIAL_HOUSING]: i18n.t("Social housing"), + [TaxRateType.STANDARD]: i18n.t("Standard"), + [TaxRateType.WATER]: i18n.t("Water") +}); + +export const translatedAuthorizationKeyTypes = () => ({ + [AuthorizationKeyType.FACEBOOK]: i18n.t("Facebook"), + [AuthorizationKeyType.GOOGLE_OAUTH2]: i18n.t("Google OAuth2") +}); + +export function maybe(exp: () => T, d?: T) { + try { + const result = exp(); + return result === undefined ? d : result; + } catch { + return d; + } +} + +export function only(obj: T, key: keyof T): boolean { + return Object.keys(obj).every(objKey => + objKey === key ? obj[key] !== undefined : obj[key] === undefined + ); +} + +export function empty(obj: object): boolean { + return Object.keys(obj).every(key => obj[key] === undefined); +} + +export function hasErrors(errorList: UserError[] | null): boolean { + return !( + errorList === undefined || + errorList === null || + errorList.length === 0 + ); +} + +export function getMutationState( + called: boolean, + loading: boolean, + ...errorList: UserError[][] +): ConfirmButtonTransitionState { + if (loading) { + return "loading"; + } + if (called) { + return errorList.map(hasErrors).reduce((acc, curr) => acc || curr, false) + ? "error" + : "success"; + } + return "default"; +} + +export function getMutationProviderData( + mutateFn: MutationFn, + opts: MutationResult +): PartialMutationProviderOutput { + return { + mutate: variables => mutateFn({ variables }), + opts + }; +} + +interface User { + email: string; + firstName?: string; + lastName?: string; +} + +export function getUserName(user?: User, returnEmail?: boolean) { + return user && (user.email || (user.firstName && user.lastName)) + ? user.firstName && user.lastName + ? [user.firstName, user.lastName].join(" ") + : returnEmail + ? user.email + : user.email.split("@")[0] + : undefined; +} + +export function getUserInitials(user?: User) { + return user && (user.email || (user.firstName && user.lastName)) + ? (user.firstName && user.lastName + ? user.firstName[0] + user.lastName[0] + : user.email.slice(0, 2) + ).toUpperCase() + : undefined; +} + +export function createHref(url: string) { + return urlJoin(APP_MOUNT_URI, url); +} + +interface AnyEvent { + stopPropagation: () => void; +} +export function stopPropagation(cb: () => void) { + return (event: AnyEvent) => { + event.stopPropagation(); + cb(); + }; +} diff --git a/src/mutations.tsx b/src/mutations.tsx new file mode 100644 index 000000000..b4689bfea --- /dev/null +++ b/src/mutations.tsx @@ -0,0 +1,62 @@ +import { ApolloError } from "apollo-client"; +import { DocumentNode } from "graphql"; +import * as React from "react"; +import { + Mutation, + MutationFn, + MutationResult, + MutationUpdaterFn +} from "react-apollo"; + +import useNotifier from "./hooks/useNotifier"; +import i18n from "./i18n"; + +export interface TypedMutationInnerProps { + children: ( + mutateFn: MutationFn, + result: MutationResult + ) => React.ReactNode; + onCompleted?: (data: TData) => void; + onError?: (error: ApolloError) => void; + variables?: TVariables; +} + +export function TypedMutation( + mutation: DocumentNode, + update?: MutationUpdaterFn +) { + class StrictTypedMutation extends Mutation {} + return (props: TypedMutationInnerProps) => { + const notify = useNotifier(); + // Obviously, this is workaround to the problem described here: + // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/32588 + const { + children, + onCompleted, + onError, + variables + } = props as JSX.LibraryManagedAttributes< + typeof StrictTypedMutation, + typeof props + >; + return ( + { + const msg = i18n.t("Something went wrong: {{ message }}", { + message: err.message + }); + notify({ text: msg }); + if (onError) { + onError(err); + } + }} + variables={variables} + update={update} + > + {children} + + ); + }; +} diff --git a/src/navigation/components/MenuCreateDialog/MenuCreateDialog.tsx b/src/navigation/components/MenuCreateDialog/MenuCreateDialog.tsx new file mode 100644 index 000000000..1620b5b19 --- /dev/null +++ b/src/navigation/components/MenuCreateDialog/MenuCreateDialog.tsx @@ -0,0 +1,79 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import i18n from "../../../i18n"; + +export interface MenuCreateDialogFormData { + name: string; +} + +export interface MenuCreateDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + disabled: boolean; + open: boolean; + onClose: () => void; + onConfirm: (data: MenuCreateDialogFormData) => void; +} + +const initialForm: MenuCreateDialogFormData = { + name: "" +}; + +const MenuCreateDialog: React.FC = ({ + confirmButtonState, + disabled, + onClose, + onConfirm, + open +}) => ( + + + {i18n.t("Add Menu", { + context: "create menu modal window title" + })} + +
    + {({ change, data, errors: formErrors, submit }) => ( + <> + + + + + + + {i18n.t("Create")} + + + + )} +
    +
    +); + +MenuCreateDialog.displayName = "MenuCreateDialog"; +export default MenuCreateDialog; diff --git a/src/navigation/components/MenuCreateDialog/index.ts b/src/navigation/components/MenuCreateDialog/index.ts new file mode 100644 index 000000000..afef4b52e --- /dev/null +++ b/src/navigation/components/MenuCreateDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from './MenuCreateDialog'; +export * from './MenuCreateDialog'; \ No newline at end of file diff --git a/src/navigation/components/MenuDetailsPage/MenuDetailsPage.tsx b/src/navigation/components/MenuDetailsPage/MenuDetailsPage.tsx new file mode 100644 index 000000000..4ce143bb4 --- /dev/null +++ b/src/navigation/components/MenuDetailsPage/MenuDetailsPage.tsx @@ -0,0 +1,126 @@ +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { MenuDetails_menu } from "../../types/MenuDetails"; +import { MenuItemType } from "../MenuItemDialog"; +import MenuItems, { TreeOperation } from "../MenuItems"; +import MenuProperties from "../MenuProperties"; +import { computeTree } from "./tree"; + +export interface MenuDetailsFormData { + name: string; +} + +export interface MenuDetailsSubmitData extends MenuDetailsFormData { + operations: TreeOperation[]; +} + +export interface MenuDetailsPageProps { + saveButtonState: ConfirmButtonTransitionState; + disabled: boolean; + menu: MenuDetails_menu; + onBack: () => void; + onDelete: () => void; + onItemAdd: () => void; + onItemClick: (id: string, type: MenuItemType) => void; + onItemEdit: (id: string) => void; + onSubmit: (data: MenuDetailsSubmitData) => Promise; +} + +const MenuDetailsPage: React.StatelessComponent = ({ + disabled, + menu, + saveButtonState, + onBack, + onDelete, + onItemAdd, + onItemClick, + onItemEdit, + onSubmit +}) => { + const initialForm: MenuDetailsFormData = { + name: maybe(() => menu.name, "") + }; + + const [treeOperations, setTreeOperations] = React.useState( + [] + ); + + const handleSubmit = async (data: MenuDetailsFormData) => { + if ( + await onSubmit({ + name: data.name, + operations: treeOperations + }) + ) { + setTreeOperations([]); + } + }; + + const handleChange = (operation: TreeOperation) => { + if (!!operation) { + setTreeOperations([...treeOperations, operation]); + } + }; + + return ( +
    + {({ change, data, hasChanged, submit }) => ( + + {i18n.t("Navigation")} + +
    + {i18n.t("Navigation")} + + {i18n.t( + "Creating the navigation structure is done by dragging and dropping. Simply create a new menu item and then drag it into its destined place. You can move items inside one another to create a tree structure and drag items up and down to create a hierarchy" + )} + +
    +
    + + + 0} + items={maybe(() => + computeTree(menu.items, [...treeOperations]) + )} + onChange={handleChange} + onItemAdd={onItemAdd} + onItemClick={onItemClick} + onItemEdit={onItemEdit} + onUndo={() => + setTreeOperations( + treeOperations.slice(0, treeOperations.length - 1) + ) + } + /> +
    +
    + +
    + )} +
    + ); +}; +MenuDetailsPage.displayName = "MenuDetailsPage"; +export default MenuDetailsPage; diff --git a/src/navigation/components/MenuDetailsPage/__snapshots__/tree.test.ts.snap b/src/navigation/components/MenuDetailsPage/__snapshots__/tree.test.ts.snap new file mode 100644 index 000000000..496636b91 --- /dev/null +++ b/src/navigation/components/MenuDetailsPage/__snapshots__/tree.test.ts.snap @@ -0,0 +1,57 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Properly computes trees # 1`] = ` +" +Accessories +··Jewelry +··Glasses +Groceries +Apparel" +`; + +exports[`Properly computes trees # 2`] = ` +" +Groceries +··Accessories +····Jewelry +······Glasses +Apparel" +`; + +exports[`Properly computes trees # 3`] = ` +" +Apparel +··Groceries +····Accessories +······Jewelry +········Glasses" +`; + +exports[`Properly computes trees # 4`] = ` +" +Accessories +Glasses +Jewelry +··Groceries +····Apparel" +`; + +exports[`Properly computes trees # 5`] = ` +" +Jewelry +··Groceries +Glasses +··Apparel +····Accessories" +`; + +exports[`Properly computes trees # 6`] = ` +" +Groceries +Apparel" +`; + +exports[`Properly computes trees # 7`] = ` +" +Apparel" +`; diff --git a/src/navigation/components/MenuDetailsPage/index.ts b/src/navigation/components/MenuDetailsPage/index.ts new file mode 100644 index 000000000..3ebbd4695 --- /dev/null +++ b/src/navigation/components/MenuDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from './MenuDetailsPage'; +export * from './MenuDetailsPage'; \ No newline at end of file diff --git a/src/navigation/components/MenuDetailsPage/tree.test.ts b/src/navigation/components/MenuDetailsPage/tree.test.ts new file mode 100644 index 000000000..5464565a3 --- /dev/null +++ b/src/navigation/components/MenuDetailsPage/tree.test.ts @@ -0,0 +1,185 @@ +import { menu } from "../../fixtures"; +import { MenuDetails_menu_items } from "../../types/MenuDetails"; +import { TreeOperation } from "../MenuItems"; +import { computeTree } from "./tree"; + +// Readability FTW +function innerTreeToString( + tree: MenuDetails_menu_items, + level: number +): string { + return ( + "\n" + + "··".repeat(level) + + tree.name + + tree.children.reduce( + (acc, node) => acc + innerTreeToString(node, level + 1), + "" + ) + ); +} +function treeToString(tree: MenuDetails_menu_items[]): string { + return tree.reduce((acc, node) => acc + innerTreeToString(node, 0), ""); +} + +describe("Properly computes trees", () => { + const testTable: TreeOperation[][] = [ + [], + [ + { id: "1glasses", parentId: "0jewelry", sortOrder: 0, type: "move" }, + { + id: "2accessories", + parentId: "3groceries", + sortOrder: 0, + type: "move" + } + ], + [ + { id: "1glasses", parentId: "0jewelry", sortOrder: 0, type: "move" }, + { + id: "2accessories", + parentId: "3groceries", + sortOrder: 0, + type: "move" + }, + { + id: "3groceries", + parentId: "4apparel", + sortOrder: 0, + type: "move" + } + ], + [ + { id: "0jewelry", sortOrder: 1, type: "move" }, + { id: "1glasses", sortOrder: 1, type: "move" }, + { + id: "4apparel", + parentId: "3groceries", + sortOrder: 0, + type: "move" + }, + { + id: "3groceries", + parentId: "0jewelry", + sortOrder: 0, + type: "move" + }, + { id: "0jewelry", parentId: "1glasses", sortOrder: 0, type: "move" }, + { + id: "1glasses", + parentId: "2accessories", + sortOrder: 0, + type: "move" + }, + { id: "1glasses", sortOrder: 1, type: "move" }, + { id: "0jewelry", sortOrder: 2, type: "move" } + ], + [ + { id: "1glasses", sortOrder: 1, type: "move" }, + { id: "1glasses", parentId: "0jewelry", sortOrder: 0, type: "move" }, + { id: "0jewelry", sortOrder: 1, type: "move" }, + { + id: "0jewelry", + parentId: "2accessories", + sortOrder: 0, + type: "move" + }, + { id: "3groceries", sortOrder: 0, type: "move" }, + { + id: "2accessories", + parentId: "3groceries", + sortOrder: 0, + type: "move" + }, + { id: "2accessories", sortOrder: 1, type: "move" }, + { id: "0jewelry", sortOrder: 2, type: "move" }, + { id: "1glasses", sortOrder: 3, type: "move" }, + { id: "4apparel", sortOrder: 0, type: "move" }, + { id: "1glasses", sortOrder: 1, type: "move" }, + { id: "2accessories", sortOrder: 0, type: "move" }, + { + id: "4apparel", + parentId: "2accessories", + sortOrder: 0, + type: "move" + }, + { + id: "3groceries", + parentId: "1glasses", + sortOrder: 0, + type: "move" + }, + { id: "0jewelry", sortOrder: 0, type: "move" }, + { + id: "0jewelry", + parentId: "2accessories", + sortOrder: 0, + type: "move" + }, + { + id: "4apparel", + parentId: "2accessories", + sortOrder: 0, + type: "move" + }, + { + id: "0jewelry", + parentId: "2accessories", + sortOrder: 0, + type: "move" + }, + { + id: "1glasses", + parentId: "2accessories", + sortOrder: 2, + type: "move" + }, + { + id: "0jewelry", + parentId: "2accessories", + sortOrder: 2, + type: "move" + }, + { + id: "1glasses", + parentId: "2accessories", + sortOrder: 2, + type: "move" + }, + { + id: "4apparel", + parentId: "2accessories", + sortOrder: 2, + type: "move" + }, + { + id: "3groceries", + parentId: "0jewelry", + sortOrder: 0, + type: "move" + }, + { id: "4apparel", parentId: "1glasses", sortOrder: 0, type: "move" }, + { id: "1glasses", sortOrder: 1, type: "move" }, + { id: "0jewelry", sortOrder: 1, type: "move" }, + { + id: "2accessories", + parentId: "4apparel", + sortOrder: 0, + type: "move" + } + ], + [{ id: "2accessories", type: "remove" }], + [ + { id: "2accessories", type: "remove" }, + { id: "4apparel", type: "move", sortOrder: 0 }, + { id: "3groceries", type: "remove" } + ] + ]; + + testTable.forEach(testData => + it("#", () => { + const computedTree = computeTree(menu.items, testData); + expect(treeToString(computedTree)).toMatchSnapshot(); + }) + ); +}); diff --git a/src/navigation/components/MenuDetailsPage/tree.ts b/src/navigation/components/MenuDetailsPage/tree.ts new file mode 100644 index 000000000..82658aeaa --- /dev/null +++ b/src/navigation/components/MenuDetailsPage/tree.ts @@ -0,0 +1,134 @@ +import { MenuDetails_menu_items } from "../../types/MenuDetails"; +import { TreeOperation } from "../MenuItems"; + +export function findNode(tree: MenuDetails_menu_items[], id: string): number[] { + const foundNodeIndex = tree.findIndex(node => node.id === id); + if (tree.length === 0) { + return [null]; + } + if (foundNodeIndex !== -1) { + return [foundNodeIndex]; + } + const nodeMap = tree.map((node, nodeIndex) => [ + nodeIndex, + ...findNode(node.children, id) + ]); + return nodeMap.find(path => path[path.length - 1] !== null) || [null]; +} + +export function getNode( + tree: MenuDetails_menu_items[], + path: number[] +): MenuDetails_menu_items { + if (path.length === 1) { + return tree[path[0]]; + } + return getNode([...tree[path[0]].children], path.slice(1)); +} + +function removeNode( + tree: MenuDetails_menu_items[], + path: number[] +): MenuDetails_menu_items[] { + const removeIndex = path[0]; + + if (path.length === 1) { + return [...tree.slice(0, removeIndex), ...tree.slice(removeIndex + 1)]; + } + + const newTree = [...tree]; + newTree[removeIndex] = { + ...tree[path[0]], + children: removeNode(tree[path[0]].children, path.slice(1)) + }; + + return newTree; +} + +function insertNode( + tree: MenuDetails_menu_items[], + path: number[], + node: MenuDetails_menu_items, + position: number +): MenuDetails_menu_items[] { + if (path.length === 0) { + return [...tree.slice(0, position), node, ...tree.slice(position)]; + } + + if (path[0] in tree) { + tree[path[0]].children = insertNode( + tree[path[0]].children, + path.slice(1), + node, + position + ); + } + return tree; +} + +function removeNodeAndChildren( + tree: MenuDetails_menu_items[], + operation: TreeOperation +): MenuDetails_menu_items[] { + const sourcePath = findNode(tree, operation.id); + const node = getNode(tree, sourcePath); + + if (node.children) { + const treeAfterChildrenRemoval = node.children.reduce( + (acc, child) => + removeNodeAndChildren(acc, { + id: child.id, + type: "remove" + }), + tree + ); + + return removeNode(treeAfterChildrenRemoval, sourcePath); + } + + return removeNode(tree, sourcePath); +} + +function permuteNode( + tree: MenuDetails_menu_items[], + permutation: TreeOperation +): MenuDetails_menu_items[] { + const sourcePath = findNode(tree, permutation.id); + const node = getNode(tree, sourcePath); + + const treeAfterRemoval = removeNode(tree, sourcePath); + + const targetPath = permutation.parentId + ? findNode(treeAfterRemoval, permutation.parentId) + : []; + + const treeAfterInsertion = insertNode( + treeAfterRemoval, + targetPath, + node, + permutation.sortOrder + ); + + return treeAfterInsertion; +} + +function executeOperation( + tree: MenuDetails_menu_items[], + operation: TreeOperation +): MenuDetails_menu_items[] { + return operation.type === "move" + ? permuteNode(tree, operation) + : removeNodeAndChildren(tree, operation); +} + +export function computeTree( + tree: MenuDetails_menu_items[], + operations: TreeOperation[] +) { + const newTree = operations.reduce( + (acc, operation) => executeOperation(acc, operation), + // FIXME: 😡 + JSON.parse(JSON.stringify(tree)) + ); + return newTree; +} diff --git a/src/navigation/components/MenuItemDialog/MenuItemDialog.tsx b/src/navigation/components/MenuItemDialog/MenuItemDialog.tsx new file mode 100644 index 000000000..6cb3f59ec --- /dev/null +++ b/src/navigation/components/MenuItemDialog/MenuItemDialog.tsx @@ -0,0 +1,268 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import TextField from "@material-ui/core/TextField"; +import * as isUrl from "is-url"; +import * as React from "react"; + +import AutocompleteSelectMenu from "@saleor/components/AutocompleteSelectMenu"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import FormSpacer from "@saleor/components/FormSpacer"; +import { SearchCategories_categories_edges_node } from "../../../containers/SearchCategories/types/SearchCategories"; +import { SearchCollections_collections_edges_node } from "../../../containers/SearchCollections/types/SearchCollections"; +import { SearchPages_pages_edges_node } from "../../../containers/SearchPages/types/SearchPages"; +import i18n from "../../../i18n"; +import { getMenuItemByValue, IMenu } from "../../../utils/menu"; + +export type MenuItemType = "category" | "collection" | "link" | "page"; +export interface MenuItemData { + id: string; + type: MenuItemType; +} + +export interface MenuItemDialogFormData extends MenuItemData { + name: string; +} + +export interface MenuItemDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + disabled: boolean; + initial?: MenuItemDialogFormData; + initialDisplayValue?: string; + loading: boolean; + open: boolean; + collections: SearchCollections_collections_edges_node[]; + categories: SearchCategories_categories_edges_node[]; + pages: SearchPages_pages_edges_node[]; + onClose: () => void; + onSubmit: (data: MenuItemDialogFormData) => void; + onQueryChange: (query: string) => void; +} + +const defaultInitial: MenuItemDialogFormData = { + id: "", + name: "", + type: "category" +}; + +function getMenuItemData(value: string): MenuItemData { + const [type, ...idParts] = value.split(":"); + return { + id: idParts.join(":"), + type: type as MenuItemType + }; +} + +function getDisplayValue(menu: IMenu, value: string): string { + const menuItemData = getMenuItemData(value); + if (menuItemData.type === "link") { + return menuItemData.id; + } + return getMenuItemByValue(menu, value).label.toString(); +} + +const MenuItemDialog: React.StatelessComponent = ({ + confirmButtonState, + disabled, + initial, + initialDisplayValue, + loading, + onClose, + onSubmit, + onQueryChange, + open, + categories, + collections, + pages +}) => { + const [displayValue, setDisplayValue] = React.useState( + initialDisplayValue || "" + ); + const [url, setUrl] = React.useState(undefined); + + // Refresh initial display value if changed + React.useEffect(() => setDisplayValue(initialDisplayValue), [ + initialDisplayValue + ]); + + // Reset input state after closing dialog + React.useEffect(() => { + setDisplayValue(initialDisplayValue); + setUrl(undefined); + }, [open]); + + let options: IMenu = []; + + if (categories.length > 0) { + options = [ + ...options, + { + children: categories.map(category => ({ + children: [], + data: {}, + label: category.name, + value: "category:" + category.id + })), + data: {}, + label: i18n.t("Categories") + } + ]; + } + + if (collections.length > 0) { + options = [ + ...options, + { + children: collections.map(collection => ({ + children: [], + data: {}, + label: collection.name, + value: "collection:" + collection.id + })), + data: {}, + label: i18n.t("Collections") + } + ]; + } + + if (pages.length > 0) { + options = [ + ...options, + { + children: pages.map(page => ({ + children: [], + data: {}, + label: page.title, + value: "page:" + page.id + })), + data: {}, + label: i18n.t("Pages") + } + ]; + } + + if (url) { + options = [ + { + children: [], + data: {}, + label: ( +
    {{ url }}", { + context: "add link to navigation", + url + }) + }} + /> + ), + value: "link:" + url + } + ]; + } + + const handleQueryChange = (query: string) => { + if (isUrl(query)) { + setUrl(query); + } else if (isUrl("http://" + query)) { + setUrl("http://" + query); + } else if (url) { + setUrl(undefined); + } + onQueryChange(query); + }; + + return ( + + + {i18n.t("Add Item", { + context: "create new menu item" + })} + +
    + {({ change, data, submit }) => { + const handleSelectChange = (event: React.ChangeEvent) => { + const value = event.target.value; + const menuItemData = getMenuItemData(value); + change( + { + target: { + name: "id", + value: menuItemData.id + } + } as any, + () => + change( + { + target: { + name: "type", + value: menuItemData.type + } + } as any, + () => setDisplayValue(getDisplayValue(options, value)) + ) + ); + }; + + return ( + <> + + + + + + + + + {i18n.t("Submit", { context: "button" })} + + + + ); + }} + +
    + ); +}; +MenuItemDialog.displayName = "MenuItemDialog"; +export default MenuItemDialog; diff --git a/src/navigation/components/MenuItemDialog/index.ts b/src/navigation/components/MenuItemDialog/index.ts new file mode 100644 index 000000000..843bfb062 --- /dev/null +++ b/src/navigation/components/MenuItemDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./MenuItemDialog"; +export * from "./MenuItemDialog"; diff --git a/src/navigation/components/MenuItems/MenuItems.tsx b/src/navigation/components/MenuItems/MenuItems.tsx new file mode 100644 index 000000000..715e29e65 --- /dev/null +++ b/src/navigation/components/MenuItems/MenuItems.tsx @@ -0,0 +1,279 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardActions from "@material-ui/core/CardActions"; +import IconButton from "@material-ui/core/IconButton"; +import Paper from "@material-ui/core/Paper"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import DeleteIcon from "@material-ui/icons/Delete"; +import EditIcon from "@material-ui/icons/Edit"; +import classNames from "classnames"; +import * as React from "react"; +import SortableTree, { NodeRendererProps, TreeItem } from "react-sortable-tree"; + +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import useTheme from "@saleor/hooks/useTheme"; +import i18n from "../../../i18n"; +import Draggable from "../../../icons/Draggable"; +import { MenuDetails_menu_items } from "../../types/MenuDetails"; +import { MenuItemType } from "../MenuItemDialog"; +import { getDiff, getNodeData, getNodeQuantity, TreeOperation } from "./tree"; + +const NODE_HEIGHT = 56; +const NODE_MARGIN = 40; + +export interface MenuItemsProps { + canUndo: boolean; + items: MenuDetails_menu_items[]; + onChange: (operation: TreeOperation) => void; + onItemAdd: () => void; + onItemClick: (id: string, type: MenuItemType) => void; + onItemEdit: (id: string) => void; + onUndo: () => void; +} + +const styles = (theme: Theme) => + createStyles({ + actions: { + flexDirection: "row" + }, + container: { + background: theme.palette.grey[200] + }, + darkContainer: { + background: `${theme.palette.grey[800]} !important` + }, + deleteButton: { + marginRight: theme.spacing.unit + }, + dragIcon: { + cursor: "grab" + }, + nodeTitle: { + cursor: "pointer", + marginLeft: theme.spacing.unit * 7 + }, + root: { + "& .rst__collapseButton": { + display: "none" + }, + "& .rst__node": { + "&:first-of-type": { + "& $row": { + borderTop: `1px ${theme.overrides.MuiCard.root.borderColor} solid` + } + } + } + }, + row: { + alignItems: "center", + background: theme.palette.background.paper, + borderBottom: `1px ${theme.overrides.MuiCard.root.borderColor} solid`, + borderRadius: 0, + display: "flex", + flexDirection: "row", + height: NODE_HEIGHT, + justifyContent: "flex-start", + paddingLeft: theme.spacing.unit * 3 + }, + rowContainer: { + "& > *": { + opacity: 1, + transition: `opacity ${theme.transitions.duration.standard}ms` + }, + transition: `margin ${theme.transitions.duration.standard}ms` + }, + rowContainerDragged: { + "&$rowContainer": { + "&:before": { + background: theme.palette.background.paper, + border: `1px solid ${theme.palette.primary.main}`, + borderRadius: "100%", + content: "''", + height: 7, + left: 0, + position: "absolute", + top: -3, + width: 7 + }, + borderTop: `1px solid ${theme.palette.primary.main}`, + height: 0, + position: "relative", + top: -1 + } + }, + rowContainerPlaceholder: { + opacity: 0 + }, + spacer: { + flex: 1 + } + }); + +const Placeholder = withStyles(styles, { + name: "Placeholder" +})(({ classes }: WithStyles) => ( + + + {i18n.t("Add new menu item to begin creating menu")} + + +)); + +const Node = withStyles(styles, { + name: "Node" +})( + ({ + classes, + node, + path, + connectDragPreview, + connectDragSource, + isDragging + }: NodeRendererProps & WithStyles) => { + const draggedClassName = classNames( + classes.rowContainer, + classes.rowContainerDragged + ); + const defaultClassName = isDragging + ? draggedClassName + : classes.rowContainer; + const placeholderClassName = classNames( + classes.rowContainer, + classes.rowContainerPlaceholder + ); + + const [className, setClassName] = React.useState(defaultClassName); + React.useEffect(() => setClassName(defaultClassName), [isDragging]); + + const handleDragStart = () => { + setClassName(placeholderClassName); + setTimeout(() => setClassName(defaultClassName), 0); + }; + + return connectDragPreview( +
    + + {connectDragSource( +
    + +
    + )} + + {node.title} + +
    + + + + + + node.onChange({ + id: node.id as any, + type: "remove" + }) + } + > + + + +
    + ); + } +); + +const MenuItems = withStyles(styles, { name: "MenuItems" })( + ({ + canUndo, + classes, + items, + onChange, + onItemAdd, + onItemClick, + onItemEdit, + onUndo + }: MenuItemsProps & WithStyles) => { + const { isDark } = useTheme(); + + return ( + + + {i18n.t("Undo")} + + } + /> +
    + {items === undefined ? ( + + ) : ( + ({ + className: classes.row, + style: { + marginLeft: NODE_MARGIN * (path.length - 1) + } + })} + isVirtualized={false} + rowHeight={NODE_HEIGHT} + treeData={items.map(item => + getNodeData(item, onChange, onItemClick, onItemEdit) + )} + theme={{ + nodeContentRenderer: Node as any + }} + onChange={newTree => + onChange( + getDiff( + items.map(item => + getNodeData(item, onChange, onItemClick, onItemEdit) + ), + newTree as TreeItem[] + ) + ) + } + placeholderRenderer={Placeholder as any} + /> + )} +
    + + + +
    + ); + } +); +MenuItems.displayName = "MenuItems"; +export default MenuItems; diff --git a/src/navigation/components/MenuItems/__snapshots__/tree.test.ts.snap b/src/navigation/components/MenuItems/__snapshots__/tree.test.ts.snap new file mode 100644 index 000000000..f9bd083a0 --- /dev/null +++ b/src/navigation/components/MenuItems/__snapshots__/tree.test.ts.snap @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Properly computes diffs # 1`] = ` +Object { + "id": "1glasses", + "parentId": "0jewelry", + "sortOrder": 0, + "type": "move", +} +`; + +exports[`Properly computes diffs # 2`] = ` +Object { + "id": "1glasses", + "parentId": "2accessories", + "sortOrder": 0, + "type": "move", +} +`; + +exports[`Properly computes diffs # 3`] = ` +Object { + "id": "2accessories", + "parentId": "4apparel", + "sortOrder": 0, + "type": "move", +} +`; diff --git a/src/navigation/components/MenuItems/index.ts b/src/navigation/components/MenuItems/index.ts new file mode 100644 index 000000000..8f13d0b5a --- /dev/null +++ b/src/navigation/components/MenuItems/index.ts @@ -0,0 +1,3 @@ +export { default } from "./MenuItems"; +export * from "./MenuItems"; +export * from "./tree"; diff --git a/src/navigation/components/MenuItems/tree.test.ts b/src/navigation/components/MenuItems/tree.test.ts new file mode 100644 index 000000000..992790cd4 --- /dev/null +++ b/src/navigation/components/MenuItems/tree.test.ts @@ -0,0 +1,88 @@ +import { + addNodeUnderParent, + find, + insertNode, + removeNode, + TreeItem +} from "react-sortable-tree"; + +import { getDiff } from "./tree"; + +const originalTree: TreeItem[] = [ + { + children: [ + { children: [], expanded: true, id: "0jewelry", title: "Jewelry" }, + { children: [], expanded: true, id: "1glasses", title: "Glasses" } + ], + expanded: true, + id: "2accessories", + title: "Accessories" + }, + { children: [], expanded: true, id: "3groceries", title: "Groceries" }, + { children: [], expanded: true, id: "4apparel", title: "Apparel" } +]; + +function getNodeKey(node: any) { + return node.treeIndex; +} + +function moveNode( + tree: TreeItem[], + src: string, + target: string, + asChild: boolean +) { + const { matches: srcNodeCandidates } = find({ + getNodeKey, + searchMethod: ({ node }) => node.id === src, + treeData: tree + }); + const srcNodeData = srcNodeCandidates[0]; + + const treeAfterRemoval = removeNode({ + getNodeKey, + path: srcNodeData.path, + treeData: tree + }).treeData; + + const { matches: targetNodeCandidates } = find({ + getNodeKey, + searchMethod: ({ node }) => node.id === target, + treeData: treeAfterRemoval + }); + const targetNodeData = targetNodeCandidates[0]; + + const treeAfterInsertion = asChild + ? addNodeUnderParent({ + addAsFirstChild: true, + getNodeKey, + ignoreCollapsed: false, + newNode: srcNodeData.node, + parentKey: targetNodeData.treeIndex, + treeData: treeAfterRemoval + }).treeData + : insertNode({ + depth: targetNodeData.path.length, + getNodeKey, + minimumTreeIndex: targetNodeData.treeIndex, + newNode: srcNodeData.node, + treeData: treeAfterRemoval + }).treeData; + + return treeAfterInsertion as TreeItem[]; +} + +describe("Properly computes diffs", () => { + const testTable = [ + moveNode(originalTree, "1glasses", "0jewelry", true), + moveNode(originalTree, "1glasses", "0jewelry", false), + moveNode(originalTree, "2accessories", "4apparel", true) + ]; + + testTable.forEach(testData => + it("#", () => { + const diff = getDiff(originalTree, testData); + expect(diff).toMatchSnapshot(); + }) + ); +}); diff --git a/src/navigation/components/MenuItems/tree.ts b/src/navigation/components/MenuItems/tree.ts new file mode 100644 index 000000000..4923d2be4 --- /dev/null +++ b/src/navigation/components/MenuItems/tree.ts @@ -0,0 +1,117 @@ +import { getPatch } from "fast-array-diff"; +import { TreeItem } from "react-sortable-tree"; + +import { MenuDetails_menu_items } from "../../types/MenuDetails"; +import { MenuItemType } from "../MenuItemDialog"; + +export type TreeOperationType = "move" | "remove"; +export interface TreeOperation { + id: string; + type: TreeOperationType; + parentId?: string; + sortOrder?: number; +} + +export const unknownTypeError = Error("Unknown type"); + +function treeToMap(tree: TreeItem[], parent: string): Record { + const childrenList = tree.map(node => node.id); + const childrenMaps = tree.map(node => ({ + id: node.id, + mappedNodes: treeToMap(node.children as TreeItem[], node.id) + })); + + return { + [parent]: childrenList, + ...childrenMaps.reduce( + (acc, childMap) => ({ + ...acc, + ...childMap.mappedNodes + }), + {} + ) + }; +} + +export function getItemType(item: MenuDetails_menu_items): MenuItemType { + if (item.category) { + return "category"; + } else if (item.collection) { + return "collection"; + } else if (item.page) { + return "page"; + } else if (item.url) { + return "link"; + } else { + throw unknownTypeError; + } +} + +export function getItemId(item: MenuDetails_menu_items): string { + if (item.category) { + return item.category.id; + } else if (item.collection) { + return item.collection.id; + } else if (item.page) { + return item.page.id; + } else if (item.url) { + return item.url; + } else { + throw unknownTypeError; + } +} + +export function getDiff( + originalTree: TreeItem[], + newTree: TreeItem[] +): TreeOperation { + const originalMap = treeToMap(originalTree, "root"); + const newMap = treeToMap(newTree, "root"); + + const diff: TreeOperation[] = Object.keys(newMap).map(key => { + const originalNode = originalMap[key]; + const newNode = newMap[key]; + + const patch = getPatch(originalNode, newNode); + + if (patch.length > 0) { + const addedNode = patch.find(operation => operation.type === "add"); + if (!!addedNode) { + return { + id: addedNode.items[0], + parentId: key === "root" ? undefined : key, + sortOrder: addedNode.newPos, + type: "move" as TreeOperationType + }; + } + } + }); + + return diff.find(d => !!d); +} + +export function getNodeData( + item: MenuDetails_menu_items, + onChange: (operation: TreeOperation) => void, + onClick: (id: string, type: MenuItemType) => void, + onEdit: (id: string) => void +): TreeItem { + return { + children: item.children.map(child => + getNodeData(child, onChange, onClick, onEdit) + ), + expanded: true, + id: item.id, + onChange, + onClick: () => onClick(getItemId(item), getItemType(item)), + onEdit: () => onEdit(item.id), + title: item.name + }; +} + +export function getNodeQuantity(items: MenuDetails_menu_items[]): number { + return items.reduce( + (acc, curr) => acc + getNodeQuantity(curr.children), + items.length + ); +} diff --git a/src/navigation/components/MenuList/MenuList.tsx b/src/navigation/components/MenuList/MenuList.tsx new file mode 100644 index 000000000..2fb39843d --- /dev/null +++ b/src/navigation/components/MenuList/MenuList.tsx @@ -0,0 +1,143 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import IconButtonTableCell from "@saleor/components/IconButtonTableCell"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { MenuList_menus_edges_node } from "../../types/MenuList"; + +export interface MenuListProps extends ListProps, ListActions { + menus: MenuList_menus_edges_node[]; + onDelete: (id: string) => void; +} + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colItems: { + width: 200 + }, + colTitle: {} + }, + colItems: { + textAlign: "right" + }, + colTitle: {}, + row: { + cursor: "pointer" + } + }); +const MenuList = withStyles(styles, { name: "MenuList" })( + ({ + classes, + disabled, + isChecked, + menus, + onDelete, + onNextPage, + onPreviousPage, + onRowClick, + pageInfo, + selected, + toggle, + toggleAll, + toolbar + }: MenuListProps & WithStyles) => ( + + + + + {i18n.t("Menu Title", { context: "object" })} + + + {i18n.t("Items", { context: "number of menu items" })} + + + + + + + + + {renderCollection( + menus, + menu => { + const isSelected = menu ? isChecked(menu.id) : false; + + return ( + + + toggle(menu.id)} + /> + + + {maybe(() => menu.name, )} + + + {maybe( + () => menu.items.length, + + )} + + onDelete(menu.id)} + > + + + + ); + }, + () => ( + + {i18n.t("No menus found")} + + ) + )} + +
    +
    + ) +); +MenuList.displayName = "MenuList"; +export default MenuList; diff --git a/src/navigation/components/MenuList/index.ts b/src/navigation/components/MenuList/index.ts new file mode 100644 index 000000000..298313288 --- /dev/null +++ b/src/navigation/components/MenuList/index.ts @@ -0,0 +1,2 @@ +export { default } from './MenuList'; +export * from './MenuList'; \ No newline at end of file diff --git a/src/navigation/components/MenuListPage/MenuListPage.tsx b/src/navigation/components/MenuListPage/MenuListPage.tsx new file mode 100644 index 000000000..49c3df930 --- /dev/null +++ b/src/navigation/components/MenuListPage/MenuListPage.tsx @@ -0,0 +1,41 @@ +import Button from "@material-ui/core/Button"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { MenuList_menus_edges_node } from "../../types/MenuList"; +import MenuList from "../MenuList"; + +export interface MenuListPageProps extends PageListProps, ListActions { + menus: MenuList_menus_edges_node[]; + onBack: () => void; + onDelete: (id: string) => void; +} + +const MenuListPage: React.StatelessComponent = ({ + disabled, + onAdd, + onBack, + ...listProps +}) => ( + + {i18n.t("Configuration")} + + + + + +); +MenuListPage.displayName = "MenuListPage"; +export default MenuListPage; diff --git a/src/navigation/components/MenuListPage/index.ts b/src/navigation/components/MenuListPage/index.ts new file mode 100644 index 000000000..eac89a2b2 --- /dev/null +++ b/src/navigation/components/MenuListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from './MenuListPage'; +export * from './MenuListPage'; \ No newline at end of file diff --git a/src/navigation/components/MenuProperties/MenuProperties.tsx b/src/navigation/components/MenuProperties/MenuProperties.tsx new file mode 100644 index 000000000..15436c793 --- /dev/null +++ b/src/navigation/components/MenuProperties/MenuProperties.tsx @@ -0,0 +1,36 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; +import { MenuDetailsFormData } from "../MenuDetailsPage"; + +export interface MenuPropertiesProps { + data: MenuDetailsFormData; + disabled: boolean; + onChange: (event: React.ChangeEvent) => void; +} + +const MenuProperties: React.StatelessComponent = ({ + data, + disabled, + onChange +}) => ( + + + + + + +); +MenuProperties.displayName = "MenuProperties"; +export default MenuProperties; diff --git a/src/navigation/components/MenuProperties/index.ts b/src/navigation/components/MenuProperties/index.ts new file mode 100644 index 000000000..cbbaabac0 --- /dev/null +++ b/src/navigation/components/MenuProperties/index.ts @@ -0,0 +1,2 @@ +export { default } from './MenuProperties'; +export * from './MenuProperties'; \ No newline at end of file diff --git a/src/navigation/fixtures.ts b/src/navigation/fixtures.ts new file mode 100644 index 000000000..b21e5b2b5 --- /dev/null +++ b/src/navigation/fixtures.ts @@ -0,0 +1,113 @@ +import { MenuDetails_menu } from "./types/MenuDetails"; +import { MenuList_menus_edges_node } from "./types/MenuList"; + +export const menuList: MenuList_menus_edges_node[] = [ + { + __typename: "Menu", + id: "TWVudTox", + items: [ + { id: "TWVudUl0ZW06MQ==", __typename: "MenuItem" }, + { id: "TWVudUl0ZW06Mg==", __typename: "MenuItem" }, + { id: "TWVudUl0ZW06Mw==", __typename: "MenuItem" } + ], + name: "navbar" + }, + { + __typename: "Menu", + id: "TWVudToy", + items: [ + { id: "TWVudUl0ZW06NA==", __typename: "MenuItem" }, + { id: "TWVudUl0ZW06Nw==", __typename: "MenuItem" } + ], + name: "footer" + } +]; + +export const menu: MenuDetails_menu = { + __typename: "Menu", + id: "TWVudTox", + items: [ + { + __typename: "MenuItem", + category: { + __typename: "Category", + id: "Q2F0ZWdvcnk6Nw==", + name: "Accessories" + }, + children: [ + { + __typename: "MenuItem", + category: { + __typename: "Category", + id: "Q2F0ZWdvcnk6OAX==", + name: "Jewelry" + }, + children: [], + collection: null, + id: "0jewelry", + level: 0, + name: "Jewelry", + page: null, + sortOrder: 0, + url: null + }, + { + __typename: "MenuItem", + category: { + __typename: "Category", + id: "Q2F0ZWdvcnk6OQX==", + name: "Glasses" + }, + children: [], + collection: null, + id: "1glasses", + level: 0, + name: "Glasses", + page: null, + sortOrder: 1, + url: null + } + ], + collection: null, + id: "2accessories", + level: 0, + name: "Accessories", + page: null, + sortOrder: 0, + url: null + }, + { + __typename: "MenuItem", + category: { + __typename: "Category", + id: "Q2F0ZWdvcnk6OA==", + name: "Groceries" + }, + children: [], + collection: null, + id: "3groceries", + level: 0, + name: "Groceries", + page: null, + sortOrder: 1, + url: null + }, + { + __typename: "MenuItem", + category: { + __typename: "Category", + id: "Q2F0ZWdvcnk6OQ==", + name: "Apparel" + }, + children: [], + collection: null, + id: "4apparel", + level: 0, + name: "Apparel", + page: null, + sortOrder: 2, + url: null + } + ], + name: "navbar" +}; diff --git a/src/navigation/index.tsx b/src/navigation/index.tsx new file mode 100644 index 000000000..46ea8411c --- /dev/null +++ b/src/navigation/index.tsx @@ -0,0 +1,34 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { menuListPath, menuPath } from "./urls"; +import MenuDetailsComponent from "./views/MenuDetails"; +import MenuListComponent from "./views/MenuList"; + +const MenuList: React.FC> = ({ location }) => { + const qs = parseQs(location.search.substr(1)); + return ; +}; + +const MenuDetails: React.FC> = ({ + location, + match +}) => { + const qs = parseQs(location.search.substr(1)); + return ( + + ); +}; + +const NavigationRouter: React.FC = () => ( + + + + +); + +export default NavigationRouter; diff --git a/src/navigation/mutations.ts b/src/navigation/mutations.ts new file mode 100644 index 000000000..e678c93ae --- /dev/null +++ b/src/navigation/mutations.ts @@ -0,0 +1,143 @@ +import gql from "graphql-tag"; +import { TypedMutation } from "../mutations"; +import { menuItemFragment, menuItemNestedFragment } from "./queries"; +import { + MenuBulkDelete, + MenuBulkDeleteVariables +} from "./types/MenuBulkDelete"; +import { MenuCreate, MenuCreateVariables } from "./types/MenuCreate"; +import { MenuDelete, MenuDeleteVariables } from "./types/MenuDelete"; +import { + MenuItemCreate, + MenuItemCreateVariables +} from "./types/MenuItemCreate"; +import { + MenuItemUpdate, + MenuItemUpdateVariables +} from "./types/MenuItemUpdate"; +import { MenuUpdate, MenuUpdateVariables } from "./types/MenuUpdate"; + +const menuCreate = gql` + mutation MenuCreate($input: MenuCreateInput!) { + menuCreate(input: $input) { + errors { + field + message + } + menu { + id + } + } + } +`; +export const MenuCreateMutation = TypedMutation< + MenuCreate, + MenuCreateVariables +>(menuCreate); + +const menuBulkDelete = gql` + mutation MenuBulkDelete($ids: [ID]!) { + menuBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const MenuBulkDeleteMutation = TypedMutation< + MenuBulkDelete, + MenuBulkDeleteVariables +>(menuBulkDelete); + +const menuDelete = gql` + mutation MenuDelete($id: ID!) { + menuDelete(id: $id) { + errors { + field + message + } + } + } +`; +export const MenuDeleteMutation = TypedMutation< + MenuDelete, + MenuDeleteVariables +>(menuDelete); + +const menuItemCreate = gql` + ${menuItemNestedFragment} + mutation MenuItemCreate($input: MenuItemCreateInput!) { + menuItemCreate(input: $input) { + errors { + field + message + } + menuItem { + menu { + id + items { + ...MenuItemNestedFragment + } + } + } + } + } +`; +export const MenuItemCreateMutation = TypedMutation< + MenuItemCreate, + MenuItemCreateVariables +>(menuItemCreate); + +const menuUpdate = gql` + mutation MenuUpdate( + $id: ID! + $name: String! + $moves: [MenuItemMoveInput]! + $removeIds: [ID]! + ) { + menuUpdate(id: $id, input: { name: $name }) { + errors { + field + message + } + } + + menuItemMove(menu: $id, moves: $moves) { + errors { + field + message + } + } + + menuItemBulkDelete(ids: $removeIds) { + errors { + field + message + } + } + } +`; +export const MenuUpdateMutation = TypedMutation< + MenuUpdate, + MenuUpdateVariables +>(menuUpdate); + +const menuItemUpdate = gql` + ${menuItemFragment} + mutation MenuItemUpdate($id: ID!, $input: MenuItemInput!) { + menuItemUpdate(id: $id, input: $input) { + errors { + field + message + } + menuItem { + ...MenuItemFragment + } + } + } +`; +export const MenuItemUpdateMutation = TypedMutation< + MenuItemUpdate, + MenuItemUpdateVariables +>(menuItemUpdate); diff --git a/src/navigation/queries.ts b/src/navigation/queries.ts new file mode 100644 index 000000000..bb26c976b --- /dev/null +++ b/src/navigation/queries.ts @@ -0,0 +1,103 @@ +import gql from "graphql-tag"; +import { pageInfoFragment, TypedQuery } from "../queries"; +import { MenuDetails, MenuDetailsVariables } from "./types/MenuDetails"; +import { MenuList, MenuListVariables } from "./types/MenuList"; + +export const menuFragment = gql` + fragment MenuFragment on Menu { + id + name + items { + id + } + } +`; + +export const menuItemFragment = gql` + fragment MenuItemFragment on MenuItem { + category { + id + name + } + collection { + id + name + } + id + level + name + page { + id + title + } + sortOrder + url + } +`; + +// GraphQL does not support recurive fragments +export const menuItemNestedFragment = gql` + ${menuItemFragment} + fragment MenuItemNestedFragment on MenuItem { + ...MenuItemFragment + children { + ...MenuItemFragment + children { + ...MenuItemFragment + children { + ...MenuItemFragment + children { + ...MenuItemFragment + children { + ...MenuItemFragment + children { + ...MenuItemFragment + } + } + } + } + } + } + } +`; + +export const menuDetailsFragment = gql` + ${menuItemNestedFragment} + fragment MenuDetailsFragment on Menu { + id + items { + ...MenuItemNestedFragment + } + name + } +`; + +const menuList = gql` + ${menuFragment} + ${pageInfoFragment} + query MenuList($first: Int, $after: String, $last: Int, $before: String) { + menus(first: $first, after: $after, before: $before, last: $last) { + edges { + node { + ...MenuFragment + } + } + pageInfo { + ...PageInfoFragment + } + } + } +`; +export const MenuListQuery = TypedQuery(menuList); + +const menuDetails = gql` + ${menuDetailsFragment} + query MenuDetails($id: ID!) { + menu(id: $id) { + ...MenuDetailsFragment + } + } +`; +export const MenuDetailsQuery = TypedQuery( + menuDetails +); diff --git a/src/navigation/types/MenuBulkDelete.ts b/src/navigation/types/MenuBulkDelete.ts new file mode 100644 index 000000000..b253b78b9 --- /dev/null +++ b/src/navigation/types/MenuBulkDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: MenuBulkDelete +// ==================================================== + +export interface MenuBulkDelete_menuBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface MenuBulkDelete_menuBulkDelete { + __typename: "MenuBulkDelete"; + errors: MenuBulkDelete_menuBulkDelete_errors[] | null; +} + +export interface MenuBulkDelete { + menuBulkDelete: MenuBulkDelete_menuBulkDelete | null; +} + +export interface MenuBulkDeleteVariables { + ids: (string | null)[]; +} diff --git a/src/navigation/types/MenuCreate.ts b/src/navigation/types/MenuCreate.ts new file mode 100644 index 000000000..77613e784 --- /dev/null +++ b/src/navigation/types/MenuCreate.ts @@ -0,0 +1,34 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { MenuCreateInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: MenuCreate +// ==================================================== + +export interface MenuCreate_menuCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface MenuCreate_menuCreate_menu { + __typename: "Menu"; + id: string; +} + +export interface MenuCreate_menuCreate { + __typename: "MenuCreate"; + errors: MenuCreate_menuCreate_errors[] | null; + menu: MenuCreate_menuCreate_menu | null; +} + +export interface MenuCreate { + menuCreate: MenuCreate_menuCreate | null; +} + +export interface MenuCreateVariables { + input: MenuCreateInput; +} diff --git a/src/navigation/types/MenuDelete.ts b/src/navigation/types/MenuDelete.ts new file mode 100644 index 000000000..c5cf072b5 --- /dev/null +++ b/src/navigation/types/MenuDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: MenuDelete +// ==================================================== + +export interface MenuDelete_menuDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface MenuDelete_menuDelete { + __typename: "MenuDelete"; + errors: MenuDelete_menuDelete_errors[] | null; +} + +export interface MenuDelete { + menuDelete: MenuDelete_menuDelete | null; +} + +export interface MenuDeleteVariables { + id: string; +} diff --git a/src/navigation/types/MenuDetails.ts b/src/navigation/types/MenuDetails.ts new file mode 100644 index 000000000..8fd223984 --- /dev/null +++ b/src/navigation/types/MenuDetails.ts @@ -0,0 +1,238 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: MenuDetails +// ==================================================== + +export interface MenuDetails_menu_items_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetails_menu_items_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetails_menu_items_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetails_menu_items_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetails_menu_items_children_children_children_children_children_children { + __typename: "MenuItem"; + category: MenuDetails_menu_items_children_children_children_children_children_children_category | null; + collection: MenuDetails_menu_items_children_children_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetails_menu_items_children_children_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; +} + +export interface MenuDetails_menu_items_children_children_children_children_children { + __typename: "MenuItem"; + category: MenuDetails_menu_items_children_children_children_children_children_category | null; + collection: MenuDetails_menu_items_children_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetails_menu_items_children_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetails_menu_items_children_children_children_children_children_children | null)[] | null; +} + +export interface MenuDetails_menu_items_children_children_children_children { + __typename: "MenuItem"; + category: MenuDetails_menu_items_children_children_children_children_category | null; + collection: MenuDetails_menu_items_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetails_menu_items_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetails_menu_items_children_children_children_children_children | null)[] | null; +} + +export interface MenuDetails_menu_items_children_children_children { + __typename: "MenuItem"; + category: MenuDetails_menu_items_children_children_children_category | null; + collection: MenuDetails_menu_items_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetails_menu_items_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetails_menu_items_children_children_children_children | null)[] | null; +} + +export interface MenuDetails_menu_items_children_children { + __typename: "MenuItem"; + category: MenuDetails_menu_items_children_children_category | null; + collection: MenuDetails_menu_items_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetails_menu_items_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetails_menu_items_children_children_children | null)[] | null; +} + +export interface MenuDetails_menu_items_children { + __typename: "MenuItem"; + category: MenuDetails_menu_items_children_category | null; + collection: MenuDetails_menu_items_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetails_menu_items_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetails_menu_items_children_children | null)[] | null; +} + +export interface MenuDetails_menu_items { + __typename: "MenuItem"; + category: MenuDetails_menu_items_category | null; + collection: MenuDetails_menu_items_collection | null; + id: string; + level: number; + name: string; + page: MenuDetails_menu_items_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetails_menu_items_children | null)[] | null; +} + +export interface MenuDetails_menu { + __typename: "Menu"; + id: string; + items: (MenuDetails_menu_items | null)[] | null; + name: string; +} + +export interface MenuDetails { + menu: MenuDetails_menu | null; +} + +export interface MenuDetailsVariables { + id: string; +} diff --git a/src/navigation/types/MenuDetailsFragment.ts b/src/navigation/types/MenuDetailsFragment.ts new file mode 100644 index 000000000..1f1d4d545 --- /dev/null +++ b/src/navigation/types/MenuDetailsFragment.ts @@ -0,0 +1,230 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: MenuDetailsFragment +// ==================================================== + +export interface MenuDetailsFragment_items_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetailsFragment_items_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetailsFragment_items_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetailsFragment_items_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuDetailsFragment_items_children_children_children_children_children_children { + __typename: "MenuItem"; + category: MenuDetailsFragment_items_children_children_children_children_children_children_category | null; + collection: MenuDetailsFragment_items_children_children_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetailsFragment_items_children_children_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; +} + +export interface MenuDetailsFragment_items_children_children_children_children_children { + __typename: "MenuItem"; + category: MenuDetailsFragment_items_children_children_children_children_children_category | null; + collection: MenuDetailsFragment_items_children_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetailsFragment_items_children_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetailsFragment_items_children_children_children_children_children_children | null)[] | null; +} + +export interface MenuDetailsFragment_items_children_children_children_children { + __typename: "MenuItem"; + category: MenuDetailsFragment_items_children_children_children_children_category | null; + collection: MenuDetailsFragment_items_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetailsFragment_items_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetailsFragment_items_children_children_children_children_children | null)[] | null; +} + +export interface MenuDetailsFragment_items_children_children_children { + __typename: "MenuItem"; + category: MenuDetailsFragment_items_children_children_children_category | null; + collection: MenuDetailsFragment_items_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetailsFragment_items_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetailsFragment_items_children_children_children_children | null)[] | null; +} + +export interface MenuDetailsFragment_items_children_children { + __typename: "MenuItem"; + category: MenuDetailsFragment_items_children_children_category | null; + collection: MenuDetailsFragment_items_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetailsFragment_items_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetailsFragment_items_children_children_children | null)[] | null; +} + +export interface MenuDetailsFragment_items_children { + __typename: "MenuItem"; + category: MenuDetailsFragment_items_children_category | null; + collection: MenuDetailsFragment_items_children_collection | null; + id: string; + level: number; + name: string; + page: MenuDetailsFragment_items_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetailsFragment_items_children_children | null)[] | null; +} + +export interface MenuDetailsFragment_items { + __typename: "MenuItem"; + category: MenuDetailsFragment_items_category | null; + collection: MenuDetailsFragment_items_collection | null; + id: string; + level: number; + name: string; + page: MenuDetailsFragment_items_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuDetailsFragment_items_children | null)[] | null; +} + +export interface MenuDetailsFragment { + __typename: "Menu"; + id: string; + items: (MenuDetailsFragment_items | null)[] | null; + name: string; +} diff --git a/src/navigation/types/MenuFragment.ts b/src/navigation/types/MenuFragment.ts new file mode 100644 index 000000000..9b6f6fe99 --- /dev/null +++ b/src/navigation/types/MenuFragment.ts @@ -0,0 +1,19 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: MenuFragment +// ==================================================== + +export interface MenuFragment_items { + __typename: "MenuItem"; + id: string; +} + +export interface MenuFragment { + __typename: "Menu"; + id: string; + name: string; + items: (MenuFragment_items | null)[] | null; +} diff --git a/src/navigation/types/MenuItemCreate.ts b/src/navigation/types/MenuItemCreate.ts new file mode 100644 index 000000000..b993b610c --- /dev/null +++ b/src/navigation/types/MenuItemCreate.ts @@ -0,0 +1,256 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { MenuItemCreateInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: MenuItemCreate +// ==================================================== + +export interface MenuItemCreate_menuItemCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_children { + __typename: "MenuItem"; + category: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_children_category | null; + collection: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children { + __typename: "MenuItem"; + category: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_category | null; + collection: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children_children | null)[] | null; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children { + __typename: "MenuItem"; + category: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_category | null; + collection: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children_children | null)[] | null; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children { + __typename: "MenuItem"; + category: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_category | null; + collection: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children_children | null)[] | null; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children { + __typename: "MenuItem"; + category: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_category | null; + collection: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children_children | null)[] | null; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items_children { + __typename: "MenuItem"; + category: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_category | null; + collection: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemCreate_menuItemCreate_menuItem_menu_items_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemCreate_menuItemCreate_menuItem_menu_items_children_children | null)[] | null; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu_items { + __typename: "MenuItem"; + category: MenuItemCreate_menuItemCreate_menuItem_menu_items_category | null; + collection: MenuItemCreate_menuItemCreate_menuItem_menu_items_collection | null; + id: string; + level: number; + name: string; + page: MenuItemCreate_menuItemCreate_menuItem_menu_items_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemCreate_menuItemCreate_menuItem_menu_items_children | null)[] | null; +} + +export interface MenuItemCreate_menuItemCreate_menuItem_menu { + __typename: "Menu"; + id: string; + items: (MenuItemCreate_menuItemCreate_menuItem_menu_items | null)[] | null; +} + +export interface MenuItemCreate_menuItemCreate_menuItem { + __typename: "MenuItem"; + menu: MenuItemCreate_menuItemCreate_menuItem_menu; +} + +export interface MenuItemCreate_menuItemCreate { + __typename: "MenuItemCreate"; + errors: MenuItemCreate_menuItemCreate_errors[] | null; + menuItem: MenuItemCreate_menuItemCreate_menuItem | null; +} + +export interface MenuItemCreate { + menuItemCreate: MenuItemCreate_menuItemCreate | null; +} + +export interface MenuItemCreateVariables { + input: MenuItemCreateInput; +} diff --git a/src/navigation/types/MenuItemFragment.ts b/src/navigation/types/MenuItemFragment.ts new file mode 100644 index 000000000..9d7a261e0 --- /dev/null +++ b/src/navigation/types/MenuItemFragment.ts @@ -0,0 +1,37 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: MenuItemFragment +// ==================================================== + +export interface MenuItemFragment_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemFragment_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemFragment_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemFragment { + __typename: "MenuItem"; + category: MenuItemFragment_category | null; + collection: MenuItemFragment_collection | null; + id: string; + level: number; + name: string; + page: MenuItemFragment_page | null; + sortOrder: number | null; + url: string | null; +} diff --git a/src/navigation/types/MenuItemNestedFragment.ts b/src/navigation/types/MenuItemNestedFragment.ts new file mode 100644 index 000000000..4559855b4 --- /dev/null +++ b/src/navigation/types/MenuItemNestedFragment.ts @@ -0,0 +1,223 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: MenuItemNestedFragment +// ==================================================== + +export interface MenuItemNestedFragment_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemNestedFragment_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemNestedFragment_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemNestedFragment_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_children_children_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_children_children_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_children_children_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemNestedFragment_children_children_children_children_children_children { + __typename: "MenuItem"; + category: MenuItemNestedFragment_children_children_children_children_children_children_category | null; + collection: MenuItemNestedFragment_children_children_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemNestedFragment_children_children_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; +} + +export interface MenuItemNestedFragment_children_children_children_children_children { + __typename: "MenuItem"; + category: MenuItemNestedFragment_children_children_children_children_children_category | null; + collection: MenuItemNestedFragment_children_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemNestedFragment_children_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemNestedFragment_children_children_children_children_children_children | null)[] | null; +} + +export interface MenuItemNestedFragment_children_children_children_children { + __typename: "MenuItem"; + category: MenuItemNestedFragment_children_children_children_children_category | null; + collection: MenuItemNestedFragment_children_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemNestedFragment_children_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemNestedFragment_children_children_children_children_children | null)[] | null; +} + +export interface MenuItemNestedFragment_children_children_children { + __typename: "MenuItem"; + category: MenuItemNestedFragment_children_children_children_category | null; + collection: MenuItemNestedFragment_children_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemNestedFragment_children_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemNestedFragment_children_children_children_children | null)[] | null; +} + +export interface MenuItemNestedFragment_children_children { + __typename: "MenuItem"; + category: MenuItemNestedFragment_children_children_category | null; + collection: MenuItemNestedFragment_children_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemNestedFragment_children_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemNestedFragment_children_children_children | null)[] | null; +} + +export interface MenuItemNestedFragment_children { + __typename: "MenuItem"; + category: MenuItemNestedFragment_children_category | null; + collection: MenuItemNestedFragment_children_collection | null; + id: string; + level: number; + name: string; + page: MenuItemNestedFragment_children_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemNestedFragment_children_children | null)[] | null; +} + +export interface MenuItemNestedFragment { + __typename: "MenuItem"; + category: MenuItemNestedFragment_category | null; + collection: MenuItemNestedFragment_collection | null; + id: string; + level: number; + name: string; + page: MenuItemNestedFragment_page | null; + sortOrder: number | null; + url: string | null; + children: (MenuItemNestedFragment_children | null)[] | null; +} diff --git a/src/navigation/types/MenuItemUpdate.ts b/src/navigation/types/MenuItemUpdate.ts new file mode 100644 index 000000000..d3c46bd07 --- /dev/null +++ b/src/navigation/types/MenuItemUpdate.ts @@ -0,0 +1,60 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { MenuItemInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: MenuItemUpdate +// ==================================================== + +export interface MenuItemUpdate_menuItemUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface MenuItemUpdate_menuItemUpdate_menuItem_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface MenuItemUpdate_menuItemUpdate_menuItem_collection { + __typename: "Collection"; + id: string; + name: string; +} + +export interface MenuItemUpdate_menuItemUpdate_menuItem_page { + __typename: "Page"; + id: string; + title: string; +} + +export interface MenuItemUpdate_menuItemUpdate_menuItem { + __typename: "MenuItem"; + category: MenuItemUpdate_menuItemUpdate_menuItem_category | null; + collection: MenuItemUpdate_menuItemUpdate_menuItem_collection | null; + id: string; + level: number; + name: string; + page: MenuItemUpdate_menuItemUpdate_menuItem_page | null; + sortOrder: number | null; + url: string | null; +} + +export interface MenuItemUpdate_menuItemUpdate { + __typename: "MenuItemUpdate"; + errors: MenuItemUpdate_menuItemUpdate_errors[] | null; + menuItem: MenuItemUpdate_menuItemUpdate_menuItem | null; +} + +export interface MenuItemUpdate { + menuItemUpdate: MenuItemUpdate_menuItemUpdate | null; +} + +export interface MenuItemUpdateVariables { + id: string; + input: MenuItemInput; +} diff --git a/src/navigation/types/MenuList.ts b/src/navigation/types/MenuList.ts new file mode 100644 index 000000000..8e95e1110 --- /dev/null +++ b/src/navigation/types/MenuList.ts @@ -0,0 +1,49 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: MenuList +// ==================================================== + +export interface MenuList_menus_edges_node_items { + __typename: "MenuItem"; + id: string; +} + +export interface MenuList_menus_edges_node { + __typename: "Menu"; + id: string; + name: string; + items: (MenuList_menus_edges_node_items | null)[] | null; +} + +export interface MenuList_menus_edges { + __typename: "MenuCountableEdge"; + node: MenuList_menus_edges_node; +} + +export interface MenuList_menus_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface MenuList_menus { + __typename: "MenuCountableConnection"; + edges: MenuList_menus_edges[]; + pageInfo: MenuList_menus_pageInfo; +} + +export interface MenuList { + menus: MenuList_menus | null; +} + +export interface MenuListVariables { + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/navigation/types/MenuUpdate.ts b/src/navigation/types/MenuUpdate.ts new file mode 100644 index 000000000..0ab7d0d56 --- /dev/null +++ b/src/navigation/types/MenuUpdate.ts @@ -0,0 +1,55 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { MenuItemMoveInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: MenuUpdate +// ==================================================== + +export interface MenuUpdate_menuUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface MenuUpdate_menuUpdate { + __typename: "MenuUpdate"; + errors: MenuUpdate_menuUpdate_errors[] | null; +} + +export interface MenuUpdate_menuItemMove_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface MenuUpdate_menuItemMove { + __typename: "MenuItemMove"; + errors: MenuUpdate_menuItemMove_errors[] | null; +} + +export interface MenuUpdate_menuItemBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface MenuUpdate_menuItemBulkDelete { + __typename: "MenuItemBulkDelete"; + errors: MenuUpdate_menuItemBulkDelete_errors[] | null; +} + +export interface MenuUpdate { + menuUpdate: MenuUpdate_menuUpdate | null; + menuItemMove: MenuUpdate_menuItemMove | null; + menuItemBulkDelete: MenuUpdate_menuItemBulkDelete | null; +} + +export interface MenuUpdateVariables { + id: string; + name: string; + moves: (MenuItemMoveInput | null)[]; + removeIds: (string | null)[]; +} diff --git a/src/navigation/urls.ts b/src/navigation/urls.ts new file mode 100644 index 000000000..2481f46d4 --- /dev/null +++ b/src/navigation/urls.ts @@ -0,0 +1,20 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; +import { BulkAction, Dialog, Pagination, SingleAction } from "../types"; + +export const navigationSection = "/navigation"; + +export const menuListPath = navigationSection; +export type MenuListUrlDialog = "add" | "remove" | "remove-many"; +export type MenuListUrlQueryParams = BulkAction & + Dialog & + Pagination & + SingleAction; +export const menuListUrl = (params?: MenuListUrlQueryParams) => + menuListPath + "?" + stringifyQs(params); + +export const menuPath = (id: string) => urlJoin(navigationSection, id); +export type MenuUrlDialog = "add-item" | "edit-item" | "remove"; +export type MenuUrlQueryParams = Dialog & SingleAction; +export const menuUrl = (id: string, params?: MenuUrlQueryParams) => + menuPath(encodeURIComponent(id)) + "?" + stringifyQs(params); diff --git a/src/navigation/views/MenuDetails/index.tsx b/src/navigation/views/MenuDetails/index.tsx new file mode 100644 index 000000000..c5ad9d9d1 --- /dev/null +++ b/src/navigation/views/MenuDetails/index.tsx @@ -0,0 +1,397 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import { categoryUrl } from "../../../categories/urls"; +import { collectionUrl } from "../../../collections/urls"; +import { DEFAULT_INITIAL_SEARCH_DATA } from "../../../config"; +import SearchCategories from "../../../containers/SearchCategories"; +import SearchCollections from "../../../containers/SearchCollections"; +import SearchPages from "../../../containers/SearchPages"; +import i18n from "../../../i18n"; +import { getMutationState, maybe } from "../../../misc"; +import { pageUrl } from "../../../pages/urls"; +import MenuDetailsPage, { + MenuDetailsSubmitData +} from "../../components/MenuDetailsPage"; +import { findNode, getNode } from "../../components/MenuDetailsPage/tree"; +import MenuItemDialog, { + MenuItemDialogFormData, + MenuItemType +} from "../../components/MenuItemDialog"; +import { + getItemId, + getItemType, + unknownTypeError +} from "../../components/MenuItems"; +import { + MenuDeleteMutation, + MenuItemCreateMutation, + MenuItemUpdateMutation, + MenuUpdateMutation +} from "../../mutations"; +import { MenuDetailsQuery } from "../../queries"; +import { MenuItemCreateVariables } from "../../types/MenuItemCreate"; +import { MenuItemUpdateVariables } from "../../types/MenuItemUpdate"; +import { menuListUrl, menuUrl, MenuUrlQueryParams } from "../../urls"; +import { + handleDelete, + handleItemCreate, + handleItemUpdate, + handleUpdate +} from "./successHandlers"; +import { + getInitialDisplayValue, + getMenuItemInputData, + getMoves, + getRemoveIds +} from "./utils"; + +interface MenuDetailsProps { + id: string; + params: MenuUrlQueryParams; +} + +const MenuDetails: React.FC = ({ id, params }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const closeModal = () => + navigate( + menuUrl(id, { + ...params, + action: undefined, + id: undefined + }), + true + ); + + const handleItemClick = (id: string, type: MenuItemType) => { + switch (type) { + case "category": + navigate(categoryUrl(id)); + break; + + case "collection": + navigate(collectionUrl(id)); + break; + + case "page": + navigate(pageUrl(id)); + break; + + case "link": + window.open(id, "blank"); + break; + + default: + throw unknownTypeError; + break; + } + }; + + return ( + + {pageSearch => ( + + {categorySearch => ( + + {collectionSearch => ( + + {({ data, loading, refetch }) => { + const handleQueryChange = (query: string) => { + categorySearch.search(query); + collectionSearch.search(query); + pageSearch.search(query); + }; + + const categories = maybe( + () => + categorySearch.result.data.categories.edges.map( + edge => edge.node + ), + [] + ); + + const collections = maybe( + () => + collectionSearch.result.data.collections.edges.map( + edge => edge.node + ), + [] + ); + + const pages = maybe( + () => + pageSearch.result.data.pages.edges.map( + edge => edge.node + ), + [] + ); + + return ( + + handleDelete(data, navigate, notify) + } + > + {(menuDelete, menuDeleteOpts) => ( + + handleUpdate(data, notify, refetch) + } + > + {(menuUpdate, menuUpdateOpts) => { + const deleteState = getMutationState( + menuDeleteOpts.called, + menuDeleteOpts.loading, + maybe( + () => menuDeleteOpts.data.menuDelete.errors + ) + ); + + const updateState = getMutationState( + menuUpdateOpts.called, + menuUpdateOpts.loading, + maybe( + () => menuUpdateOpts.data.menuUpdate.errors + ), + maybe( + () => menuUpdateOpts.data.menuItemMove.errors + ) + ); + + // This is a workaround to let know + // that it should clean operation stack if mutations + // were successful + const handleSubmit = async ( + data: MenuDetailsSubmitData + ) => { + try { + const result = await menuUpdate({ + variables: { + id, + moves: getMoves(data), + name: data.name, + removeIds: getRemoveIds(data) + } + }); + if (result) { + if ( + result.data.menuItemBulkDelete.errors + .length > 0 || + result.data.menuItemMove.errors.length > + 0 || + result.data.menuUpdate.errors.length > 0 + ) { + return false; + } + } + return true; + } catch { + return false; + } + }; + + return ( + <> + data.menu)} + onBack={() => navigate(menuListUrl())} + onDelete={() => + navigate( + menuUrl(id, { + action: "remove" + }) + ) + } + onItemAdd={() => + navigate( + menuUrl(id, { + action: "add-item" + }) + ) + } + onItemClick={handleItemClick} + onItemEdit={itemId => + navigate( + menuUrl(id, { + action: "edit-item", + id: itemId + }) + ) + } + onSubmit={handleSubmit} + saveButtonState={updateState} + /> + + menuDelete({ variables: { id } }) + } + variant="delete" + title={i18n.t("Remove menu")} + > + {{ name }}?", + { + name: maybe( + () => data.menu.name, + "..." + ) + } + ) + }} + /> + + + + handleItemCreate(data, notify, closeModal) + } + > + {(menuItemCreate, menuItemCreateOpts) => { + const handleSubmit = ( + data: MenuItemDialogFormData + ) => { + const variables: MenuItemCreateVariables = { + input: { + menu: id, + ...getMenuItemInputData(data) + } + }; + + menuItemCreate({ variables }); + }; + + const formTransitionState = getMutationState( + menuItemCreateOpts.called, + menuItemCreateOpts.loading, + maybe( + () => + menuItemCreateOpts.data + .menuItemCreate.errors + ) + ); + + return ( + + ); + }} + + + handleItemUpdate( + data, + id, + navigate, + notify + ) + } + > + {(menuItemUpdate, menuItemUpdateOpts) => { + const handleSubmit = ( + data: MenuItemDialogFormData + ) => { + const variables: MenuItemUpdateVariables = { + id: params.id, + input: getMenuItemInputData(data) + }; + + menuItemUpdate({ variables }); + }; + + const menuItem = maybe(() => + getNode( + data.menu.items, + findNode(data.menu.items, params.id) + ) + ); + + const formTransitionState = getMutationState( + menuItemUpdateOpts.called, + menuItemUpdateOpts.loading, + maybe( + () => + menuItemUpdateOpts.data + .menuItemUpdate.errors + ) + ); + + const initialFormData: MenuItemDialogFormData = { + id: maybe(() => getItemId(menuItem)), + name: maybe(() => menuItem.name, "..."), + type: maybe( + () => getItemType(menuItem), + "category" + ) + }; + + return ( + + ); + }} + + + ); + }} + + )} + + ); + }} + + )} + + )} + + )} + + ); +}; +MenuDetails.displayName = "MenuDetails"; + +export default MenuDetails; diff --git a/src/navigation/views/MenuDetails/successHandlers.ts b/src/navigation/views/MenuDetails/successHandlers.ts new file mode 100644 index 000000000..995211a6f --- /dev/null +++ b/src/navigation/views/MenuDetails/successHandlers.ts @@ -0,0 +1,78 @@ +import { UseNavigatorResult } from "../../../hooks/useNavigator"; +import { UseNotifierResult } from "../../../hooks/useNotifier"; +import i18n from "../../../i18n"; +import { MenuDelete } from "../../types/MenuDelete"; +import { MenuItemCreate } from "../../types/MenuItemCreate"; +import { MenuItemUpdate } from "../../types/MenuItemUpdate"; +import { MenuUpdate } from "../../types/MenuUpdate"; +import { menuListUrl, menuUrl } from "../../urls"; + +export function handleItemCreate( + data: MenuItemCreate, + notify: UseNotifierResult, + closeModal: () => void +) { + if (data.menuItemCreate.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Created menu item", { + context: "notification" + }) + }); + } +} + +export function handleItemUpdate( + data: MenuItemUpdate, + id: string, + navigate: UseNavigatorResult, + notify: UseNotifierResult +) { + if (data.menuItemUpdate.errors.length === 0) { + notify({ + text: i18n.t("Updated menu item", { + context: "notification" + }) + }); + navigate( + menuUrl(id, { + action: undefined, + id: undefined + }) + ); + } +} + +export function handleDelete( + data: MenuDelete, + navigate: UseNavigatorResult, + notify: UseNotifierResult +) { + if (data.menuDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed menu", { + context: "notification" + }) + }); + navigate(menuListUrl(), true); + } +} + +export function handleUpdate( + data: MenuUpdate, + notify: UseNotifierResult, + refetch: () => void +) { + if ( + data.menuItemBulkDelete.errors.length === 0 && + data.menuItemMove.errors.length === 0 && + data.menuUpdate.errors.length === 0 + ) { + notify({ + text: i18n.t("Updated menu", { + context: "notification" + }) + }); + refetch(); + } +} diff --git a/src/navigation/views/MenuDetails/utils.ts b/src/navigation/views/MenuDetails/utils.ts new file mode 100644 index 000000000..188bd357b --- /dev/null +++ b/src/navigation/views/MenuDetails/utils.ts @@ -0,0 +1,68 @@ +import { MenuItemInput, MenuItemMoveInput } from "../../../types/globalTypes"; +import { MenuDetailsSubmitData } from "../../components/MenuDetailsPage"; +import { MenuItemDialogFormData } from "../../components/MenuItemDialog"; +import { unknownTypeError } from "../../components/MenuItems"; +import { MenuDetails_menu_items } from "../../types/MenuDetails"; + +export function getMenuItemInputData( + data: MenuItemDialogFormData +): MenuItemInput { + const variables: MenuItemInput = { + name: data.name + }; + switch (data.type) { + case "category": + variables.category = data.id; + break; + + case "collection": + variables.collection = data.id; + break; + + case "page": + variables.page = data.id; + break; + + case "link": + variables.url = data.id; + break; + + default: + throw unknownTypeError; + } + + return variables; +} + +export function getInitialDisplayValue(item: MenuDetails_menu_items): string { + if (!item) { + return "..."; + } + if (item.category) { + return item.category.name; + } else if (item.collection) { + return item.collection.name; + } else if (item.page) { + return item.page.title; + } else if (item.url) { + return item.url; + } else { + throw unknownTypeError; + } +} + +export function getMoves(data: MenuDetailsSubmitData): MenuItemMoveInput[] { + return data.operations + .filter(operation => operation.type === "move") + .map(move => ({ + itemId: move.id, + parentId: move.parentId, + sortOrder: move.sortOrder + })); +} + +export function getRemoveIds(data: MenuDetailsSubmitData): string[] { + return data.operations + .filter(operation => operation.type === "remove") + .map(operation => operation.id); +} diff --git a/src/navigation/views/MenuList.tsx b/src/navigation/views/MenuList.tsx new file mode 100644 index 000000000..7e9f0a561 --- /dev/null +++ b/src/navigation/views/MenuList.tsx @@ -0,0 +1,256 @@ +import Button from "@material-ui/core/Button"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { PAGINATE_BY } from "../../config"; +import { configurationMenuUrl } from "../../configuration"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import MenuCreateDialog from "../components/MenuCreateDialog"; +import MenuListPage from "../components/MenuListPage"; +import { + MenuBulkDeleteMutation, + MenuCreateMutation, + MenuDeleteMutation +} from "../mutations"; +import { MenuListQuery } from "../queries"; +import { MenuBulkDelete } from "../types/MenuBulkDelete"; +import { MenuCreate } from "../types/MenuCreate"; +import { MenuDelete } from "../types/MenuDelete"; +import { menuListUrl, MenuListUrlQueryParams, menuUrl } from "../urls"; + +interface MenuListProps { + params: MenuListUrlQueryParams; +} +const MenuList: React.FC = ({ params }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const closeModal = () => + navigate( + menuListUrl({ + ...params, + action: undefined, + id: undefined, + ids: undefined + }), + true + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + + return ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.menus.pageInfo), + paginationState, + params + ); + + const handleCreate = (data: MenuCreate) => { + if (data.menuCreate.errors.length === 0) { + notify({ + text: i18n.t("Created menu", { + context: "notification" + }) + }); + navigate(menuUrl(data.menuCreate.menu.id)); + } + }; + + const handleBulkDelete = (data: MenuBulkDelete) => { + if (data.menuBulkDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed menus", { + context: "notification" + }) + }); + closeModal(); + reset(); + refetch(); + } + }; + + const handleDelete = (data: MenuDelete) => { + if (data.menuDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed menu", { + context: "notification" + }) + }); + closeModal(); + refetch(); + } + }; + + return ( + + {(menuCreate, menuCreateOpts) => ( + + {(menuDelete, menuDeleteOpts) => ( + + {(menuBulkDelete, menuBulkDeleteOpts) => { + const createTransitionState = getMutationState( + menuCreateOpts.called, + menuCreateOpts.loading, + maybe(() => menuCreateOpts.data.menuCreate.errors) + ); + + const deleteTransitionState = getMutationState( + menuDeleteOpts.called, + menuDeleteOpts.loading, + maybe(() => menuDeleteOpts.data.menuDelete.errors) + ); + + const bulkDeleteTransitionState = getMutationState( + menuBulkDeleteOpts.called, + menuBulkDeleteOpts.loading, + maybe( + () => menuBulkDeleteOpts.data.menuBulkDelete.errors + ) + ); + + return ( + <> + + data.menus.edges.map(edge => edge.node) + )} + onAdd={() => + navigate( + menuListUrl({ + action: "add" + }) + ) + } + onBack={() => navigate(configurationMenuUrl)} + onDelete={id => + navigate( + menuListUrl({ + action: "remove", + id + }) + ) + } + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRowClick={id => () => navigate(menuUrl(id))} + pageInfo={pageInfo} + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + toolbar={ + + } + /> + + menuCreate({ + variables: { input: formData } + }) + } + /> + + menuDelete({ + variables: { + id: params.id + } + }) + } + variant="delete" + title={i18n.t("Remove menu")} + > + {{ name }}?", + { + name: maybe( + () => + data.menus.edges.find( + edge => edge.node.id === params.id + ).node.name, + "..." + ) + } + ) + }} + /> + + + menuBulkDelete({ + variables: { + ids: params.ids + } + }) + } + variant="delete" + title={i18n.t("Remove menus")} + > + {{ number }} menus?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + )} + + )} + + ); + }} + + ); +}; +export default MenuList; diff --git a/src/orders/components/OrderAddressEditDialog/OrderAddressEditDialog.tsx b/src/orders/components/OrderAddressEditDialog/OrderAddressEditDialog.tsx new file mode 100644 index 000000000..81687a3e4 --- /dev/null +++ b/src/orders/components/OrderAddressEditDialog/OrderAddressEditDialog.tsx @@ -0,0 +1,90 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import * as React from "react"; + +import AddressEdit from "@saleor/components/AddressEdit"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import { AddressTypeInput } from "../../../customers/types"; +import i18n from "../../../i18n"; +import { UserError } from "../../../types"; + +const styles = createStyles({ + overflow: { + overflowY: "visible" + } +}); + +interface OrderAddressEditDialogProps extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + address: AddressTypeInput; + open: boolean; + errors: UserError[]; + variant: "billing" | "shipping" | string; + countries?: Array<{ + code: string; + label: string; + }>; + onClose(); + onConfirm(data: AddressTypeInput); +} + +const OrderAddressEditDialog = withStyles(styles, { + name: "OrderAddressEditDialog" +})( + ({ + address, + classes, + confirmButtonState, + open, + errors, + variant, + countries, + onClose, + onConfirm + }: OrderAddressEditDialogProps) => ( + +
    + {({ change, data, errors, submit }) => ( + <> + + {variant === "billing" + ? i18n.t("Edit billing address", { context: "title" }) + : i18n.t("Edit shipping address", { context: "title" })} + + + + + + + + {i18n.t("Confirm", { context: "button" })} + + + + )} +
    +
    + ) +); +OrderAddressEditDialog.displayName = "OrderAddressEditDialog"; +export default OrderAddressEditDialog; diff --git a/src/orders/components/OrderAddressEditDialog/index.ts b/src/orders/components/OrderAddressEditDialog/index.ts new file mode 100644 index 000000000..5ae253bf8 --- /dev/null +++ b/src/orders/components/OrderAddressEditDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderAddressEditDialog"; +export * from "./OrderAddressEditDialog"; diff --git a/src/orders/components/OrderBulkCancelDialog/OrderBulkCancelDialog.tsx b/src/orders/components/OrderBulkCancelDialog/OrderBulkCancelDialog.tsx new file mode 100644 index 000000000..f9029dd82 --- /dev/null +++ b/src/orders/components/OrderBulkCancelDialog/OrderBulkCancelDialog.tsx @@ -0,0 +1,51 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import ControlledCheckbox from "@saleor/components/ControlledCheckbox"; +import i18n from "../../../i18n"; + +export interface OrderBulkCancelDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + numberOfOrders: string; + open: boolean; + onClose: () => void; + onConfirm: (restock: boolean) => void; +} + +const OrderBulkCancelDialog: React.StatelessComponent< + OrderBulkCancelDialogProps +> = ({ confirmButtonState, numberOfOrders, open, onClose, onConfirm }) => { + const [restock, setRestock] = React.useState(true); + + return ( + onConfirm(restock)} + > + {{ number }} orders?", + { + number: numberOfOrders + } + ) + }} + /> + setRestock(event.target.value)} + /> + + ); +}; +OrderBulkCancelDialog.displayName = "OrderBulkCancelDialog"; +export default OrderBulkCancelDialog; diff --git a/src/orders/components/OrderBulkCancelDialog/index.ts b/src/orders/components/OrderBulkCancelDialog/index.ts new file mode 100644 index 000000000..25c157c84 --- /dev/null +++ b/src/orders/components/OrderBulkCancelDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from './OrderBulkCancelDialog'; +export * from './OrderBulkCancelDialog'; \ No newline at end of file diff --git a/src/orders/components/OrderCancelDialog/OrderCancelDialog.tsx b/src/orders/components/OrderCancelDialog/OrderCancelDialog.tsx new file mode 100644 index 000000000..ee8b15758 --- /dev/null +++ b/src/orders/components/OrderCancelDialog/OrderCancelDialog.tsx @@ -0,0 +1,104 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import ControlledCheckbox from "@saleor/components/ControlledCheckbox"; +import Form from "@saleor/components/Form"; +import i18n from "../../../i18n"; + +export interface FormData { + restock: boolean; +} + +const styles = (theme: Theme) => + createStyles({ + deleteButton: { + "&:hover": { + backgroundColor: theme.palette.error.main + }, + backgroundColor: theme.palette.error.main, + color: theme.palette.error.contrastText + } + }); + +interface OrderCancelDialogProps extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + number: string; + open: boolean; + onClose?(); + onSubmit(data: FormData); +} + +const OrderCancelDialog = withStyles(styles, { name: "OrderCancelDialog" })( + ({ + classes, + confirmButtonState, + number: orderNumber, + open, + onSubmit, + onClose + }: OrderCancelDialogProps) => ( + +
    + {({ data, change }) => { + return ( + <> + + {i18n.t("Cancel order", { context: "title" })} + + + {{ orderNumber }}?", + { orderNumber } + ) + }} + /> + + + + + + {i18n.t("Cancel order", { context: "button" })} + + + + ); + }} +
    +
    + ) +); +OrderCancelDialog.displayName = "OrderCancelDialog"; +export default OrderCancelDialog; diff --git a/src/orders/components/OrderCancelDialog/index.ts b/src/orders/components/OrderCancelDialog/index.ts new file mode 100644 index 000000000..fb5e9e4cc --- /dev/null +++ b/src/orders/components/OrderCancelDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderCancelDialog"; +export * from "./OrderCancelDialog"; diff --git a/src/orders/components/OrderCustomer/OrderCustomer.tsx b/src/orders/components/OrderCustomer/OrderCustomer.tsx new file mode 100644 index 000000000..92970c79c --- /dev/null +++ b/src/orders/components/OrderCustomer/OrderCustomer.tsx @@ -0,0 +1,286 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import ExternalLink from "@saleor/components/ExternalLink"; +import Form from "@saleor/components/Form"; +import Hr from "@saleor/components/Hr"; +import Link from "@saleor/components/Link"; +import SingleAutocompleteSelectField from "@saleor/components/SingleAutocompleteSelectField"; +import Skeleton from "@saleor/components/Skeleton"; +import { SearchCustomers_customers_edges_node } from "../../../containers/SearchCustomers/types/SearchCustomers"; +import { customerUrl } from "../../../customers/urls"; +import i18n from "../../../i18n"; +import { createHref, maybe } from "../../../misc"; +import { OrderDetails_order } from "../../types/OrderDetails"; + +const styles = (theme: Theme) => + createStyles({ + sectionHeader: { + alignItems: "center", + display: "flex", + marginBottom: theme.spacing.unit * 3 + }, + sectionHeaderTitle: { + flex: 1, + fontWeight: 600 as 600, + lineHeight: 1, + textTransform: "uppercase" + }, + sectionHeaderToolbar: { + marginRight: -theme.spacing.unit * 2 + }, + userEmail: { + fontWeight: 600 as 600, + marginBottom: theme.spacing.unit + } + }); + +export interface OrderCustomerProps extends WithStyles { + order: OrderDetails_order; + users?: SearchCustomers_customers_edges_node[]; + loading?: boolean; + canEditAddresses: boolean; + canEditCustomer: boolean; + fetchUsers?: (query: string) => void; + onCustomerEdit?: (data: { user?: string; userEmail?: string }) => void; + onProfileView: () => void; + onBillingAddressEdit?: () => void; + onShippingAddressEdit?: () => void; +} + +const OrderCustomer = withStyles(styles, { name: "OrderCustomer" })( + ({ + classes, + canEditAddresses, + canEditCustomer, + fetchUsers, + loading, + order, + users, + onCustomerEdit, + onBillingAddressEdit, + onProfileView, + onShippingAddressEdit + }: OrderCustomerProps) => { + const [isInEditMode, setEditModeStatus] = React.useState(false); + const toggleEditMode = () => setEditModeStatus(!isInEditMode); + + const billingAddress = maybe(() => order.billingAddress); + const shippingAddress = maybe(() => order.shippingAddress); + const user = maybe(() => order.user); + return ( + + + {i18n.t("Edit")} + + ) + } + /> + + {user === undefined ? ( + + ) : isInEditMode && canEditCustomer ? ( +
    + {({ change, data }) => { + const handleChange = (event: React.ChangeEvent) => { + change(event); + onCustomerEdit({ + [event.target.value.value.includes("@") + ? "userEmail" + : "user"]: event.target.value.value + }); + toggleEditMode(); + }; + return ( + users, []).map(user => ({ + label: user.email, + value: user.id + }))} + fetchChoices={fetchUsers} + loading={loading} + placeholder={i18n.t("Search Customers")} + onChange={handleChange} + name="query" + value={data.query} + /> + ); + }} + + ) : user === null ? ( + {i18n.t("Anonymous user")} + ) : ( + <> + + {user.email} + +
    + + {i18n.t("View Profile")} + +
    + {/* TODO: Uncomment it after adding ability to filter + orders by customer */} + {/*
    + {i18n.t("View Orders")} +
    */} + + )} +
    +
    + +
    + + {i18n.t("Contact information")} + +
    + + {maybe(() => order.userEmail) === undefined ? ( + + ) : order.userEmail === null ? ( + {i18n.t("Not set")} + ) : ( + order.userEmail)}`} + typographyProps={{ color: "primary" }} + > + {maybe(() => order.userEmail)} + + )} +
    +
    + +
    + + {i18n.t("Shipping Address")} + + {canEditAddresses && ( +
    + +
    + )} +
    + {shippingAddress === undefined ? ( + + ) : shippingAddress === null ? ( + {i18n.t("Not set")} + ) : ( + <> + {shippingAddress.companyName && ( + {shippingAddress.companyName} + )} + + {shippingAddress.firstName} {shippingAddress.lastName} + + + {shippingAddress.streetAddress1} +
    + {shippingAddress.streetAddress2} +
    + + {shippingAddress.postalCode} {shippingAddress.city} + {shippingAddress.cityArea + ? ", " + shippingAddress.cityArea + : ""} + + + {shippingAddress.countryArea + ? shippingAddress.countryArea + + ", " + + shippingAddress.country.country + : shippingAddress.country.country} + + {shippingAddress.phone} + + )} +
    +
    + +
    + + {i18n.t("Billing Address")} + + {canEditAddresses && ( +
    + +
    + )} +
    + {billingAddress === undefined ? ( + + ) : billingAddress === null ? ( + {i18n.t("Not set")} + ) : maybe(() => shippingAddress.id) === billingAddress.id ? ( + {i18n.t("Same as shipping address")} + ) : ( + <> + {billingAddress.companyName && ( + {billingAddress.companyName} + )} + + {billingAddress.firstName} {billingAddress.lastName} + + + {billingAddress.streetAddress1} +
    + {billingAddress.streetAddress2} +
    + + {billingAddress.postalCode} {billingAddress.city} + {billingAddress.cityArea ? ", " + billingAddress.cityArea : ""} + + + {billingAddress.countryArea + ? billingAddress.countryArea + + ", " + + billingAddress.country.country + : billingAddress.country.country} + + {billingAddress.phone} + + )} +
    +
    + ); + } +); +OrderCustomer.displayName = "OrderCustomer"; +export default OrderCustomer; diff --git a/src/orders/components/OrderCustomer/index.ts b/src/orders/components/OrderCustomer/index.ts new file mode 100644 index 000000000..eb0326b8c --- /dev/null +++ b/src/orders/components/OrderCustomer/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderCustomer"; +export * from "./OrderCustomer"; diff --git a/src/orders/components/OrderCustomerEditDialog/OrderCustomerEditDialog.tsx b/src/orders/components/OrderCustomerEditDialog/OrderCustomerEditDialog.tsx new file mode 100644 index 000000000..2c7b1f271 --- /dev/null +++ b/src/orders/components/OrderCustomerEditDialog/OrderCustomerEditDialog.tsx @@ -0,0 +1,110 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import { SingleAutocompleteSelectField } from "@saleor/components/SingleAutocompleteSelectField"; +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + dialog: { + overflowY: "visible" + }, + root: { + overflowY: "visible", + width: theme.breakpoints.values.sm + }, + select: { + flex: 1, + marginRight: theme.spacing.unit * 2 + }, + textRight: { + textAlign: "right" + } + }); + +interface OrderCustomerEditDialogProps extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + user?: { + label: string; + value: string; + }; + users?: Array<{ + id: string; + email: string; + }>; + loading?: boolean; + fetchUsers(value: string); + onChange(event: React.ChangeEvent); + onClose?(); + onConfirm?(event: React.FormEvent); +} + +const OrderCustomerEditDialog = withStyles(styles, { + name: "OrderCustomerEditDialog" +})( + ({ + classes, + confirmButtonState, + open, + loading, + user, + users, + fetchUsers, + onChange, + onClose, + onConfirm + }: OrderCustomerEditDialogProps) => { + const choices = + !loading && users + ? users.map(v => ({ + label: v.email, + value: v.id + })) + : []; + return ( + + {i18n.t("Edit customer details")} + + + + + + + {i18n.t("Confirm", { context: "button" })} + + + + ); + } +); +OrderCustomerEditDialog.displayName = "OrderCustomerEditDialog"; +export default OrderCustomerEditDialog; diff --git a/src/orders/components/OrderCustomerEditDialog/index.ts b/src/orders/components/OrderCustomerEditDialog/index.ts new file mode 100644 index 000000000..cb32cf9f6 --- /dev/null +++ b/src/orders/components/OrderCustomerEditDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderCustomerEditDialog"; +export * from "./OrderCustomerEditDialog"; diff --git a/src/orders/components/OrderCustomerNote/OrderCustomerNote.tsx b/src/orders/components/OrderCustomerNote/OrderCustomerNote.tsx new file mode 100644 index 000000000..331473340 --- /dev/null +++ b/src/orders/components/OrderCustomerNote/OrderCustomerNote.tsx @@ -0,0 +1,36 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; + +interface OrderCustomerNoteProps { + note: string; +} + +export const OrderCustomerNote: React.StatelessComponent< + OrderCustomerNoteProps +> = ({ note }) => ( + + + + {note === undefined ? ( + + ) : note === "" ? ( + + {i18n.t("No notes from customer")} + + ) : ( + {note} + )} + + +); +export default OrderCustomerNote; diff --git a/src/orders/components/OrderCustomerNote/index.ts b/src/orders/components/OrderCustomerNote/index.ts new file mode 100644 index 000000000..d9ccde57a --- /dev/null +++ b/src/orders/components/OrderCustomerNote/index.ts @@ -0,0 +1,2 @@ +export * from "./OrderCustomerNote"; +export { default } from "./OrderCustomerNote"; diff --git a/src/orders/components/OrderDetailsPage/OrderDetailsPage.tsx b/src/orders/components/OrderDetailsPage/OrderDetailsPage.tsx new file mode 100644 index 000000000..a1d3d7f3a --- /dev/null +++ b/src/orders/components/OrderDetailsPage/OrderDetailsPage.tsx @@ -0,0 +1,178 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardMenu from "@saleor/components/CardMenu"; +import { CardSpacer } from "@saleor/components/CardSpacer"; +import { Container } from "@saleor/components/Container"; +import { DateTime } from "@saleor/components/Date"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { OrderStatus } from "../../../types/globalTypes"; +import { OrderDetails_order } from "../../types/OrderDetails"; +import OrderCustomer from "../OrderCustomer"; +import OrderCustomerNote from "../OrderCustomerNote"; +import OrderFulfillment from "../OrderFulfillment"; +import OrderHistory, { FormData as HistoryFormData } from "../OrderHistory"; +import OrderPayment from "../OrderPayment/OrderPayment"; +import OrderUnfulfilledItems from "../OrderUnfulfilledItems/OrderUnfulfilledItems"; + +const styles = (theme: Theme) => + createStyles({ + date: { + marginBottom: theme.spacing.unit * 3, + marginTop: -theme.spacing.unit * 2 + }, + header: { + marginBottom: 0 + } + }); + +export interface OrderDetailsPageProps extends WithStyles { + order: OrderDetails_order; + shippingMethods?: Array<{ + id: string; + name: string; + }>; + countries?: Array<{ + code: string; + label: string; + }>; + onBack(); + onBillingAddressEdit(); + onFulfillmentCancel(id: string); + onFulfillmentTrackingNumberUpdate(id: string); + onOrderFulfill(); + onProductClick?(id: string); + onPaymentCapture(); + onPaymentPaid(); + onPaymentRefund(); + onPaymentVoid(); + onShippingAddressEdit(); + onOrderCancel(); + onNoteAdd(data: HistoryFormData); + onProfileView(); +} + +const OrderDetailsPage = withStyles(styles, { name: "OrderDetailsPage" })( + ({ + classes, + order, + onOrderCancel, + onBack, + onBillingAddressEdit, + onFulfillmentCancel, + onFulfillmentTrackingNumberUpdate, + onNoteAdd, + onOrderFulfill, + onPaymentCapture, + onPaymentPaid, + onPaymentRefund, + onPaymentVoid, + onShippingAddressEdit, + onProfileView + }: OrderDetailsPageProps) => { + const canCancel = maybe(() => order.status) !== OrderStatus.CANCELED; + const canEditAddresses = maybe(() => order.status) !== OrderStatus.CANCELED; + const canFulfill = maybe(() => order.status) !== OrderStatus.CANCELED; + const unfulfilled = maybe(() => order.lines, []).filter( + line => line.quantityFulfilled < line.quantity + ); + + return ( + + {i18n.t("Orders")} + order.number) ? "#" + order.number : undefined} + > + {canCancel && ( + + )} + +
    + {order && order.created ? ( + + + + ) : ( + + )} +
    + +
    + {unfulfilled.length > 0 && ( + + )} + {renderCollection( + maybe(() => order.fulfillments), + (fulfillment, fulfillmentIndex) => ( + fulfillment.id, "loading")}> + {!(unfulfilled.length === 0 && fulfillmentIndex === 0) && ( + + )} + order.number)} + onOrderFulfillmentCancel={() => + onFulfillmentCancel(fulfillment.id) + } + onTrackingCodeAdd={() => + onFulfillmentTrackingNumberUpdate(fulfillment.id) + } + /> + + ) + )} + + + order.events)} + onNoteAdd={onNoteAdd} + /> +
    +
    + + + order.customerNote)} /> +
    +
    +
    + ); + } +); +OrderDetailsPage.displayName = "OrderDetailsPage"; +export default OrderDetailsPage; diff --git a/src/orders/components/OrderDetailsPage/index.ts b/src/orders/components/OrderDetailsPage/index.ts new file mode 100644 index 000000000..ef8727941 --- /dev/null +++ b/src/orders/components/OrderDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderDetailsPage"; +export * from "./OrderDetailsPage"; diff --git a/src/orders/components/OrderDraftCancelDialog/OrderDraftCancelDialog.tsx b/src/orders/components/OrderDraftCancelDialog/OrderDraftCancelDialog.tsx new file mode 100644 index 000000000..61704b193 --- /dev/null +++ b/src/orders/components/OrderDraftCancelDialog/OrderDraftCancelDialog.tsx @@ -0,0 +1,43 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import i18n from "../../../i18n"; + +export interface OrderDraftCancelDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + onClose: () => void; + onConfirm: () => void; + orderNumber: string; +} + +const OrderDraftCancelDialog: React.StatelessComponent< + OrderDraftCancelDialogProps +> = ({ confirmButtonState, onClose, onConfirm, open, orderNumber }) => ( + + #{{ number }}?", + { + context: "modal", + number: orderNumber + } + ) + }} + /> + +); +OrderDraftCancelDialog.displayName = "OrderDraftCancelDialog"; +export default OrderDraftCancelDialog; diff --git a/src/orders/components/OrderDraftCancelDialog/index.ts b/src/orders/components/OrderDraftCancelDialog/index.ts new file mode 100644 index 000000000..0643ddf14 --- /dev/null +++ b/src/orders/components/OrderDraftCancelDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderDraftCancelDialog"; +export * from "./OrderDraftCancelDialog"; diff --git a/src/orders/components/OrderDraftDetails/OrderDraftDetails.tsx b/src/orders/components/OrderDraftDetails/OrderDraftDetails.tsx new file mode 100644 index 000000000..17f1e478c --- /dev/null +++ b/src/orders/components/OrderDraftDetails/OrderDraftDetails.tsx @@ -0,0 +1,62 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { OrderDetails_order } from "../../types/OrderDetails"; +import OrderDraftDetailsProducts, { + FormData as OrderDraftDetailsProductsFormData +} from "../OrderDraftDetailsProducts"; +import OrderDraftDetailsSummary from "../OrderDraftDetailsSummary/OrderDraftDetailsSummary"; + +interface OrderDraftDetailsProps { + order: OrderDetails_order; + onOrderLineAdd: () => void; + onOrderLineChange: ( + id: string, + data: OrderDraftDetailsProductsFormData + ) => void; + onOrderLineRemove: (id: string) => void; + onShippingMethodEdit: () => void; +} + +const OrderDraftDetails: React.StatelessComponent = ({ + order, + onOrderLineAdd, + onOrderLineChange, + onOrderLineRemove, + onShippingMethodEdit +}) => ( + + + {i18n.t("Add products", { + context: "button" + })} + + } + /> + order.lines)} + onOrderLineChange={onOrderLineChange} + onOrderLineRemove={onOrderLineRemove} + /> + {maybe(() => order.lines.length) !== 0 && ( + + + + )} + +); +OrderDraftDetails.displayName = "OrderDraftDetails"; +export default OrderDraftDetails; diff --git a/src/orders/components/OrderDraftDetails/index.ts b/src/orders/components/OrderDraftDetails/index.ts new file mode 100644 index 000000000..02dcb0a12 --- /dev/null +++ b/src/orders/components/OrderDraftDetails/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderDraftDetails"; +export * from "./OrderDraftDetails"; diff --git a/src/orders/components/OrderDraftDetailsProducts/OrderDraftDetailsProducts.tsx b/src/orders/components/OrderDraftDetailsProducts/OrderDraftDetailsProducts.tsx new file mode 100644 index 000000000..1ba483fe3 --- /dev/null +++ b/src/orders/components/OrderDraftDetailsProducts/OrderDraftDetailsProducts.tsx @@ -0,0 +1,168 @@ +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import { DebounceForm } from "@saleor/components/DebounceForm"; +import Form from "@saleor/components/Form"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { OrderDetails_order_lines } from "../../types/OrderDetails"; + +export interface FormData { + quantity: number; +} + +const styles = (theme: Theme) => + createStyles({ + iconCell: { + "&:last-child": { + paddingRight: 0 + }, + width: 48 + theme.spacing.unit / 2 + }, + quantityField: { + "& input": { + padding: "12px 12px 10px", + textAlign: "right" + }, + width: 60 + }, + textRight: { + textAlign: "right" + } + }); + +interface OrderDraftDetailsProductsProps extends WithStyles { + lines: OrderDetails_order_lines[]; + onOrderLineChange: (id: string, data: FormData) => void; + onOrderLineRemove: (id: string) => void; +} + +const OrderDraftDetailsProducts = withStyles(styles, { + name: "OrderDraftDetailsProducts" +})( + ({ + classes, + lines, + onOrderLineChange, + onOrderLineRemove + }: OrderDraftDetailsProductsProps) => ( + + {maybe(() => !!lines.length) && ( + + + + {i18n.t("Product", { context: "table header" })} + + + {i18n.t("Quantity", { context: "table header" })} + + + {i18n.t("Price", { context: "table header" })} + + + {i18n.t("Total", { context: "table header" })} + + + + + )} + + {maybe(() => lines.length) === 0 ? ( + + + {i18n.t("No Products added to Order")} + + + ) : ( + renderCollection(lines, line => ( + + line.thumbnail.url)} /> + + {maybe(() => line.productName && line.productSku) ? ( + <> + {line.productName} + {line.productSku} + + ) : ( + + )} + + + {maybe(() => line.quantity) ? ( +
    onOrderLineChange(line.id, data)} + > + {({ change, data, hasChanged, submit }) => ( + + {debounce => ( + + )} + + )} + + ) : ( + + )} +
    + + {maybe(() => line.unitPrice.net) ? ( + + ) : ( + + )} + + + {maybe(() => line.unitPrice.net && line.quantity) ? ( + + ) : ( + + )} + + + onOrderLineRemove(line.id)}> + + + +
    + )) + )} +
    +
    + ) +); +OrderDraftDetailsProducts.displayName = "OrderDraftDetailsProducts"; +export default OrderDraftDetailsProducts; diff --git a/src/orders/components/OrderDraftDetailsProducts/index.ts b/src/orders/components/OrderDraftDetailsProducts/index.ts new file mode 100644 index 000000000..75f2b953f --- /dev/null +++ b/src/orders/components/OrderDraftDetailsProducts/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderDraftDetailsProducts"; +export * from "./OrderDraftDetailsProducts"; diff --git a/src/orders/components/OrderDraftDetailsSummary/OrderDraftDetailsSummary.tsx b/src/orders/components/OrderDraftDetailsSummary/OrderDraftDetailsSummary.tsx new file mode 100644 index 000000000..70eebafd1 --- /dev/null +++ b/src/orders/components/OrderDraftDetailsSummary/OrderDraftDetailsSummary.tsx @@ -0,0 +1,123 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import Link from "@saleor/components/Link"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { OrderDetails_order } from "../../types/OrderDetails"; + +const styles = (theme: Theme) => + createStyles({ + root: { + ...theme.typography.body2, + lineHeight: 1.9, + width: "100%" + }, + textRight: { + textAlign: "right" + } + }); + +interface OrderDraftDetailsSummaryProps extends WithStyles { + order: OrderDetails_order; + onShippingMethodEdit: () => void; +} + +const OrderDraftDetailsSummary = withStyles(styles, { + name: "OrderDraftDetailsSummary" +})( + ({ classes, order, onShippingMethodEdit }: OrderDraftDetailsSummaryProps) => ( + + + + {maybe(() => order.subtotal) ? ( + <> + + + + ) : ( + + )} + + + {order && + order.shippingMethod !== undefined && + order.shippingMethodName !== undefined ? ( + order.shippingMethod === null ? ( + order.availableShippingMethods && + order.availableShippingMethods.length > 0 ? ( + + ) : ( + + ) + ) : ( + <> + + + + ) + ) : ( + + )} + + + {maybe(() => order.total.tax) !== undefined ? ( + <> + + + + ) : ( + + )} + + + {maybe(() => order.total.gross) !== undefined ? ( + <> + + + + ) : ( + + )} + + +
    {i18n.t("Subtotal")} + + + +
    + + {i18n.t("Add shipping carrier")} + + {i18n.t("No applicable shipping carriers")} + + {order.shippingMethodName} + + + {maybe(() => order.shippingPrice) ? ( + + ) : ( + "---" + )} + + +
    {i18n.t("Taxes (VAT included)")} + + + +
    {i18n.t("Total")} + + + +
    + ) +); +OrderDraftDetailsSummary.displayName = "OrderDraftDetailsSummary"; +export default OrderDraftDetailsSummary; diff --git a/src/orders/components/OrderDraftDetailsSummary/index.ts b/src/orders/components/OrderDraftDetailsSummary/index.ts new file mode 100644 index 000000000..78bbd58f0 --- /dev/null +++ b/src/orders/components/OrderDraftDetailsSummary/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderDraftDetailsSummary"; +export * from "./OrderDraftDetailsSummary"; diff --git a/src/orders/components/OrderDraftFinalizeDialog/OrderDraftFinalizeDialog.tsx b/src/orders/components/OrderDraftFinalizeDialog/OrderDraftFinalizeDialog.tsx new file mode 100644 index 000000000..4238d299e --- /dev/null +++ b/src/orders/components/OrderDraftFinalizeDialog/OrderDraftFinalizeDialog.tsx @@ -0,0 +1,92 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import i18n from "../../../i18n"; + +export type OrderDraftFinalizeWarning = + | "no-shipping" + | "no-billing" + | "no-user" + | "no-shipping-method" + | "unnecessary-shipping-method"; + +export interface OrderDraftFinalizeDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + orderNumber: string; + warnings: OrderDraftFinalizeWarning[]; + onClose: () => void; + onConfirm: () => void; +} + +const warningToText = (warning: OrderDraftFinalizeWarning) => { + switch (warning) { + case "no-shipping": + return i18n.t("No shipping address"); + case "no-billing": + return i18n.t("No billing address"); + case "no-user": + return i18n.t("No user information"); + case "no-shipping-method": + return i18n.t("Some products require shipping, but no method provided"); + case "unnecessary-shipping-method": + return i18n.t("Shipping method provided, but no product requires it"); + } +}; + +const OrderDraftFinalizeDialog: React.StatelessComponent< + OrderDraftFinalizeDialogProps +> = ({ + confirmButtonState, + open, + warnings, + onClose, + onConfirm, + orderNumber +}) => ( + 0 ? i18n.t("Finalize anyway") : i18n.t("Finalize") + } + confirmButtonState={confirmButtonState} + variant={warnings.length > 0 ? "delete" : "default"} + > + + {warnings.length > 0 && ( + <> +

    + {i18n.t( + "There are missing or incorrect informations about this order:" + )} +

    +
      + {warnings.map(warning => ( +
    • {warningToText(warning)}
    • + ))} +
    + + )} + #{{ number }}?", + { + context: "modal", + number: orderNumber + } + ) + }} + /> +
    +
    +); +OrderDraftFinalizeDialog.displayName = "OrderDraftFinalize"; +export default OrderDraftFinalizeDialog; diff --git a/src/orders/components/OrderDraftFinalizeDialog/index.ts b/src/orders/components/OrderDraftFinalizeDialog/index.ts new file mode 100644 index 000000000..8867a8bca --- /dev/null +++ b/src/orders/components/OrderDraftFinalizeDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderDraftFinalizeDialog"; +export * from "./OrderDraftFinalizeDialog"; diff --git a/src/orders/components/OrderDraftList/OrderDraftList.tsx b/src/orders/components/OrderDraftList/OrderDraftList.tsx new file mode 100644 index 000000000..b0c25797d --- /dev/null +++ b/src/orders/components/OrderDraftList/OrderDraftList.tsx @@ -0,0 +1,189 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import { DateTime } from "@saleor/components/Date"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { + maybe, + renderCollection, + transformOrderStatus, + transformPaymentStatus +} from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { OrderDraftList_draftOrders_edges_node } from "../../types/OrderDraftList"; + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colCustomer: { + width: 300 + }, + colDate: { + width: 300 + }, + colNumber: { + width: 120 + }, + colTotal: {} + }, + colCustomer: {}, + colDate: {}, + colNumber: {}, + colTotal: { + textAlign: "right" + }, + link: { + cursor: "pointer" + } + }); + +interface OrderDraftListProps + extends ListProps, + ListActions, + WithStyles { + orders: OrderDraftList_draftOrders_edges_node[]; +} + +export const OrderDraftList = withStyles(styles, { name: "OrderDraftList" })( + ({ + classes, + disabled, + orders, + pageInfo, + onPreviousPage, + onNextPage, + onRowClick, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: OrderDraftListProps) => { + const orderDraftList = orders + ? orders.map(order => ({ + ...order, + paymentStatus: transformPaymentStatus(order.paymentStatus), + status: transformOrderStatus(order.status) + })) + : undefined; + return ( + + + + {i18n.t("No. of Order", { context: "table header" })} + + + {i18n.t("Date", { context: "table header" })} + + + {i18n.t("Customer", { context: "table header" })} + + + {i18n.t("Total", { context: "table header" })} + + + + + + + + + {renderCollection( + orderDraftList, + order => { + const isSelected = order ? isChecked(order.id) : false; + + return ( + + + toggle(order.id)} + /> + + + {maybe(() => order.number) ? ( + "#" + order.number + ) : ( + + )} + + + {maybe(() => order.created) ? ( + + ) : ( + + )} + + + {maybe(() => order.billingAddress) ? ( + <> + {order.billingAddress.firstName} +   + {order.billingAddress.lastName} + + ) : maybe(() => order.userEmail) !== undefined ? ( + order.userEmail + ) : ( + + )} + + + {maybe(() => order.total.gross) ? ( + + ) : ( + + )} + + + ); + }, + () => ( + + {i18n.t("No orders found")} + + ) + )} + +
    + ); + } +); +OrderDraftList.displayName = "OrderDraftList"; +export default OrderDraftList; diff --git a/src/orders/components/OrderDraftList/index.ts b/src/orders/components/OrderDraftList/index.ts new file mode 100644 index 000000000..96f0cae70 --- /dev/null +++ b/src/orders/components/OrderDraftList/index.ts @@ -0,0 +1,2 @@ +export { default } from './OrderDraftList'; +export * from './OrderDraftList'; \ No newline at end of file diff --git a/src/orders/components/OrderDraftListPage/OrderDraftListPage.tsx b/src/orders/components/OrderDraftListPage/OrderDraftListPage.tsx new file mode 100644 index 000000000..9e9d2235c --- /dev/null +++ b/src/orders/components/OrderDraftListPage/OrderDraftListPage.tsx @@ -0,0 +1,39 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { OrderDraftList_draftOrders_edges_node } from "../../types/OrderDraftList"; +import OrderDraftList from "../OrderDraftList"; + +export interface OrderDraftListPageProps extends PageListProps, ListActions { + orders: OrderDraftList_draftOrders_edges_node[]; +} + +const OrderDraftListPage: React.StatelessComponent = ({ + disabled, + onAdd, + ...listProps +}) => ( + + + + + + + + +); +OrderDraftListPage.displayName = "OrderDraftListPage"; +export default OrderDraftListPage; diff --git a/src/orders/components/OrderDraftListPage/index.ts b/src/orders/components/OrderDraftListPage/index.ts new file mode 100644 index 000000000..5814e7cb1 --- /dev/null +++ b/src/orders/components/OrderDraftListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from './OrderDraftListPage'; +export * from './OrderDraftListPage'; \ No newline at end of file diff --git a/src/orders/components/OrderDraftPage/OrderDraftPage.tsx b/src/orders/components/OrderDraftPage/OrderDraftPage.tsx new file mode 100644 index 000000000..074d3a65d --- /dev/null +++ b/src/orders/components/OrderDraftPage/OrderDraftPage.tsx @@ -0,0 +1,155 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardMenu from "@saleor/components/CardMenu"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import { Container } from "@saleor/components/Container"; +import { DateTime } from "@saleor/components/Date"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import Skeleton from "@saleor/components/Skeleton"; +import { SearchCustomers_customers_edges_node } from "../../../containers/SearchCustomers/types/SearchCustomers"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { DraftOrderInput } from "../../../types/globalTypes"; +import { OrderDetails_order } from "../../types/OrderDetails"; +import OrderCustomer from "../OrderCustomer"; +import OrderDraftDetails from "../OrderDraftDetails/OrderDraftDetails"; +import { FormData as OrderDraftDetailsProductsFormData } from "../OrderDraftDetailsProducts"; +import OrderHistory, { FormData as HistoryFormData } from "../OrderHistory"; + +const styles = (theme: Theme) => + createStyles({ + date: { + marginBottom: theme.spacing.unit * 3, + marginLeft: theme.spacing.unit * 7 + }, + header: { + marginBottom: 0 + } + }); + +export interface OrderDraftPageProps extends WithStyles { + disabled: boolean; + order: OrderDetails_order; + users: SearchCustomers_customers_edges_node[]; + usersLoading: boolean; + countries: Array<{ + code: string; + label: string; + }>; + saveButtonBarState: ConfirmButtonTransitionState; + fetchUsers: (query: string) => void; + onBack: () => void; + onBillingAddressEdit: () => void; + onCustomerEdit: (data: DraftOrderInput) => void; + onDraftFinalize: () => void; + onDraftRemove: () => void; + onNoteAdd: (data: HistoryFormData) => void; + onOrderLineAdd: () => void; + onOrderLineChange: ( + id: string, + data: OrderDraftDetailsProductsFormData + ) => void; + onOrderLineRemove: (id: string) => void; + onProductClick: (id: string) => void; + onShippingAddressEdit: () => void; + onShippingMethodEdit: () => void; + onProfileView: () => void; +} + +const OrderDraftPage = withStyles(styles, { name: "OrderDraftPage" })( + ({ + classes, + disabled, + fetchUsers, + saveButtonBarState, + onBack, + onBillingAddressEdit, + onCustomerEdit, + onDraftFinalize, + onDraftRemove, + onNoteAdd, + onOrderLineAdd, + onOrderLineChange, + onOrderLineRemove, + onShippingAddressEdit, + onShippingMethodEdit, + onProfileView, + order, + users, + usersLoading + }: OrderDraftPageProps) => ( + + {i18n.t("Orders")} + order.number) ? "#" + order.number : undefined} + > + + +
    + {order && order.created ? ( + + + + ) : ( + + )} +
    + +
    + + order.events)} + onNoteAdd={onNoteAdd} + /> +
    +
    + +
    +
    + order.canFinalize)} + onCancel={onBack} + onSave={onDraftFinalize} + labels={{ save: i18n.t("Finalize", { context: "button" }) }} + /> +
    + ) +); +OrderDraftPage.displayName = "OrderDraftPage"; +export default OrderDraftPage; diff --git a/src/orders/components/OrderDraftPage/index.ts b/src/orders/components/OrderDraftPage/index.ts new file mode 100644 index 000000000..4d4fa008b --- /dev/null +++ b/src/orders/components/OrderDraftPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderDraftPage"; +export * from "./OrderDraftPage"; diff --git a/src/orders/components/OrderFulfillment/OrderFulfillment.tsx b/src/orders/components/OrderFulfillment/OrderFulfillment.tsx new file mode 100644 index 000000000..2672675e2 --- /dev/null +++ b/src/orders/components/OrderFulfillment/OrderFulfillment.tsx @@ -0,0 +1,198 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardActions from "@material-ui/core/CardActions"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardMenu from "@saleor/components/CardMenu"; +import CardTitle from "@saleor/components/CardTitle"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { FulfillmentStatus } from "../../../types/globalTypes"; +import { OrderDetails_order_fulfillments } from "../../types/OrderDetails"; + +const styles = (theme: Theme) => + createStyles({ + clickableRow: { + cursor: "pointer" + }, + orderNumber: { + display: "inline", + marginLeft: theme.spacing.unit + }, + statusBar: { + paddingTop: 0 + }, + textCenter: { + textAlign: "center" + }, + textRight: { + textAlign: "right" + }, + wideCell: { + width: "50%" + } + }); + +interface OrderFulfillmentProps extends WithStyles { + fulfillment: OrderDetails_order_fulfillments; + orderNumber: string; + onOrderFulfillmentCancel: () => void; + onTrackingCodeAdd: () => void; +} + +const OrderFulfillment = withStyles(styles, { name: "OrderFulfillment" })( + ({ + classes, + fulfillment, + orderNumber, + onOrderFulfillmentCancel, + onTrackingCodeAdd + }: OrderFulfillmentProps) => { + const lines = maybe(() => fulfillment.lines); + const status = maybe(() => fulfillment.status); + return ( + + + {status === FulfillmentStatus.FULFILLED + ? i18n.t("Fulfilled ({{ quantity }})", { + quantity: lines + .map(line => line.quantity) + .reduce((prev, curr) => prev + curr, 0) + }) + : i18n.t("Cancelled ({{ quantity }})", { + quantity: lines + .map(line => line.quantity) + .reduce((prev, curr) => prev + curr, 0) + })} + + {maybe( + () => `#${orderNumber}-${fulfillment.fulfillmentOrder}` + )} + + + } + status={ + status === FulfillmentStatus.FULFILLED ? "success" : "error" + } + /> + ) : ( + + ) + } + toolbar={ + maybe(() => fulfillment.status) === FulfillmentStatus.FULFILLED && ( + + ) + } + /> + + + + + {i18n.t("Product")} + + + {i18n.t("Quantity")} + + + {i18n.t("Price")} + + + {i18n.t("Total")} + + + + + {renderCollection(lines, line => ( + line.id)} + > + line.orderLine.thumbnail.url)} + /> + + {maybe(() => line.orderLine.productName) || } + + + {maybe(() => line.quantity) || } + + + {maybe(() => line.orderLine.unitPrice.gross) ? ( + + ) : ( + + )} + + + {maybe( + () => line.quantity * line.orderLine.unitPrice.gross.amount + ) ? ( + + ) : ( + + )} + + + ))} + {maybe(() => fulfillment.trackingNumber) && ( + + + {i18n.t("Tracking Number: {{ trackingNumber }}", { + trackingNumber: fulfillment.trackingNumber + })} + + + )} + +
    + {status === FulfillmentStatus.FULFILLED && !fulfillment.trackingNumber && ( + + + + )} +
    + ); + } +); +OrderFulfillment.displayName = "OrderFulfillment"; +export default OrderFulfillment; diff --git a/src/orders/components/OrderFulfillment/index.ts b/src/orders/components/OrderFulfillment/index.ts new file mode 100644 index 000000000..ca836178f --- /dev/null +++ b/src/orders/components/OrderFulfillment/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderFulfillment"; +export * from "./OrderFulfillment"; diff --git a/src/orders/components/OrderFulfillmentCancelDialog/OrderFulfillmentCancelDialog.tsx b/src/orders/components/OrderFulfillmentCancelDialog/OrderFulfillmentCancelDialog.tsx new file mode 100644 index 000000000..992db9000 --- /dev/null +++ b/src/orders/components/OrderFulfillmentCancelDialog/OrderFulfillmentCancelDialog.tsx @@ -0,0 +1,92 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import Form from "@saleor/components/Form"; +import i18n from "../../../i18n"; + +export interface FormData { + restock: boolean; +} + +const styles = (theme: Theme) => + createStyles({ + deleteButton: { + "&:hover": { + backgroundColor: theme.palette.error.main + }, + backgroundColor: theme.palette.error.main, + color: theme.palette.error.contrastText + } + }); + +interface OrderFulfillmentCancelDialogProps extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + onClose(); + onConfirm(data: FormData); +} + +const OrderFulfillmentCancelDialog = withStyles(styles, { + name: "OrderFulfillmentCancelDialog" +})( + ({ + confirmButtonState, + classes, + open, + onConfirm, + onClose + }: OrderFulfillmentCancelDialogProps) => ( + +
    + {({ change, data, submit }) => ( + <> + + {i18n.t("Cancel fulfillment", { context: "title" })} + + + + {i18n.t("Are you sure you want to cancel this fulfillment?")} + + + + + + + {i18n.t("Cancel fulfillment", { context: "button" })} + + + + )} +
    +
    + ) +); +OrderFulfillmentCancelDialog.displayName = "OrderFulfillmentCancelDialog"; +export default OrderFulfillmentCancelDialog; diff --git a/src/orders/components/OrderFulfillmentCancelDialog/index.ts b/src/orders/components/OrderFulfillmentCancelDialog/index.ts new file mode 100644 index 000000000..5243bf630 --- /dev/null +++ b/src/orders/components/OrderFulfillmentCancelDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderFulfillmentCancelDialog"; +export * from "./OrderFulfillmentCancelDialog"; diff --git a/src/orders/components/OrderFulfillmentDialog/OrderFulfillmentDialog.tsx b/src/orders/components/OrderFulfillmentDialog/OrderFulfillmentDialog.tsx new file mode 100644 index 000000000..23370da00 --- /dev/null +++ b/src/orders/components/OrderFulfillmentDialog/OrderFulfillmentDialog.tsx @@ -0,0 +1,185 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import { FormSpacer } from "@saleor/components/FormSpacer"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { OrderDetails_order_lines } from "../../types/OrderDetails"; + +export interface FormData { + lines: number[]; + trackingNumber: string; +} + +const styles = (theme: Theme) => + createStyles({ + avatarCell: { + paddingLeft: theme.spacing.unit * 2, + paddingRight: theme.spacing.unit * 3, + width: theme.spacing.unit * 5 + }, + quantityInput: { + width: "4rem" + }, + quantityInputContainer: { + paddingRight: theme.spacing.unit, + textAlign: "right" as "right" + }, + remainingQuantity: { + paddingBottom: 4 + }, + textRight: { + textAlign: "right" as "right" + } + }); + +export interface OrderFulfillmentDialogProps extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + lines: OrderDetails_order_lines[]; + onClose(); + onSubmit(data: FormData); +} + +const OrderFulfillmentDialog = withStyles(styles, { + name: "OrderFulfillmentDialog" +})( + ({ + classes, + confirmButtonState, + open, + lines, + onClose, + onSubmit + }: OrderFulfillmentDialogProps) => ( + +
    + lines.map( + product => product.quantity - product.quantityFulfilled + ), + [] + ), + trackingNumber: "" + }} + onSubmit={onSubmit} + > + {({ data, change }) => { + const handleQuantityChange = ( + productIndex: number, + event: React.ChangeEvent + ) => { + const newData = data.lines; + newData[productIndex] = event.target.value; + change({ + target: { + name: "lines", + value: newData + } + } as any); + }; + return ( + <> + {i18n.t("Fulfill products")} + + + + + {i18n.t("Product name")} + {i18n.t("SKU")} + + {i18n.t("Quantity")} + + + + + {lines.map((product, productIndex) => { + const remainingQuantity = + product.quantity - product.quantityFulfilled; + return ( + + product.thumbnail.url)} + /> + {product.productName} + {product.productSku} + + + handleQuantityChange(productIndex, event) + } + error={remainingQuantity < data.lines[productIndex]} + /> + + +
    + / {remainingQuantity} +
    +
    +
    + ); + })} +
    +
    + + + + + + + + {i18n.t("Confirm", { context: "button" })} + + + + ); + }} + +
    + ) +); +OrderFulfillmentDialog.displayName = "OrderFulfillmentDialog"; +export default OrderFulfillmentDialog; diff --git a/src/orders/components/OrderFulfillmentDialog/index.ts b/src/orders/components/OrderFulfillmentDialog/index.ts new file mode 100644 index 000000000..5a977a6c0 --- /dev/null +++ b/src/orders/components/OrderFulfillmentDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderFulfillmentDialog"; +export * from "./OrderFulfillmentDialog"; diff --git a/src/orders/components/OrderFulfillmentTrackingDialog/OrderFulfillmentTrackingDialog.tsx b/src/orders/components/OrderFulfillmentTrackingDialog/OrderFulfillmentTrackingDialog.tsx new file mode 100644 index 000000000..0f6c9e9c3 --- /dev/null +++ b/src/orders/components/OrderFulfillmentTrackingDialog/OrderFulfillmentTrackingDialog.tsx @@ -0,0 +1,65 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import i18n from "../../../i18n"; + +export interface FormData { + trackingNumber: string; +} + +interface OrderFulfillmentTrackingDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + trackingNumber: string; + onClose(); + onConfirm(data: FormData); +} + +const OrderFulfillmentTrackingDialog: React.StatelessComponent< + OrderFulfillmentTrackingDialogProps +> = ({ confirmButtonState, open, trackingNumber, onConfirm, onClose }) => ( + +
    + {({ change, data, submit }) => ( + <> + + {i18n.t("Add tracking code", { context: "title" })} + + + + + + + + {i18n.t("Confirm", { context: "button" })} + + + + )} +
    +
    +); +OrderFulfillmentTrackingDialog.displayName = "OrderFulfillmentTrackingDialog"; +export default OrderFulfillmentTrackingDialog; diff --git a/src/orders/components/OrderFulfillmentTrackingDialog/index.ts b/src/orders/components/OrderFulfillmentTrackingDialog/index.ts new file mode 100644 index 000000000..f5b81a505 --- /dev/null +++ b/src/orders/components/OrderFulfillmentTrackingDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderFulfillmentTrackingDialog"; +export * from "./OrderFulfillmentTrackingDialog"; diff --git a/src/orders/components/OrderHistory/OrderHistory.tsx b/src/orders/components/OrderHistory/OrderHistory.tsx new file mode 100644 index 000000000..93dda34e4 --- /dev/null +++ b/src/orders/components/OrderHistory/OrderHistory.tsx @@ -0,0 +1,208 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import Form from "@saleor/components/Form"; +import Hr from "@saleor/components/Hr"; +import Skeleton from "@saleor/components/Skeleton"; +import { + Timeline, + TimelineAddNote, + TimelineEvent, + TimelineNote +} from "@saleor/components/Timeline"; +import i18n from "../../../i18n"; +import { + OrderEventsEmailsEnum, + OrderEventsEnum +} from "../../../types/globalTypes"; +import { OrderDetails_order_events } from "../../types/OrderDetails"; + +export interface FormData { + message: string; +} + +const getEventMessage = (event: OrderDetails_order_events) => { + switch (event.type) { + case OrderEventsEnum.CANCELED: + return i18n.t("Order was cancelled", { + context: "order history message" + }); + case OrderEventsEnum.DRAFT_ADDED_PRODUCTS: + return i18n.t("Products were added to draft order", { + context: "order history message" + }); + case OrderEventsEnum.DRAFT_CREATED: + return i18n.t("Draft order was created", { + context: "order history message" + }); + case OrderEventsEnum.DRAFT_REMOVED_PRODUCTS: + return i18n.t("Products were removed from draft order", { + context: "order history message" + }); + case OrderEventsEnum.EMAIL_SENT: + switch (event.emailType) { + case OrderEventsEmailsEnum.DIGITAL_LINKS: + return i18n.t("Links to the order's digital goods were sent", { + context: "order history message" + }); + case OrderEventsEmailsEnum.FULFILLMENT_CONFIRMATION: + return i18n.t("Fulfillment confirmation was sent to customer", { + context: "order history message" + }); + case OrderEventsEmailsEnum.ORDER_CONFIRMATION: + return i18n.t("Order confirmation was sent to customer", { + context: "order history message" + }); + case OrderEventsEmailsEnum.PAYMENT_CONFIRMATION: + return i18n.t("Payment confirmation was sent to customer", { + context: "order history message" + }); + case OrderEventsEmailsEnum.SHIPPING_CONFIRMATION: + return i18n.t("Shipping details was sent to customer", { + context: "order history message" + }); + case OrderEventsEmailsEnum.TRACKING_UPDATED: + return i18n.t("Shipping tracking number was sent to customer", { + context: "order history message" + }); + } + case OrderEventsEnum.FULFILLMENT_CANCELED: + return i18n.t("Fulfillment was cancelled", { + context: "order history message" + }); + case OrderEventsEnum.FULFILLMENT_FULFILLED_ITEMS: + return i18n.t("Fulfilled {{ quantity }} items", { + context: "order history message", + quantity: event.quantity + }); + case OrderEventsEnum.FULFILLMENT_RESTOCKED_ITEMS: + return i18n.t("Restocked {{ quantity }} items", { + context: "order history message", + quantity: event.quantity + }); + case OrderEventsEnum.NOTE_ADDED: + return i18n.t("Note was added to the order", { + context: "order history message" + }); + case OrderEventsEnum.ORDER_FULLY_PAID: + return i18n.t("Order was fully paid", { + context: "order history message" + }); + case OrderEventsEnum.ORDER_MARKED_AS_PAID: + return i18n.t("Marked order as paid", { + context: "order history message" + }); + case OrderEventsEnum.OTHER: + return event.message; + case OrderEventsEnum.OVERSOLD_ITEMS: + return i18n.t("Oversold {{ quantity }} items", { + context: "order history message", + quantity: event.quantity + }); + case OrderEventsEnum.PAYMENT_CAPTURED: + return i18n.t("Payment was captured", { + context: "order history message" + }); + case OrderEventsEnum.PAYMENT_FAILED: + return i18n.t("Payment failed", { + context: "order history message" + }); + case OrderEventsEnum.PAYMENT_REFUNDED: + return i18n.t("Payment was refunded", { + context: "order history message" + }); + case OrderEventsEnum.PAYMENT_VOIDED: + return i18n.t("Payment was voided", { + context: "order history message" + }); + case OrderEventsEnum.PLACED: + return i18n.t("Order was placed", { + context: "order history message" + }); + case OrderEventsEnum.PLACED_FROM_DRAFT: + return i18n.t("Order was created from draft", { + context: "order history message" + }); + case OrderEventsEnum.TRACKING_UPDATED: + return i18n.t("Updated fulfillment group's tracking number", { + context: "order history message" + }); + case OrderEventsEnum.UPDATED_ADDRESS: + return i18n.t("Order address was updated", { + context: "order history message" + }); + } +}; + +const styles = (theme: Theme) => + createStyles({ + header: { + fontWeight: 500, + marginBottom: theme.spacing.unit + }, + root: { marginTop: theme.spacing.unit * 4 }, + user: { + marginBottom: theme.spacing.unit + } + }); + +interface OrderHistoryProps extends WithStyles { + history: OrderDetails_order_events[]; + onNoteAdd: (data: FormData) => void; +} + +const OrderHistory = withStyles(styles, { name: "OrderHistory" })( + ({ classes, history, onNoteAdd }: OrderHistoryProps) => ( +
    + + {i18n.t("Order History")} + +
    + {history ? ( + +
    + {({ change, data, submit }) => ( + + )} + + {history + .slice() + .reverse() + .map(event => { + if (event.type === OrderEventsEnum.NOTE_ADDED) { + return ( + + ); + } + return ( + + ); + })} +
    + ) : ( + + )} +
    + ) +); +OrderHistory.displayName = "OrderHistory"; +export default OrderHistory; diff --git a/src/orders/components/OrderHistory/index.ts b/src/orders/components/OrderHistory/index.ts new file mode 100644 index 000000000..271408ddf --- /dev/null +++ b/src/orders/components/OrderHistory/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderHistory"; +export * from "./OrderHistory"; diff --git a/src/orders/components/OrderList/OrderList.tsx b/src/orders/components/OrderList/OrderList.tsx new file mode 100644 index 000000000..67b0e01b5 --- /dev/null +++ b/src/orders/components/OrderList/OrderList.tsx @@ -0,0 +1,224 @@ +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import { DateTime } from "@saleor/components/Date"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { + maybe, + renderCollection, + transformOrderStatus, + transformPaymentStatus +} from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { OrderList_orders_edges_node } from "../../types/OrderList"; + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colCustomer: { + width: 220 + }, + colDate: {}, + colFulfillment: { + width: 230 + }, + colNumber: { + width: 120 + }, + colPayment: { + width: 220 + }, + colTotal: {} + }, + colCustomer: {}, + colDate: {}, + colFulfillment: {}, + colNumber: {}, + colPayment: {}, + colTotal: { + textAlign: "right" + }, + link: { + cursor: "pointer" + } + }); + +interface OrderListProps + extends ListProps, + ListActions, + WithStyles { + orders: OrderList_orders_edges_node[]; +} + +export const OrderList = withStyles(styles, { name: "OrderList" })( + ({ + classes, + disabled, + orders, + pageInfo, + onPreviousPage, + onNextPage, + onRowClick, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: OrderListProps) => { + const orderList = orders + ? orders.map(order => ({ + ...order, + paymentStatus: transformPaymentStatus(order.paymentStatus), + status: transformOrderStatus(order.status) + })) + : undefined; + return ( + + + + {i18n.t("No. of Order", { context: "table header" })} + + + {i18n.t("Date", { context: "table header" })} + + + {i18n.t("Customer", { context: "table header" })} + + + {i18n.t("Payment", { context: "table header" })} + + + {i18n.t("Fulfillment status", { context: "table header" })} + + + {i18n.t("Total", { context: "table header" })} + + + + + + + + + {renderCollection( + orderList, + order => { + const isSelected = order ? isChecked(order.id) : false; + + return ( + + + toggle(order.id)} + /> + + + {maybe(() => order.number) ? ( + "#" + order.number + ) : ( + + )} + + + {maybe(() => order.created) ? ( + + ) : ( + + )} + + + {maybe(() => order.billingAddress) ? ( + <> + {order.billingAddress.firstName} +   + {order.billingAddress.lastName} + + ) : maybe(() => order.userEmail) !== undefined ? ( + order.userEmail + ) : ( + + )} + + + {maybe(() => order.paymentStatus.status) !== undefined ? ( + order.paymentStatus.status === null ? null : ( + + ) + ) : ( + + )} + + + {maybe(() => order.status) ? ( + + ) : ( + + )} + + + {maybe(() => order.total.gross) ? ( + + ) : ( + + )} + + + ); + }, + () => ( + + {i18n.t("No orders found")} + + ) + )} + +
    + ); + } +); +OrderList.displayName = "OrderList"; +export default OrderList; diff --git a/src/orders/components/OrderList/index.ts b/src/orders/components/OrderList/index.ts new file mode 100644 index 000000000..0dea1ff58 --- /dev/null +++ b/src/orders/components/OrderList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderList"; +export * from "./OrderList"; diff --git a/src/orders/components/OrderListFilter/OrderListFilter.tsx b/src/orders/components/OrderListFilter/OrderListFilter.tsx new file mode 100644 index 000000000..6fe3b547d --- /dev/null +++ b/src/orders/components/OrderListFilter/OrderListFilter.tsx @@ -0,0 +1,128 @@ +import * as moment from "moment-timezone"; +import * as React from "react"; + +import { DateContext } from "@saleor/components/Date/DateContext"; +import { FieldType, IFilter } from "@saleor/components/Filter"; +import FilterBar from "@saleor/components/FilterBar"; +import TimezoneContext from "@saleor/components/Timezone"; +import i18n from "../../../i18n"; +import { FilterProps } from "../../../types"; +import { OrderStatusFilter } from "../../../types/globalTypes"; +import { OrderListUrlFilters } from "../../urls"; + +type OrderListFilterProps = FilterProps; + +export enum OrderFilterKeys { + date, + dateEqual, + dateRange, + dateLastWeek, + dateLastMonth, + dateLastYear, + email, + fulfillment +} + +const OrderListFilter: React.FC = props => { + const date = React.useContext(DateContext); + const tz = React.useContext(TimezoneContext); + + const filterMenu: IFilter = [ + { + children: [ + { + children: [], + data: { + fieldLabel: null, + type: FieldType.hidden, + value: (tz ? moment(date).tz(tz) : moment(date)) + .subtract(7, "days") + .toISOString() + .split("T")[0] // Remove timezone + }, + label: i18n.t("Last 7 Days"), + value: OrderFilterKeys.dateLastWeek.toString() + }, + { + children: [], + data: { + fieldLabel: null, + type: FieldType.hidden, + value: (tz ? moment(date).tz(tz) : moment(date)) + .subtract(30, "days") + .toISOString() + .split("T")[0] // Remove timezone + }, + label: i18n.t("Last 30 Days"), + value: OrderFilterKeys.dateLastMonth.toString() + }, + { + children: [], + data: { + fieldLabel: null, + type: FieldType.hidden, + value: (tz ? moment(date).tz(tz) : moment(date)) + .subtract(1, "years") + .toISOString() + .split("T")[0] // Remove timezone + }, + label: i18n.t("Last Year"), + value: OrderFilterKeys.dateLastYear.toString() + }, + { + children: [], + data: { + additionalText: i18n.t("equals"), + fieldLabel: null, + type: FieldType.date + }, + label: i18n.t("Specific Date"), + value: OrderFilterKeys.dateEqual.toString() + }, + { + children: [], + data: { + fieldLabel: i18n.t("Range"), + type: FieldType.rangeDate + }, + label: i18n.t("Range"), + value: OrderFilterKeys.dateRange.toString() + } + ], + data: { + fieldLabel: i18n.t("Date"), + type: FieldType.select + }, + label: i18n.t("Date"), + value: OrderFilterKeys.date.toString() + }, + { + children: [], + data: { + additionalText: i18n.t("is set as"), + fieldLabel: i18n.t("Status"), + options: [ + { + label: i18n.t("Fulfilled"), + value: OrderStatusFilter.FULFILLED.toString() + }, + { + label: i18n.t("Partially Fulfilled"), + value: OrderStatusFilter.PARTIALLY_FULFILLED.toString() + }, + { + label: i18n.t("Unfulfilled"), + value: OrderStatusFilter.UNFULFILLED.toString() + } + ], + type: FieldType.select + }, + label: i18n.t("Fulfillment Status"), + value: OrderFilterKeys.fulfillment.toString() + } + ]; + + return ; +}; +OrderListFilter.displayName = "OrderListFilter"; +export default OrderListFilter; diff --git a/src/orders/components/OrderListFilter/index.ts b/src/orders/components/OrderListFilter/index.ts new file mode 100644 index 000000000..108193863 --- /dev/null +++ b/src/orders/components/OrderListFilter/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderListFilter"; +export * from "./OrderListFilter"; diff --git a/src/orders/components/OrderListPage/OrderListPage.tsx b/src/orders/components/OrderListPage/OrderListPage.tsx new file mode 100644 index 000000000..9b20884cf --- /dev/null +++ b/src/orders/components/OrderListPage/OrderListPage.tsx @@ -0,0 +1,65 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "@saleor/i18n"; +import { FilterPageProps, ListActions, PageListProps } from "@saleor/types"; +import { OrderList_orders_edges_node } from "../../types/OrderList"; +import { OrderListUrlFilters } from "../../urls"; +import OrderList from "../OrderList"; +import OrderListFilter from "../OrderListFilter"; + +export interface OrderListPageProps + extends PageListProps, + ListActions, + FilterPageProps { + orders: OrderList_orders_edges_node[]; +} + +const OrderListPage: React.FC = ({ + currencySymbol, + currentTab, + filtersList, + filterTabs, + initialSearch, + onAdd, + onAll, + onSearchChange, + onFilterAdd, + onFilterSave, + onTabChange, + onFilterDelete, + ...listProps +}) => ( + + + + + + + + + +); +OrderListPage.displayName = "OrderListPage"; +export default OrderListPage; diff --git a/src/orders/components/OrderListPage/index.ts b/src/orders/components/OrderListPage/index.ts new file mode 100644 index 000000000..69c5cc429 --- /dev/null +++ b/src/orders/components/OrderListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderListPage"; +export * from "./OrderListPage"; diff --git a/src/orders/components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog.tsx b/src/orders/components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog.tsx new file mode 100644 index 000000000..dc32a3be7 --- /dev/null +++ b/src/orders/components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog.tsx @@ -0,0 +1,33 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import i18n from "../../../i18n"; + +export interface OrderMarkAsPaidDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + onClose: () => void; + onConfirm: () => void; +} + +const OrderMarkAsPaidDialog: React.StatelessComponent< + OrderMarkAsPaidDialogProps +> = ({ confirmButtonState, onClose, onConfirm, open }) => ( + + + {i18n.t("Are you sure you want to mark this order as paid?", { + context: "modal content" + })} + + +); +OrderMarkAsPaidDialog.displayName = "OrderMarkAsPaidDialog"; +export default OrderMarkAsPaidDialog; diff --git a/src/orders/components/OrderMarkAsPaidDialog/index.ts b/src/orders/components/OrderMarkAsPaidDialog/index.ts new file mode 100644 index 000000000..f63a32363 --- /dev/null +++ b/src/orders/components/OrderMarkAsPaidDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderMarkAsPaidDialog"; +export * from "./OrderMarkAsPaidDialog"; diff --git a/src/orders/components/OrderPayment/OrderPayment.tsx b/src/orders/components/OrderPayment/OrderPayment.tsx new file mode 100644 index 000000000..31638a022 --- /dev/null +++ b/src/orders/components/OrderPayment/OrderPayment.tsx @@ -0,0 +1,231 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardActions from "@material-ui/core/CardActions"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import { Hr } from "@saleor/components/Hr"; +import Money, { subtractMoney } from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import i18n from "../../../i18n"; +import { maybe, transformPaymentStatus } from "../../../misc"; +import { OrderAction, OrderStatus } from "../../../types/globalTypes"; +import { OrderDetails_order } from "../../types/OrderDetails"; + +const styles = (theme: Theme) => + createStyles({ + root: { + ...theme.typography.body2, + lineHeight: 1.9, + width: "100%" + }, + textRight: { + textAlign: "right" + }, + totalRow: { + fontWeight: 600 + } + }); + +interface OrderPaymentProps extends WithStyles { + order: OrderDetails_order; + onCapture: () => void; + onMarkAsPaid: () => void; + onRefund: () => void; + onVoid: () => void; +} + +const OrderPayment = withStyles(styles, { name: "OrderPayment" })( + ({ + classes, + order, + onCapture, + onMarkAsPaid, + onRefund, + onVoid + }: OrderPaymentProps) => { + const canCapture = maybe(() => order.actions, []).includes( + OrderAction.CAPTURE + ); + const canVoid = maybe(() => order.actions, []).includes(OrderAction.VOID); + const canRefund = maybe(() => order.actions, []).includes( + OrderAction.REFUND + ); + const canMarkAsPaid = maybe(() => order.actions, []).includes( + OrderAction.MARK_AS_PAID + ); + const payment = transformPaymentStatus(maybe(() => order.paymentStatus)); + return ( + + order.paymentStatus) === undefined ? ( + + ) : ( + + ) + } + /> + + + + + + + + + + + + + + + + + + + + + + + +
    {i18n.t("Subtotal")} + {maybe(() => order.lines) === undefined ? ( + + ) : ( + i18n.t("{{ quantity }} items", { + quantity: order.lines + .map(line => line.quantity) + .reduce((curr, prev) => prev + curr, 0) + }) + )} + + {maybe(() => order.subtotal.gross) === undefined ? ( + + ) : ( + + )} +
    {i18n.t("Taxes")} + {maybe(() => order.total.tax) === undefined ? ( + + ) : order.total.tax.amount > 0 ? ( + i18n.t("VAT included") + ) : ( + i18n.t("does not apply") + )} + + {maybe(() => order.total.tax) === undefined ? ( + + ) : ( + + )} +
    {i18n.t("Shipping")} + {maybe(() => order.shippingMethodName) === undefined && + maybe(() => order.shippingPrice) === undefined ? ( + + ) : order.shippingMethodName === null ? ( + i18n.t("does not apply") + ) : ( + order.shippingMethodName + )} + + {maybe(() => order.shippingPrice.gross) === undefined ? ( + + ) : ( + + )} +
    {i18n.t("Total")} + + {maybe(() => order.total.gross) === undefined ? ( + + ) : ( + + )} +
    +
    +
    + + + + + + + + + + + + + + + + +
    {i18n.t("Preauthorized amount")} + {maybe(() => order.totalAuthorized.amount) === undefined ? ( + + ) : ( + + )} +
    {i18n.t("Captured amount")} + {maybe(() => order.totalCaptured.amount) === undefined ? ( + + ) : ( + + )} +
    {i18n.t("Outstanding Balance")} + {maybe( + () => order.total.gross.amount && order.totalCaptured.amount + ) === undefined ? ( + + ) : ( + + )} +
    +
    + {maybe(() => order.status) !== OrderStatus.CANCELED && + (canCapture || canRefund || canVoid || canMarkAsPaid) && ( + <> +
    + + {canCapture && ( + + )} + {canRefund && ( + + )} + {canVoid && ( + + )} + {canMarkAsPaid && ( + + )} + + + )} +
    + ); + } +); +OrderPayment.displayName = "OrderPayment"; +export default OrderPayment; diff --git a/src/orders/components/OrderPayment/index.ts b/src/orders/components/OrderPayment/index.ts new file mode 100644 index 000000000..2a036cd60 --- /dev/null +++ b/src/orders/components/OrderPayment/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderPayment"; +export * from "./OrderPayment"; diff --git a/src/orders/components/OrderPaymentDialog/OrderPaymentDialog.tsx b/src/orders/components/OrderPaymentDialog/OrderPaymentDialog.tsx new file mode 100644 index 000000000..89a87c0fe --- /dev/null +++ b/src/orders/components/OrderPaymentDialog/OrderPaymentDialog.tsx @@ -0,0 +1,89 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import i18n from "../../../i18n"; + +export interface FormData { + amount: number; +} + +interface OrderPaymentDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + initial: number; + variant: string; + onClose: () => void; + onSubmit: (data: FormData) => void; +} + +const OrderPaymentDialog: React.StatelessComponent = ({ + confirmButtonState, + open, + initial, + variant, + onClose, + onSubmit +}) => ( + +
    { + onSubmit(data); + onClose(); + }} + > + {({ data, change, submit }) => ( + <> + + {variant === "capture" + ? i18n.t("Capture payment", { context: "title" }) + : i18n.t("Refund payment", { context: "title" })} + + + + + + + + { + onClose(); + submit(data); + }} + > + {i18n.t("Confirm", { context: "button" })} + + + + )} +
    +
    +); +OrderPaymentDialog.displayName = "OrderPaymentDialog"; +export default OrderPaymentDialog; diff --git a/src/orders/components/OrderPaymentDialog/index.ts b/src/orders/components/OrderPaymentDialog/index.ts new file mode 100644 index 000000000..b1897f5b5 --- /dev/null +++ b/src/orders/components/OrderPaymentDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderPaymentDialog"; +export * from "./OrderPaymentDialog"; diff --git a/src/orders/components/OrderPaymentVoidDialog/OrderPaymentVoidDialog.tsx b/src/orders/components/OrderPaymentVoidDialog/OrderPaymentVoidDialog.tsx new file mode 100644 index 000000000..06a36d9b3 --- /dev/null +++ b/src/orders/components/OrderPaymentVoidDialog/OrderPaymentVoidDialog.tsx @@ -0,0 +1,45 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import i18n from "../../../i18n"; + +interface OrderPaymentVoidDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + onClose?(); + onConfirm?(); +} + +const OrderPaymentVoidDialog: React.StatelessComponent< + OrderPaymentVoidDialogProps +> = ({ confirmButtonState, open, onConfirm, onClose }) => ( + + {i18n.t("Void payment", { context: "title" })} + + + {i18n.t("Are you sure you want to void this payment?")} + + + + + + {i18n.t("Confirm", { context: "button" })} + + + +); +OrderPaymentVoidDialog.displayName = "OrderPaymentVoidDialog"; +export default OrderPaymentVoidDialog; diff --git a/src/orders/components/OrderPaymentVoidDialog/index.ts b/src/orders/components/OrderPaymentVoidDialog/index.ts new file mode 100644 index 000000000..98765d423 --- /dev/null +++ b/src/orders/components/OrderPaymentVoidDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderPaymentVoidDialog"; +export * from "./OrderPaymentVoidDialog"; diff --git a/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx b/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx new file mode 100644 index 000000000..38df75cbe --- /dev/null +++ b/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx @@ -0,0 +1,349 @@ +import Button from "@material-ui/core/Button"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; +import * as InfiniteScroll from "react-infinite-scroller"; + +import Checkbox from "@saleor/components/Checkbox"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import Money from "@saleor/components/Money"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { + SearchOrderVariant_products_edges_node, + SearchOrderVariant_products_edges_node_variants +} from "../../types/SearchOrderVariant"; + +export interface FormData { + variants: SearchOrderVariant_products_edges_node_variants[]; + query: string; +} + +const styles = (theme: Theme) => + createStyles({ + avatar: { + paddingLeft: 0 + }, + content: { + maxHeight: 600, + overflowY: "scroll" + }, + grayText: { + color: theme.palette.text.disabled + }, + loadMoreLoaderContainer: { + alignItems: "center", + display: "flex", + height: theme.spacing.unit * 3, + justifyContent: "center" + }, + overflow: { + overflowY: "visible" + }, + productCheckboxCell: { + "&:first-child": { + paddingLeft: 0, + paddingRight: 0 + } + }, + textRight: { + textAlign: "right" + }, + variantCheckbox: { + left: theme.spacing.unit, + position: "relative" + }, + wideCell: { + width: "100%" + } + }); + +interface OrderProductAddDialogProps extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + products: SearchOrderVariant_products_edges_node[]; + loading: boolean; + hasMore: boolean; + onClose: () => void; + onFetch: (value: string) => void; + onFetchMore: () => void; + onSubmit: (data: FormData) => void; +} + +const initialForm: FormData = { + query: "", + variants: [] +}; + +function hasAllVariantsSelected( + productVariants: SearchOrderVariant_products_edges_node_variants[], + selectedVariants: SearchOrderVariant_products_edges_node_variants[] +): boolean { + return productVariants.reduce( + (acc, productVariant) => + acc && + !!selectedVariants.find( + selectedVariant => selectedVariant.id === productVariant.id + ), + true + ); +} + +function isVariantSelected( + variant: SearchOrderVariant_products_edges_node_variants, + selectedVariants: SearchOrderVariant_products_edges_node_variants[] +): boolean { + return !!selectedVariants.find( + selectedVariant => selectedVariant.id === variant.id + ); +} + +const OrderProductAddDialog = withStyles(styles, { + name: "OrderProductAddDialog" +})( + ({ + classes, + confirmButtonState, + open, + loading, + hasMore, + products, + onFetch, + onFetchMore, + onClose, + onSubmit + }: OrderProductAddDialogProps) => ( + +
    + {({ data, change }) => { + const selectedVariants = products + ? products.map(product => + product.variants.map(variant => + isVariantSelected(variant, data.variants) + ) + ) + : []; + const selectedProducts = products + ? products.map(product => + hasAllVariantsSelected(product.variants, data.variants) + ) + : []; + + const onProductAdd = ( + product: SearchOrderVariant_products_edges_node, + productIndex: number + ) => + selectedProducts[productIndex] + ? change({ + target: { + name: "variants", + value: data.variants.filter( + selectedVariant => + !product.variants.find( + productVariant => + productVariant.id === selectedVariant.id + ) + ) + } + } as any) + : change({ + target: { + name: "variants", + value: [ + ...data.variants, + ...product.variants.filter( + productVariant => + !data.variants.find( + selectedVariant => + selectedVariant.id === productVariant.id + ) + ) + ] + } + } as any); + const onVariantAdd = ( + variant: SearchOrderVariant_products_edges_node_variants, + variantIndex: number, + productIndex: number + ) => + selectedVariants[productIndex][variantIndex] + ? change({ + target: { + name: "variants", + value: data.variants.filter( + selectedVariant => selectedVariant.id !== variant.id + ) + } + } as any) + : change({ + target: { + name: "variants", + value: [...data.variants, variant] + } + } as any); + + return ( + <> + {i18n.t("Add product")} + + change(event, () => onFetch(data.query))} + label={i18n.t("Search Products", { + context: "product search input label" + })} + placeholder={i18n.t( + "Search by product name, attribute, product type etc...", + { + context: "product search input placeholder" + } + )} + fullWidth + InputProps={{ + autoComplete: "off", + endAdornment: loading && + }} + /> + + + + +
    + } + threshold={10} + > + + + {renderCollection( + products, + (product, productIndex) => ( + + + + + onProductAdd(product, productIndex) + } + /> + + product.thumbnail.url)} + /> + + {maybe(() => product.name)} + + + {maybe(() => product.variants, []).map( + (variant, variantIndex) => ( + + + + + onVariantAdd( + variant, + variantIndex, + productIndex + ) + } + /> + + +
    {variant.name}
    +
    + {i18n.t("SKU {{ sku }}", { + sku: variant.sku + })} +
    +
    + + + +
    + ) + )} +
    + ), + () => ( + + + {i18n.t("No products matching given query")} + + + ) + )} +
    +
    + + + + + + {i18n.t("Confirm", { context: "button" })} + + + + ); + }} + + + ) +); +OrderProductAddDialog.displayName = "OrderProductAddDialog"; +export default OrderProductAddDialog; diff --git a/src/orders/components/OrderProductAddDialog/index.ts b/src/orders/components/OrderProductAddDialog/index.ts new file mode 100644 index 000000000..b5eb5f42c --- /dev/null +++ b/src/orders/components/OrderProductAddDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderProductAddDialog"; +export * from "./OrderProductAddDialog"; diff --git a/src/orders/components/OrderShippingMethodEditDialog/OrderShippingMethodEditDialog.tsx b/src/orders/components/OrderShippingMethodEditDialog/OrderShippingMethodEditDialog.tsx new file mode 100644 index 000000000..66803c788 --- /dev/null +++ b/src/orders/components/OrderShippingMethodEditDialog/OrderShippingMethodEditDialog.tsx @@ -0,0 +1,122 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import Money from "@saleor/components/Money"; +import { SingleSelectField } from "@saleor/components/SingleSelectField"; +import i18n from "../../../i18n"; +import { OrderDetails_order_availableShippingMethods } from "../../types/OrderDetails"; + +export interface FormData { + shippingMethod: string; +} + +const styles = (theme: Theme) => + createStyles({ + dialog: { + overflowY: "visible" + }, + menuItem: { + display: "flex", + width: "100%" + }, + root: { + overflowY: "visible", + width: theme.breakpoints.values.sm + }, + shippingMethodName: { + flex: 1, + overflowX: "hidden", + textOverflow: "ellipsis" + } + }); + +interface OrderShippingMethodEditDialogProps extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + shippingMethod: string; + shippingMethods?: OrderDetails_order_availableShippingMethods[]; + onClose(); + onSubmit?(data: FormData); +} + +const OrderShippingMethodEditDialog = withStyles(styles, { + name: "OrderShippingMethodEditDialog" +})( + ({ + classes, + confirmButtonState, + open, + shippingMethod, + shippingMethods, + onClose, + onSubmit + }: OrderShippingMethodEditDialogProps) => { + const choices = shippingMethods + ? shippingMethods.map(s => ({ + label: ( +
    + {s.name} +   + + + +
    + ), + value: s.id + })) + : []; + const initialForm: FormData = { + shippingMethod + }; + return ( + + + {i18n.t("Edit shipping method", { context: "title" })} + +
    + {({ change, data }) => ( + <> + + + + + + + {i18n.t("Confirm", { context: "button" })} + + + + )} +
    +
    + ); + } +); +OrderShippingMethodEditDialog.displayName = "OrderShippingMethodEditDialog"; +export default OrderShippingMethodEditDialog; diff --git a/src/orders/components/OrderShippingMethodEditDialog/index.ts b/src/orders/components/OrderShippingMethodEditDialog/index.ts new file mode 100644 index 000000000..d7c8cf902 --- /dev/null +++ b/src/orders/components/OrderShippingMethodEditDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderShippingMethodEditDialog"; +export * from "./OrderShippingMethodEditDialog"; diff --git a/src/orders/components/OrderUnfulfilledItems/OrderUnfulfilledItems.tsx b/src/orders/components/OrderUnfulfilledItems/OrderUnfulfilledItems.tsx new file mode 100644 index 000000000..19949f23f --- /dev/null +++ b/src/orders/components/OrderUnfulfilledItems/OrderUnfulfilledItems.tsx @@ -0,0 +1,128 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardActions from "@material-ui/core/CardActions"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { OrderDetails_order_lines } from "../../types/OrderDetails"; + +const styles = createStyles({ + clickableRow: { + cursor: "pointer" + }, + textCenter: { + textAlign: "center" + }, + textRight: { + textAlign: "right" + }, + wideCell: { + width: "50%" + } +}); + +interface OrderUnfulfilledItemsProps extends WithStyles { + canFulfill: boolean; + lines: OrderDetails_order_lines[]; + onFulfill: () => void; +} + +const OrderUnfulfilledItems = withStyles(styles, { + name: "OrderUnfulfilledItems" +})(({ canFulfill, classes, lines, onFulfill }: OrderUnfulfilledItemsProps) => ( + + line.quantity - line.quantityFulfilled) + .reduce((prev, curr) => prev + curr, 0) + })} + status="error" + /> + } + /> + + + + + {i18n.t("Product")} + + + {i18n.t("Quantity")} + + {i18n.t("Price")} + {i18n.t("Total")} + + + + {lines.map(line => ( + line.id)} + > + line.thumbnail.url)} /> + + {maybe(() => line.productName) || } + + + {maybe(() => line.quantity - line.quantityFulfilled) || ( + + )} + + + {maybe(() => line.unitPrice.gross) ? ( + + ) : ( + + )} + + + {maybe( + () => + (line.quantity - line.quantityFulfilled) * + line.unitPrice.gross.amount + ) ? ( + + ) : ( + + )} + + + ))} + +
    + {canFulfill && ( + + + + )} +
    +)); +OrderUnfulfilledItems.displayName = "OrderUnfulfilledItems"; +export default OrderUnfulfilledItems; diff --git a/src/orders/components/OrderUnfulfilledItems/index.ts b/src/orders/components/OrderUnfulfilledItems/index.ts new file mode 100644 index 000000000..4d7c26864 --- /dev/null +++ b/src/orders/components/OrderUnfulfilledItems/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderUnfulfilledItems"; +export * from "./OrderUnfulfilledItems"; diff --git a/src/orders/containers/OrderOperations.tsx b/src/orders/containers/OrderOperations.tsx new file mode 100644 index 000000000..2a9297fcd --- /dev/null +++ b/src/orders/containers/OrderOperations.tsx @@ -0,0 +1,342 @@ +import * as React from "react"; + +import { getMutationProviderData } from "../../misc"; +import { PartialMutationProviderOutput } from "../../types"; +import { + TypedOrderAddNoteMutation, + TypedOrderCancelMutation, + TypedOrderCaptureMutation, + TypedOrderCreateFulfillmentMutation, + TypedOrderDraftCancelMutation, + TypedOrderDraftFinalizeMutation, + TypedOrderDraftUpdateMutation, + TypedOrderFulfillmentCancelMutation, + TypedOrderFulfillmentUpdateTrackingMutation, + TypedOrderLineDeleteMutation, + TypedOrderLinesAddMutation, + TypedOrderLineUpdateMutation, + TypedOrderMarkAsPaidMutation, + TypedOrderRefundMutation, + TypedOrderShippingMethodUpdateMutation, + TypedOrderUpdateMutation, + TypedOrderVoidMutation +} from "../mutations"; +import { OrderAddNote, OrderAddNoteVariables } from "../types/OrderAddNote"; +import { OrderCancel, OrderCancelVariables } from "../types/OrderCancel"; +import { OrderCapture, OrderCaptureVariables } from "../types/OrderCapture"; +import { + OrderCreateFulfillment, + OrderCreateFulfillmentVariables +} from "../types/OrderCreateFulfillment"; +import { + OrderDraftCancel, + OrderDraftCancelVariables +} from "../types/OrderDraftCancel"; +import { + OrderDraftFinalize, + OrderDraftFinalizeVariables +} from "../types/OrderDraftFinalize"; +import { + OrderDraftUpdate, + OrderDraftUpdateVariables +} from "../types/OrderDraftUpdate"; +import { + OrderFulfillmentCancel, + OrderFulfillmentCancelVariables +} from "../types/OrderFulfillmentCancel"; +import { + OrderFulfillmentUpdateTracking, + OrderFulfillmentUpdateTrackingVariables +} from "../types/OrderFulfillmentUpdateTracking"; +import { + OrderLineDelete, + OrderLineDeleteVariables +} from "../types/OrderLineDelete"; +import { OrderLinesAdd, OrderLinesAddVariables } from "../types/OrderLinesAdd"; +import { + OrderLineUpdate, + OrderLineUpdateVariables +} from "../types/OrderLineUpdate"; +import { + OrderMarkAsPaid, + OrderMarkAsPaidVariables +} from "../types/OrderMarkAsPaid"; +import { OrderRefund, OrderRefundVariables } from "../types/OrderRefund"; +import { + OrderShippingMethodUpdate, + OrderShippingMethodUpdateVariables +} from "../types/OrderShippingMethodUpdate"; +import { OrderUpdate, OrderUpdateVariables } from "../types/OrderUpdate"; +import { OrderVoid, OrderVoidVariables } from "../types/OrderVoid"; + +interface OrderOperationsProps { + order: string; + children: (props: { + orderAddNote: PartialMutationProviderOutput< + OrderAddNote, + OrderAddNoteVariables + >; + orderCancel: PartialMutationProviderOutput< + OrderCancel, + OrderCancelVariables + >; + orderCreateFulfillment: PartialMutationProviderOutput< + OrderCreateFulfillment, + OrderCreateFulfillmentVariables + >; + orderFulfillmentCancel: PartialMutationProviderOutput< + OrderFulfillmentCancel, + OrderFulfillmentCancelVariables + >; + orderFulfillmentUpdateTracking: PartialMutationProviderOutput< + OrderFulfillmentUpdateTracking, + OrderFulfillmentUpdateTrackingVariables + >; + orderPaymentCapture: PartialMutationProviderOutput< + OrderCapture, + OrderCaptureVariables + >; + orderPaymentRefund: PartialMutationProviderOutput< + OrderRefund, + OrderRefundVariables + >; + orderPaymentMarkAsPaid: PartialMutationProviderOutput< + OrderMarkAsPaid, + OrderMarkAsPaidVariables + >; + orderVoid: PartialMutationProviderOutput; + orderUpdate: PartialMutationProviderOutput< + OrderUpdate, + OrderUpdateVariables + >; + orderDraftCancel: PartialMutationProviderOutput< + OrderDraftCancel, + OrderDraftCancelVariables + >; + orderDraftFinalize: PartialMutationProviderOutput< + OrderDraftFinalize, + OrderDraftFinalizeVariables + >; + orderDraftUpdate: PartialMutationProviderOutput< + OrderDraftUpdate, + OrderDraftUpdateVariables + >; + orderShippingMethodUpdate: PartialMutationProviderOutput< + OrderShippingMethodUpdate, + OrderShippingMethodUpdateVariables + >; + orderLineDelete: PartialMutationProviderOutput< + OrderLineDelete, + OrderLineDeleteVariables + >; + orderLinesAdd: PartialMutationProviderOutput< + OrderLinesAdd, + OrderLinesAddVariables + >; + orderLineUpdate: PartialMutationProviderOutput< + OrderLineUpdate, + OrderLineUpdateVariables + >; + }) => React.ReactNode; + onOrderFulfillmentCancel: (data: OrderFulfillmentCancel) => void; + onOrderFulfillmentCreate: (data: OrderCreateFulfillment) => void; + onOrderFulfillmentUpdate: (data: OrderFulfillmentUpdateTracking) => void; + onOrderCancel: (data: OrderCancel) => void; + onOrderVoid: (data: OrderVoid) => void; + onOrderMarkAsPaid: (data: OrderMarkAsPaid) => void; + onNoteAdd: (data: OrderAddNote) => void; + onPaymentCapture: (data: OrderCapture) => void; + onPaymentRefund: (data: OrderRefund) => void; + onUpdate: (data: OrderUpdate) => void; + onDraftCancel: (data: OrderDraftCancel) => void; + onDraftFinalize: (data: OrderDraftFinalize) => void; + onDraftUpdate: (data: OrderDraftUpdate) => void; + onShippingMethodUpdate: (data: OrderShippingMethodUpdate) => void; + onOrderLineDelete: (data: OrderLineDelete) => void; + onOrderLinesAdd: (data: OrderLinesAdd) => void; + onOrderLineUpdate: (data: OrderLineUpdate) => void; +} + +const OrderOperations: React.StatelessComponent = ({ + children, + onDraftUpdate, + onOrderFulfillmentCreate, + onNoteAdd, + onOrderCancel, + onOrderLinesAdd, + onOrderLineDelete, + onOrderLineUpdate, + onOrderVoid, + onPaymentCapture, + onPaymentRefund, + onShippingMethodUpdate, + onUpdate, + onDraftCancel, + onDraftFinalize, + onOrderFulfillmentCancel, + onOrderFulfillmentUpdate, + onOrderMarkAsPaid +}) => ( + + {(...orderVoid) => ( + + {(...orderCancel) => ( + + {(...paymentCapture) => ( + + {(...paymentRefund) => ( + + {(...createFulfillment) => ( + + {(...addNote) => ( + + {(...update) => ( + + {(...updateDraft) => ( + + {(...updateShippingMethod) => ( + + {(...deleteOrderLine) => ( + + {(...addOrderLine) => ( + + {(...updateOrderLine) => ( + + {(...cancelFulfillment) => ( + + {( + ...updateTrackingNumber + ) => ( + + {( + ...finalizeDraft + ) => ( + + {( + ...cancelDraft + ) => ( + + {( + ...markAsPaid + ) => + children({ + orderAddNote: getMutationProviderData( + ...addNote + ), + orderCancel: getMutationProviderData( + ...orderCancel + ), + orderCreateFulfillment: getMutationProviderData( + ...createFulfillment + ), + orderDraftCancel: getMutationProviderData( + ...cancelDraft + ), + orderDraftFinalize: getMutationProviderData( + ...finalizeDraft + ), + orderDraftUpdate: getMutationProviderData( + ...updateDraft + ), + orderFulfillmentCancel: getMutationProviderData( + ...cancelFulfillment + ), + orderFulfillmentUpdateTracking: getMutationProviderData( + ...updateTrackingNumber + ), + orderLineDelete: getMutationProviderData( + ...deleteOrderLine + ), + orderLineUpdate: getMutationProviderData( + ...updateOrderLine + ), + orderLinesAdd: getMutationProviderData( + ...addOrderLine + ), + orderPaymentCapture: getMutationProviderData( + ...paymentCapture + ), + orderPaymentMarkAsPaid: getMutationProviderData( + ...markAsPaid + ), + orderPaymentRefund: getMutationProviderData( + ...paymentRefund + ), + orderShippingMethodUpdate: getMutationProviderData( + ...updateShippingMethod + ), + orderUpdate: getMutationProviderData( + ...update + ), + orderVoid: getMutationProviderData( + ...orderVoid + ) + }) + } + + )} + + )} + + )} + + )} + + )} + + )} + + )} + + )} + + )} + + )} + + )} + + )} + + )} + + )} + + )} + + )} + +); +export default OrderOperations; diff --git a/src/orders/fixtures.ts b/src/orders/fixtures.ts new file mode 100644 index 000000000..706017967 --- /dev/null +++ b/src/orders/fixtures.ts @@ -0,0 +1,1218 @@ +import { SearchCustomers_customers_edges_node } from "../containers/SearchCustomers/types/SearchCustomers"; +import { transformOrderStatus, transformPaymentStatus } from "../misc"; +import { + FulfillmentStatus, + OrderAction, + OrderEventsEnum, + OrderStatus, + PaymentChargeStatusEnum +} from "../types/globalTypes"; +import { OrderDetails_order } from "./types/OrderDetails"; +import { OrderList_orders_edges_node } from "./types/OrderList"; + +export const clients: SearchCustomers_customers_edges_node[] = [ + { + __typename: "User" as "User", + email: "test.client1@example.com", + id: "c1" + }, + { + __typename: "User" as "User", + email: "test.client2@example.com", + id: "c2" + }, + { + __typename: "User" as "User", + email: "test.client3@example.com", + id: "c3" + }, + { + __typename: "User" as "User", + email: "test.client4@example.com", + id: "c4" + } +]; +export const orders: OrderList_orders_edges_node[] = [ + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "East Aaronville", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "BE", + country: "Belgia" + }, + countryArea: "", + firstName: "Laura", + id: "QWRkcmVzczo5", + lastName: "Stone 1 2", + phone: "", + postalCode: "88741", + streetAddress1: "3678 John Course", + streetAddress2: "" + }, + created: "2018-09-11T09:37:30.376876+00:00", + id: "T3JkZXI6MjA=", + number: "20", + paymentStatus: PaymentChargeStatusEnum.FULLY_CHARGED, + status: OrderStatus.CANCELED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 305.17, + currency: "USD" + } + }, + userEmail: "laura.stone@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Port Danielshire", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "SE", + country: "Szwecja" + }, + countryArea: "", + firstName: "Elizabeth", + id: "QWRkcmVzczoy", + lastName: "Vaughn", + phone: "", + postalCode: "52203", + streetAddress1: "419 Ruiz Orchard Apt. 199", + streetAddress2: "" + }, + created: "2018-09-11T09:37:30.124154+00:00", + id: "T3JkZXI6MTk=", + number: "19", + paymentStatus: PaymentChargeStatusEnum.FULLY_CHARGED, + status: OrderStatus.CANCELED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 1215.89, + currency: "USD" + } + }, + userEmail: "elizabeth.vaughn@example.com" + }, + { + __typename: "Order", + billingAddress: null, + created: "2018-09-11T09:37:30.019749+00:00", + id: "T3JkZXI6MTg=", + number: "18", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.DRAFT, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 321.71, + currency: "USD" + } + }, + userEmail: "david.lawson@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "South Rodneymouth", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "GR", + country: "Grecja" + }, + countryArea: "", + firstName: "Aaron", + id: "QWRkcmVzczoyOA==", + lastName: "Randall", + phone: "", + postalCode: "30356", + streetAddress1: "326 Palmer Rapids Apt. 717", + streetAddress2: "" + }, + created: "2018-09-11T09:37:29.864391+00:00", + id: "T3JkZXI6MTc=", + number: "17", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.CANCELED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 271.95, + currency: "USD" + } + }, + userEmail: "aaron.randall@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Jorgeview", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "UG", + country: "Uganda" + }, + countryArea: "", + firstName: "Laura", + id: "QWRkcmVzczoxNA==", + lastName: "Jensen", + phone: "", + postalCode: "77693", + streetAddress1: "01504 Olson Springs Suite 920", + streetAddress2: "" + }, + created: "2018-09-11T09:37:29.610339+00:00", + id: "T3JkZXI6MTY=", + number: "16", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.CANCELED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 335.84, + currency: "USD" + } + }, + userEmail: "laura.jensen@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "East Lauriestad", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "PW", + country: "Palau" + }, + countryArea: "", + firstName: "Jenna", + id: "QWRkcmVzczoyNw==", + lastName: "Villa", + phone: "", + postalCode: "65613", + streetAddress1: "2031 Mcdonald Mill", + streetAddress2: "" + }, + created: "2018-09-11T09:37:29.336209+00:00", + id: "T3JkZXI6MTU=", + number: "15", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.CANCELED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 1042.15, + currency: "USD" + } + }, + userEmail: "jenna.villa@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Kaneton", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "VA", + country: "Watykan" + }, + countryArea: "", + firstName: "Wesley", + id: "QWRkcmVzczo4", + lastName: "Davis", + phone: "", + postalCode: "66203", + streetAddress1: "667 Joseph Lights", + streetAddress2: "" + }, + created: "2018-09-11T09:37:29.103651+00:00", + id: "T3JkZXI6MTQ=", + number: "14", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.CANCELED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 213.69, + currency: "USD" + } + }, + userEmail: "wesley.davis@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "New Morganshire", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "NL", + country: "Holandia" + }, + countryArea: "", + firstName: "Anthony", + id: "QWRkcmVzczo3", + lastName: "Gonzalez", + phone: "", + postalCode: "78701", + streetAddress1: "402 Mason Viaduct Suite 592", + streetAddress2: "" + }, + created: "2018-09-11T09:37:28.921956+00:00", + id: "T3JkZXI6MTM=", + number: "13", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.CANCELED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 367.03, + currency: "USD" + } + }, + userEmail: "anthony.gonzalez@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Adamsport", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "TN", + country: "Tunezja" + }, + countryArea: "", + firstName: "Denise", + id: "QWRkcmVzczoyNg==", + lastName: "Freeman", + phone: "", + postalCode: "27744", + streetAddress1: "8376 Linda Valley Apt. 934", + streetAddress2: "" + }, + created: "2018-09-11T09:37:28.750718+00:00", + id: "T3JkZXI6MTI=", + number: "12", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.CANCELED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 298.76, + currency: "USD" + } + }, + userEmail: "denise.freeman@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Thomasburgh", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "DJ", + country: "Dżibuti" + }, + countryArea: "", + firstName: "James", + id: "QWRkcmVzczo2", + lastName: "Ball", + phone: "", + postalCode: "70958", + streetAddress1: "60049 Fisher Grove", + streetAddress2: "" + }, + created: "2018-09-11T09:37:28.598246+00:00", + id: "T3JkZXI6MTE=", + number: "11", + paymentStatus: PaymentChargeStatusEnum.FULLY_CHARGED, + status: OrderStatus.UNFULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 663.69, + currency: "USD" + } + }, + userEmail: "james.ball@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Lake Walter", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "MK", + country: "Macedonia" + }, + countryArea: "", + firstName: "Michael", + id: "QWRkcmVzczoz", + lastName: "Martinez", + phone: "", + postalCode: "11343", + streetAddress1: "843 Allen Ramp Suite 194", + streetAddress2: "" + }, + created: "2018-09-11T09:37:28.409836+00:00", + id: "T3JkZXI6MTA=", + number: "10", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.CANCELED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 280.41, + currency: "USD" + } + }, + userEmail: "michael.martinez@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "West Patriciastad", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "SB", + country: "Wyspy Salomona" + }, + countryArea: "", + firstName: "Melissa", + id: "QWRkcmVzczoyNQ==", + lastName: "Simon", + phone: "", + postalCode: "66272", + streetAddress1: "487 Roberto Shores", + streetAddress2: "" + }, + created: "2018-09-11T09:37:28.185874+00:00", + id: "T3JkZXI6OQ==", + number: "9", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.PARTIALLY_FULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 234.93, + currency: "USD" + } + }, + userEmail: "melissa.simon@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Lake Kevinchester", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "CL", + country: "Chile" + }, + countryArea: "", + firstName: "Justin", + id: "QWRkcmVzczoyNA==", + lastName: "Mccoy", + phone: "", + postalCode: "03826", + streetAddress1: "74416 Jensen Gateway Suite 140", + streetAddress2: "" + }, + created: "2018-09-11T09:37:27.953588+00:00", + id: "T3JkZXI6OA==", + number: "8", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.PARTIALLY_FULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 485.19, + currency: "USD" + } + }, + userEmail: "justin.mccoy@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "New Morganshire", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "NL", + country: "Holandia" + }, + countryArea: "", + firstName: "Anthony", + id: "QWRkcmVzczo3", + lastName: "Gonzalez", + phone: "", + postalCode: "78701", + streetAddress1: "402 Mason Viaduct Suite 592", + streetAddress2: "" + }, + created: "2018-09-11T09:37:27.828033+00:00", + id: "T3JkZXI6Nw==", + number: "7", + paymentStatus: PaymentChargeStatusEnum.FULLY_CHARGED, + status: OrderStatus.PARTIALLY_FULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 223.54, + currency: "USD" + } + }, + userEmail: "anthony.gonzalez@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Gabrielchester", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "SN", + country: "Senegal" + }, + countryArea: "", + firstName: "Bradley", + id: "QWRkcmVzczoyMw==", + lastName: "Ford", + phone: "", + postalCode: "88661", + streetAddress1: "56414 Ashley Gardens", + streetAddress2: "" + }, + created: "2018-09-11T09:37:27.636741+00:00", + id: "T3JkZXI6Ng==", + number: "6", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.FULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 237.55, + currency: "USD" + } + }, + userEmail: "bradley.ford@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "East Steven", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "CG", + country: "Kongo" + }, + countryArea: "", + firstName: "David", + id: "QWRkcmVzczoxNg==", + lastName: "Lawson", + phone: "", + postalCode: "87510", + streetAddress1: "151 Huang Pines", + streetAddress2: "" + }, + created: "2018-09-11T09:37:27.420590+00:00", + id: "T3JkZXI6NQ==", + number: "5", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.PARTIALLY_FULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 453.55, + currency: "USD" + } + }, + userEmail: "david.lawson@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "East Daniel", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "NA", + country: "Namibia" + }, + countryArea: "", + firstName: "Lauren", + id: "QWRkcmVzczoyMg==", + lastName: "Watson", + phone: "", + postalCode: "22102", + streetAddress1: "340 Amanda Tunnel Suite 869", + streetAddress2: "" + }, + created: "2018-09-11T09:37:27.230990+00:00", + id: "T3JkZXI6NA==", + number: "4", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.PARTIALLY_FULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 812.67, + currency: "USD" + } + }, + userEmail: "lauren.watson@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Lake Margaret", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "CO", + country: "Kolumbia" + }, + countryArea: "", + firstName: "Mark", + id: "QWRkcmVzczoxNQ==", + lastName: "Lee", + phone: "", + postalCode: "18829", + streetAddress1: "34480 Daniel Centers Apt. 642", + streetAddress2: "" + }, + created: "2018-09-11T09:37:26.972507+00:00", + id: "T3JkZXI6Mw==", + number: "3", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + status: OrderStatus.PARTIALLY_FULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 481.41, + currency: "USD" + } + }, + userEmail: "mark.lee@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Dorothyberg", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "BJ", + country: "Benin" + }, + countryArea: "", + firstName: "Kara", + id: "QWRkcmVzczoyMQ==", + lastName: "Murphy", + phone: "", + postalCode: "88138", + streetAddress1: "0674 Kent Station Suite 395", + streetAddress2: "" + }, + created: "2018-09-11T09:37:26.751359+00:00", + id: "T3JkZXI6Mg==", + number: "2", + paymentStatus: PaymentChargeStatusEnum.FULLY_CHARGED, + status: OrderStatus.PARTIALLY_FULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 569.19, + currency: "USD" + } + }, + userEmail: "kara.murphy@example.com" + }, + { + __typename: "Order", + billingAddress: { + __typename: "Address", + city: "Gregorymouth", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "CV", + country: "Republika Zielonego Przylądka" + }, + countryArea: "", + firstName: "Curtis", + id: "QWRkcmVzczox", + lastName: "Bailey", + phone: "", + postalCode: "84525", + streetAddress1: "839 Scott Lake", + streetAddress2: "" + }, + created: "2018-09-11T09:37:26.314968+00:00", + id: "T3JkZXI6MQ==", + number: "1", + paymentStatus: PaymentChargeStatusEnum.FULLY_CHARGED, + status: OrderStatus.PARTIALLY_FULFILLED, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 557, + currency: "USD" + } + }, + userEmail: "curtis.bailey@example.com" + } +]; +export const order = (placeholder: string): OrderDetails_order => ({ + __typename: "Order", + actions: [ + OrderAction.CAPTURE, + OrderAction.MARK_AS_PAID, + OrderAction.REFUND, + OrderAction.VOID + ], + availableShippingMethods: [ + { + __typename: "ShippingMethod", + id: "U2hpcHBpbmdNZXRob2Q6NQ==", + name: "FBA", + price: { + __typename: "Money", + amount: 12.41, + currency: "USD" + } + }, + { + __typename: "ShippingMethod", + id: "U2hpcHBpbmdNZXRob2Q6Nw==", + name: "Oceania Air Mail", + price: { + __typename: "Money", + amount: 9.12, + currency: "USD" + } + }, + { + __typename: "ShippingMethod", + id: "U2hpcHBpbmdNZXRob2Q6Ng==", + name: "FedEx Express", + price: { + __typename: "Money", + amount: 7.6, + currency: "USD" + } + } + ], + billingAddress: { + __typename: "Address", + city: "West Patriciastad", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "SB", + country: "Wyspy Salomona" + }, + countryArea: "", + firstName: "Melissa", + id: "QWRkcmVzczoyNQ==", + lastName: "Simon", + phone: "", + postalCode: "66272", + streetAddress1: "487 Roberto Shores", + streetAddress2: "" + }, + canFinalize: true, + created: "2018-09-11T09:37:28.185874+00:00", + customerNote: "Lorem ipsum dolor sit amet", + events: [ + { + __typename: "OrderEvent", + amount: null, + date: "2018-09-17T13:22:24.376193+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDoyMQ==", + message: null, + quantity: 1, + type: OrderEventsEnum.FULFILLMENT_FULFILLED_ITEMS, + user: { + __typename: "User", + email: "admin@example.com", + id: "QWRkcmVzczoxNQ==" + } + } + ], + fulfillments: [ + { + __typename: "Fulfillment", + fulfillmentOrder: 2, + id: "RnVsZmlsbG1lbnQ6MjQ=", + lines: [ + { + __typename: "FulfillmentLine", + id: "RnVsZmlsbG1lbnRMaW5lOjM5", + orderLine: { + __typename: "OrderLine", + id: "T3JkZXJMaW5lOjIz", + isShippingRequired: false, + productName: "Williams, Garcia and Walker (XS)", + productSku: "5-1337", + quantity: 2, + quantityFulfilled: 2, + thumbnail: { + __typename: "Image" as "Image", + url: placeholder + }, + unitPrice: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 79.71, + currency: "USD" + }, + net: { + __typename: "Money", + amount: 79.71, + currency: "USD" + } + } + }, + quantity: 1 + } + ], + status: FulfillmentStatus.FULFILLED, + trackingNumber: "" + }, + { + __typename: "Fulfillment", + fulfillmentOrder: 1, + id: "RnVsZmlsbG1lbnQ6OQ==", + lines: [ + { + __typename: "FulfillmentLine", + id: "RnVsZmlsbG1lbnRMaW5lOjE1", + orderLine: { + __typename: "OrderLine", + id: "T3JkZXJMaW5lOjIz", + isShippingRequired: false, + productName: "Williams, Garcia and Walker (XS)", + productSku: "5-1337", + quantity: 2, + quantityFulfilled: 2, + thumbnail: { + __typename: "Image" as "Image", + url: placeholder + }, + unitPrice: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 79.71, + currency: "USD" + }, + net: { + __typename: "Money", + amount: 79.71, + currency: "USD" + } + } + }, + quantity: 1 + } + ], + status: FulfillmentStatus.FULFILLED, + trackingNumber: "" + } + ], + id: "T3JkZXI6OQ==", + lines: [ + { + __typename: "OrderLine", + id: "T3JkZXJMaW5lOjIy", + isShippingRequired: true, + productName: "Watkins-Gonzalez (Soft)", + productSku: "59-1337", + quantity: 3, + quantityFulfilled: 0, + thumbnail: { + __typename: "Image" as "Image", + url: placeholder + }, + unitPrice: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 18.51, + currency: "USD" + }, + net: { + __typename: "Money", + amount: 18.51, + currency: "USD" + } + } + }, + { + __typename: "OrderLine", + id: "T3JkZXJMaW5lOjIz", + isShippingRequired: true, + productName: "Williams, Garcia and Walker (XS)", + productSku: "5-1337", + quantity: 2, + quantityFulfilled: 2, + thumbnail: { + __typename: "Image" as "Image", + url: placeholder + }, + unitPrice: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 79.71, + currency: "USD" + }, + net: { + __typename: "Money", + amount: 79.71, + currency: "USD" + } + } + } + ], + number: "9", + paymentStatus: PaymentChargeStatusEnum.NOT_CHARGED, + shippingAddress: { + __typename: "Address", + city: "West Patriciastad", + cityArea: "", + companyName: "", + country: { + __typename: "CountryDisplay", + code: "SB", + country: "Wyspy Salomona" + }, + countryArea: "", + firstName: "Melissa", + id: "QWRkcmVzczoyNQ==", + lastName: "Simon", + phone: "", + postalCode: "66272", + streetAddress1: "487 Roberto Shores", + streetAddress2: "" + }, + shippingMethod: null, + shippingMethodName: "Registred priority", + shippingPrice: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 19.98, + currency: "USD" + } + }, + status: OrderStatus.PARTIALLY_FULFILLED, + subtotal: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 214.95, + currency: "USD" + } + }, + total: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 234.93, + currency: "USD" + }, + tax: { + __typename: "Money", + amount: 0, + currency: "USD" + } + }, + totalAuthorized: { + __typename: "Money", + amount: 234.93, + currency: "USD" + }, + totalCaptured: { + __typename: "Money", + amount: 0, + currency: "USD" + }, + user: null, + userEmail: "melissa.simon@example.com" +}); +export const draftOrder = (placeholder: string): OrderDetails_order => ({ + __typename: "Order" as "Order", + actions: [OrderAction.CAPTURE], + availableShippingMethods: null, + billingAddress: null, + canFinalize: true, + created: "2018-09-20T23:23:39.811428+00:00", + customerNote: "Lorem ipsum dolor sit", + events: [], + fulfillments: [], + id: "T3JkZXI6MjQ=", + lines: [ + { + __typename: "OrderLine" as "OrderLine", + id: "T3JkZXJMaW5lOjQ1", + isShippingRequired: false, + productName: "Davis Group (Hard)", + productSku: "58-1338", + quantity: 2, + quantityFulfilled: 0, + thumbnail: { + __typename: "Image" as "Image", + url: placeholder + }, + unitPrice: { + __typename: "TaxedMoney" as "TaxedMoney", + gross: { + __typename: "Money" as "Money", + amount: 65.95, + currency: "USD" + }, + net: { + __typename: "Money" as "Money", + amount: 65.95, + currency: "USD" + } + } + }, + { + __typename: "OrderLine" as "OrderLine", + id: "T3JkZXJMaW5lOjQ2", + isShippingRequired: false, + productName: "Anderson PLC (15-1337)", + productSku: "15-1337", + quantity: 2, + quantityFulfilled: 0, + thumbnail: { + __typename: "Image" as "Image", + url: placeholder + }, + unitPrice: { + __typename: "TaxedMoney" as "TaxedMoney", + gross: { + __typename: "Money" as "Money", + amount: 68.2, + currency: "USD" + }, + net: { + __typename: "Money" as "Money", + amount: 68.2, + currency: "USD" + } + } + } + ], + number: "24", + paymentStatus: null, + shippingAddress: null, + shippingMethod: null, + shippingMethodName: null, + shippingPrice: { + __typename: "TaxedMoney" as "TaxedMoney", + gross: { + __typename: "Money" as "Money", + amount: 0, + currency: "USD" + } + }, + status: "DRAFT" as OrderStatus.DRAFT, + subtotal: { + __typename: "TaxedMoney" as "TaxedMoney", + gross: { + __typename: "Money" as "Money", + amount: 168.3, + currency: "USD" + } + }, + total: { + __typename: "TaxedMoney" as "TaxedMoney", + gross: { + __typename: "Money" as "Money", + amount: 168.3, + currency: "USD" + }, + tax: { + __typename: "Money" as "Money", + amount: 68.3, + currency: "USD" + } + }, + totalAuthorized: null, + totalCaptured: null, + user: null, + userEmail: null +}); +export const flatOrders = orders.map(order => ({ + ...order, + orderStatus: transformOrderStatus(order.status), + paymentStatus: transformPaymentStatus(order.paymentStatus) +})); +export const variants = [ + { id: "p1", name: "Product 1: variant 1", sku: "12345", stockQuantity: 3 }, + { id: "p2", name: "Product 1: variant 2", sku: "12346", stockQuantity: 1 }, + { id: "p3", name: "Product 2: variant 1", sku: "12355", stockQuantity: 10 }, + { id: "p4", name: "Product 3: variant 1", sku: "12445", stockQuantity: 12 }, + { id: "p5", name: "Product 3: variant 2", sku: "12545", stockQuantity: 7 }, + { id: "p6", name: "Product 5: variant 1", sku: "13345", stockQuantity: 3 }, + { id: "p7", name: "Product 5: variant 2", sku: "14345", stockQuantity: 11 } +]; +export const prefixes = ["01", "02", "41", "49"]; +export const countries = [ + { code: "AF", label: "Afghanistan" }, + { code: "AX", label: "Åland Islands" }, + { code: "AL", label: "Albania" }, + { code: "DZ", label: "Algeria" }, + { code: "AS", label: "American Samoa" } +]; +export const shippingMethods = [ + { id: "s1", name: "DHL", country: "whole world", price: {} }, + { id: "s2", name: "UPS", country: "Afghanistan" } +]; +export const orderLineSearch = (placeholderImage: string) => [ + { + __typename: "Product" as "Product", + id: "UHJvZHVjdDo3Mg==", + name: "Apple Juice", + thumbnail: { + __typename: "Image" as "Image", + url: placeholderImage + }, + variants: [ + { + __typename: "ProductVariant" as "ProductVariant", + id: "UHJvZHVjdFZhcmlhbnQ6MjAy", + name: "500ml", + price: { amount: 3.0, currency: "USD", __typename: "Money" as "Money" }, + sku: "93855755" + }, + { + __typename: "ProductVariant" as "ProductVariant", + id: "UHJvZHVjdFZhcmlhbnQ6MjAz", + name: "1l", + price: { amount: 5.0, currency: "USD", __typename: "Money" as "Money" }, + sku: "43226647" + }, + { + __typename: "ProductVariant" as "ProductVariant", + id: "UHJvZHVjdFZhcmlhbnQ6MjA0", + name: "2l", + price: { amount: 7.0, currency: "USD", __typename: "Money" as "Money" }, + sku: "80884671" + } + ] + }, + { + __typename: "Product" as "Product", + id: "UHJvZHVjdDo3NQ==", + name: "Pineapple Juice", + thumbnail: { + __typename: "Image" as "Image", + url: placeholderImage + }, + variants: [ + { + __typename: "ProductVariant" as "ProductVariant", + id: "UHJvZHVjdFZhcmlhbnQ6MjEx", + name: "500ml", + price: { amount: 3.0, currency: "USD", __typename: "Money" as "Money" }, + sku: "43200242" + }, + { + __typename: "ProductVariant" as "ProductVariant", + id: "UHJvZHVjdFZhcmlhbnQ6MjEy", + name: "1l", + price: { amount: 5.0, currency: "USD", __typename: "Money" as "Money" }, + sku: "79129513" + }, + { + __typename: "ProductVariant" as "ProductVariant", + id: "UHJvZHVjdFZhcmlhbnQ6MjEz", + name: "2l", + price: { amount: 7.0, currency: "USD", __typename: "Money" as "Money" }, + sku: "75799450" + } + ] + } +]; diff --git a/src/orders/index.tsx b/src/orders/index.tsx new file mode 100644 index 000000000..09490bb35 --- /dev/null +++ b/src/orders/index.tsx @@ -0,0 +1,60 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { + orderDraftListPath, + OrderDraftListUrlQueryParams, + orderListPath, + OrderListUrlQueryParams, + orderPath, + OrderUrlQueryParams +} from "./urls"; +import OrderDetailsComponent from "./views/OrderDetails"; +import OrderDraftListComponent from "./views/OrderDraftList"; +import OrderListComponent from "./views/OrderList"; + +const OrderList: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: OrderListUrlQueryParams = qs; + return ; +}; +const OrderDraftList: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: OrderDraftListUrlQueryParams = qs; + return ; +}; + +const OrderDetails: React.StatelessComponent> = ({ + location, + match +}) => { + const qs = parseQs(location.search.substr(1)); + const params: OrderUrlQueryParams = qs; + + return ( + + ); +}; + +const Component = () => ( + <> + + + + + + + +); + +export default Component; diff --git a/src/orders/mutations.ts b/src/orders/mutations.ts new file mode 100644 index 000000000..8ab8f659b --- /dev/null +++ b/src/orders/mutations.ts @@ -0,0 +1,472 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { + fragmentAddress, + fragmentOrderDetails, + fragmentOrderEvent +} from "./queries"; +import { OrderAddNote, OrderAddNoteVariables } from "./types/OrderAddNote"; +import { + OrderBulkCancel, + OrderBulkCancelVariables +} from "./types/OrderBulkCancel"; +import { OrderCancel, OrderCancelVariables } from "./types/OrderCancel"; +import { OrderCapture, OrderCaptureVariables } from "./types/OrderCapture"; +import { + OrderCreateFulfillment, + OrderCreateFulfillmentVariables +} from "./types/OrderCreateFulfillment"; +import { + OrderDraftBulkCancel, + OrderDraftBulkCancelVariables +} from "./types/OrderDraftBulkCancel"; +import { + OrderDraftCancel, + OrderDraftCancelVariables +} from "./types/OrderDraftCancel"; +import { OrderDraftCreate } from "./types/OrderDraftCreate"; +import { + OrderDraftFinalize, + OrderDraftFinalizeVariables +} from "./types/OrderDraftFinalize"; +import { + OrderDraftUpdate, + OrderDraftUpdateVariables +} from "./types/OrderDraftUpdate"; +import { + OrderFulfillmentCancel, + OrderFulfillmentCancelVariables +} from "./types/OrderFulfillmentCancel"; +import { + OrderFulfillmentUpdateTracking, + OrderFulfillmentUpdateTrackingVariables +} from "./types/OrderFulfillmentUpdateTracking"; +import { + OrderLineDelete, + OrderLineDeleteVariables +} from "./types/OrderLineDelete"; +import { OrderLinesAdd, OrderLinesAddVariables } from "./types/OrderLinesAdd"; +import { + OrderLineUpdate, + OrderLineUpdateVariables +} from "./types/OrderLineUpdate"; +import { + OrderMarkAsPaid, + OrderMarkAsPaidVariables +} from "./types/OrderMarkAsPaid"; +import { OrderRefund, OrderRefundVariables } from "./types/OrderRefund"; +import { + OrderShippingMethodUpdate, + OrderShippingMethodUpdateVariables +} from "./types/OrderShippingMethodUpdate"; +import { OrderUpdate, OrderUpdateVariables } from "./types/OrderUpdate"; +import { OrderVoid, OrderVoidVariables } from "./types/OrderVoid"; + +const orderCancelMutation = gql` + ${fragmentOrderDetails} + mutation OrderCancel($id: ID!, $restock: Boolean!) { + orderCancel(id: $id, restock: $restock) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderCancelMutation = TypedMutation< + OrderCancel, + OrderCancelVariables +>(orderCancelMutation); + +const orderBulkCancelMutation = gql` + mutation OrderBulkCancel($ids: [ID]!, $restock: Boolean!) { + orderBulkCancel(ids: $ids, restock: $restock) { + errors { + field + message + } + } + } +`; +export const TypedOrderBulkCancelMutation = TypedMutation< + OrderBulkCancel, + OrderBulkCancelVariables +>(orderBulkCancelMutation); + +const orderDraftCancelMutation = gql` + ${fragmentOrderDetails} + mutation OrderDraftCancel($id: ID!) { + draftOrderDelete(id: $id) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderDraftCancelMutation = TypedMutation< + OrderDraftCancel, + OrderDraftCancelVariables +>(orderDraftCancelMutation); + +const orderDraftBulkCancelMutation = gql` + mutation OrderDraftBulkCancel($ids: [ID]!) { + draftOrderBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedOrderDraftBulkCancelMutation = TypedMutation< + OrderDraftBulkCancel, + OrderDraftBulkCancelVariables +>(orderDraftBulkCancelMutation); + +const orderDraftFinalizeMutation = gql` + ${fragmentOrderDetails} + mutation OrderDraftFinalize($id: ID!) { + draftOrderComplete(id: $id) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderDraftFinalizeMutation = TypedMutation< + OrderDraftFinalize, + OrderDraftFinalizeVariables +>(orderDraftFinalizeMutation); + +const orderRefundMutation = gql` + ${fragmentOrderDetails} + mutation OrderRefund($id: ID!, $amount: Decimal!) { + orderRefund(id: $id, amount: $amount) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderRefundMutation = TypedMutation< + OrderRefund, + OrderRefundVariables +>(orderRefundMutation); + +const orderVoidMutation = gql` + ${fragmentOrderDetails} + mutation OrderVoid($id: ID!) { + orderVoid(id: $id) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderVoidMutation = TypedMutation< + OrderVoid, + OrderVoidVariables +>(orderVoidMutation); + +const orderMarkAsPaidMutation = gql` + ${fragmentOrderDetails} + mutation OrderMarkAsPaid($id: ID!) { + orderMarkAsPaid(id: $id) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderMarkAsPaidMutation = TypedMutation< + OrderMarkAsPaid, + OrderMarkAsPaidVariables +>(orderMarkAsPaidMutation); + +const orderCaptureMutation = gql` + ${fragmentOrderDetails} + mutation OrderCapture($id: ID!, $amount: Decimal!) { + orderCapture(id: $id, amount: $amount) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderCaptureMutation = TypedMutation< + OrderCapture, + OrderCaptureVariables +>(orderCaptureMutation); + +const orderCreateFulfillmentMutation = gql` + ${fragmentOrderDetails} + mutation OrderCreateFulfillment( + $order: ID! + $input: FulfillmentCreateInput! + ) { + orderFulfillmentCreate(order: $order, input: $input) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderCreateFulfillmentMutation = TypedMutation< + OrderCreateFulfillment, + OrderCreateFulfillmentVariables +>(orderCreateFulfillmentMutation); + +const orderFulfillmentUpdateTrackingMutation = gql` + ${fragmentOrderDetails} + mutation OrderFulfillmentUpdateTracking( + $id: ID! + $input: FulfillmentUpdateTrackingInput! + ) { + orderFulfillmentUpdateTracking(id: $id, input: $input) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderFulfillmentUpdateTrackingMutation = TypedMutation< + OrderFulfillmentUpdateTracking, + OrderFulfillmentUpdateTrackingVariables +>(orderFulfillmentUpdateTrackingMutation); + +const orderFulfillmentCancelMutation = gql` + ${fragmentOrderDetails} + mutation OrderFulfillmentCancel($id: ID!, $input: FulfillmentCancelInput!) { + orderFulfillmentCancel(id: $id, input: $input) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderFulfillmentCancelMutation = TypedMutation< + OrderFulfillmentCancel, + OrderFulfillmentCancelVariables +>(orderFulfillmentCancelMutation); + +const orderAddNoteMutation = gql` + ${fragmentOrderEvent} + mutation OrderAddNote($order: ID!, $input: OrderAddNoteInput!) { + orderAddNote(order: $order, input: $input) { + errors { + field + message + } + order { + id + events { + ...OrderEventFragment + } + } + } + } +`; +export const TypedOrderAddNoteMutation = TypedMutation< + OrderAddNote, + OrderAddNoteVariables +>(orderAddNoteMutation); + +const orderUpdateMutation = gql` + ${fragmentAddress} + mutation OrderUpdate($id: ID!, $input: OrderUpdateInput!) { + orderUpdate(id: $id, input: $input) { + errors { + field + message + } + order { + id + userEmail + billingAddress { + ...AddressFragment + } + shippingAddress { + ...AddressFragment + } + } + } + } +`; +export const TypedOrderUpdateMutation = TypedMutation< + OrderUpdate, + OrderUpdateVariables +>(orderUpdateMutation); + +const orderDraftUpdateMutation = gql` + ${fragmentOrderDetails} + mutation OrderDraftUpdate($id: ID!, $input: DraftOrderInput!) { + draftOrderUpdate(id: $id, input: $input) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderDraftUpdateMutation = TypedMutation< + OrderDraftUpdate, + OrderDraftUpdateVariables +>(orderDraftUpdateMutation); + +const orderShippingMethodUpdateMutation = gql` + mutation OrderShippingMethodUpdate( + $id: ID! + $input: OrderUpdateShippingInput! + ) { + orderUpdateShipping(order: $id, input: $input) { + errors { + field + message + } + order { + availableShippingMethods { + id + name + } + id + shippingMethod { + id + name + price { + amount + currency + } + } + shippingMethodName + shippingPrice { + gross { + amount + currency + } + } + } + } + } +`; +export const TypedOrderShippingMethodUpdateMutation = TypedMutation< + OrderShippingMethodUpdate, + OrderShippingMethodUpdateVariables +>(orderShippingMethodUpdateMutation); + +const orderDraftCreateMutation = gql` + mutation OrderDraftCreate { + draftOrderCreate(input: {}) { + errors { + field + message + } + order { + id + } + } + } +`; +export const TypedOrderDraftCreateMutation = TypedMutation< + OrderDraftCreate, + {} +>(orderDraftCreateMutation); + +const orderLineDeleteMutation = gql` + ${fragmentOrderDetails} + mutation OrderLineDelete($id: ID!) { + draftOrderLineDelete(id: $id) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderLineDeleteMutation = TypedMutation< + OrderLineDelete, + OrderLineDeleteVariables +>(orderLineDeleteMutation); + +const orderLinesAddMutation = gql` + ${fragmentOrderDetails} + mutation OrderLinesAdd($id: ID!, $input: [OrderLineCreateInput]!) { + draftOrderLinesCreate(id: $id, input: $input) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderLinesAddMutation = TypedMutation< + OrderLinesAdd, + OrderLinesAddVariables +>(orderLinesAddMutation); + +const orderLineUpdateMutation = gql` + ${fragmentOrderDetails} + mutation OrderLineUpdate($id: ID!, $input: OrderLineInput!) { + draftOrderLineUpdate(id: $id, input: $input) { + errors { + field + message + } + order { + ...OrderDetailsFragment + } + } + } +`; +export const TypedOrderLineUpdateMutation = TypedMutation< + OrderLineUpdate, + OrderLineUpdateVariables +>(orderLineUpdateMutation); diff --git a/src/orders/queries.ts b/src/orders/queries.ts new file mode 100644 index 000000000..87a006b28 --- /dev/null +++ b/src/orders/queries.ts @@ -0,0 +1,315 @@ +import gql from "graphql-tag"; + +import BaseSearch from "../containers/BaseSearch"; +import { TypedQuery } from "../queries"; +import { OrderDetails, OrderDetailsVariables } from "./types/OrderDetails"; +import { + OrderDraftList, + OrderDraftListVariables +} from "./types/OrderDraftList"; +import { OrderList, OrderListVariables } from "./types/OrderList"; +import { + SearchOrderVariant as SearchOrderVariantType, + SearchOrderVariantVariables +} from "./types/SearchOrderVariant"; + +export const fragmentOrderEvent = gql` + fragment OrderEventFragment on OrderEvent { + id + amount + date + email + emailType + message + quantity + type + user { + id + email + } + } +`; +export const fragmentAddress = gql` + fragment AddressFragment on Address { + city + cityArea + companyName + country { + __typename + code + country + } + countryArea + firstName + id + lastName + phone + postalCode + streetAddress1 + streetAddress2 + } +`; +export const fragmentOrderLine = gql` + fragment OrderLineFragment on OrderLine { + id + isShippingRequired + productName + productSku + quantity + quantityFulfilled + unitPrice { + gross { + amount + currency + } + net { + amount + currency + } + } + thumbnail { + url + } + } +`; + +export const fragmentOrderDetails = gql` + ${fragmentAddress} + ${fragmentOrderEvent} + ${fragmentOrderLine} + fragment OrderDetailsFragment on Order { + id + billingAddress { + ...AddressFragment + } + canFinalize + created + customerNote + events { + ...OrderEventFragment + } + fulfillments { + id + lines { + id + quantity + orderLine { + ...OrderLineFragment + } + } + fulfillmentOrder + status + trackingNumber + } + lines { + ...OrderLineFragment + } + number + paymentStatus + shippingAddress { + ...AddressFragment + } + shippingMethod { + id + } + shippingMethodName + shippingPrice { + gross { + amount + currency + } + } + status + subtotal { + gross { + amount + currency + } + } + total { + gross { + amount + currency + } + tax { + amount + currency + } + } + actions + totalAuthorized { + amount + currency + } + totalCaptured { + amount + currency + } + user { + id + email + } + userEmail + availableShippingMethods { + id + name + price { + amount + currency + } + } + } +`; + +export const orderListQuery = gql` + ${fragmentAddress} + query OrderList( + $first: Int + $after: String + $last: Int + $before: String + $status: OrderStatusFilter + $filter: OrderFilterInput + ) { + orders( + before: $before + after: $after + first: $first + last: $last + status: $status + filter: $filter + ) { + edges { + node { + __typename + billingAddress { + ...AddressFragment + } + created + id + number + paymentStatus + status + total { + __typename + gross { + __typename + amount + currency + } + } + userEmail + } + } + pageInfo { + hasPreviousPage + hasNextPage + startCursor + endCursor + } + } + } +`; +export const TypedOrderListQuery = TypedQuery( + orderListQuery +); + +export const orderDraftListQuery = gql` + ${fragmentAddress} + query OrderDraftList( + $first: Int + $after: String + $last: Int + $before: String + ) { + draftOrders(before: $before, after: $after, first: $first, last: $last) { + edges { + node { + __typename + billingAddress { + ...AddressFragment + } + created + id + number + paymentStatus + status + total { + __typename + gross { + __typename + amount + currency + } + } + userEmail + } + } + pageInfo { + hasPreviousPage + hasNextPage + startCursor + endCursor + } + } + } +`; +export const TypedOrderDraftListQuery = TypedQuery< + OrderDraftList, + OrderDraftListVariables +>(orderDraftListQuery); + +export const orderDetailsQuery = gql` + ${fragmentOrderDetails} + query OrderDetails($id: ID!) { + order(id: $id) { + ...OrderDetailsFragment + } + shop { + countries { + code + country + } + defaultWeightUnit + } + } +`; +export const TypedOrderDetailsQuery = TypedQuery< + OrderDetails, + OrderDetailsVariables +>(orderDetailsQuery); + +export const searchOrderVariant = gql` + query SearchOrderVariant($first: Int!, $query: String!, $after: String) { + products(query: $query, first: $first, after: $after) { + edges { + node { + id + name + thumbnail { + url + } + variants { + id + name + sku + price { + amount + currency + } + } + } + } + pageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } + } + } +`; +export const SearchOrderVariant = BaseSearch< + SearchOrderVariantType, + SearchOrderVariantVariables +>(searchOrderVariant); diff --git a/src/orders/types/AddressFragment.ts b/src/orders/types/AddressFragment.ts new file mode 100644 index 000000000..fbe0fe508 --- /dev/null +++ b/src/orders/types/AddressFragment.ts @@ -0,0 +1,29 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: AddressFragment +// ==================================================== + +export interface AddressFragment_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface AddressFragment { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: AddressFragment_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} diff --git a/src/orders/types/OrderAddNote.ts b/src/orders/types/OrderAddNote.ts new file mode 100644 index 000000000..dc42af7cb --- /dev/null +++ b/src/orders/types/OrderAddNote.ts @@ -0,0 +1,55 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderAddNoteInput, OrderEventsEmailsEnum, OrderEventsEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderAddNote +// ==================================================== + +export interface OrderAddNote_orderAddNote_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderAddNote_orderAddNote_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderAddNote_orderAddNote_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderAddNote_orderAddNote_order_events_user | null; +} + +export interface OrderAddNote_orderAddNote_order { + __typename: "Order"; + id: string; + events: (OrderAddNote_orderAddNote_order_events | null)[] | null; +} + +export interface OrderAddNote_orderAddNote { + __typename: "OrderAddNote"; + errors: OrderAddNote_orderAddNote_errors[] | null; + order: OrderAddNote_orderAddNote_order | null; +} + +export interface OrderAddNote { + orderAddNote: OrderAddNote_orderAddNote | null; +} + +export interface OrderAddNoteVariables { + order: string; + input: OrderAddNoteInput; +} diff --git a/src/orders/types/OrderBulkCancel.ts b/src/orders/types/OrderBulkCancel.ts new file mode 100644 index 000000000..ad442d58e --- /dev/null +++ b/src/orders/types/OrderBulkCancel.ts @@ -0,0 +1,27 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: OrderBulkCancel +// ==================================================== + +export interface OrderBulkCancel_orderBulkCancel_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderBulkCancel_orderBulkCancel { + __typename: "OrderBulkCancel"; + errors: OrderBulkCancel_orderBulkCancel_errors[] | null; +} + +export interface OrderBulkCancel { + orderBulkCancel: OrderBulkCancel_orderBulkCancel | null; +} + +export interface OrderBulkCancelVariables { + ids: (string | null)[]; + restock: boolean; +} diff --git a/src/orders/types/OrderCancel.ts b/src/orders/types/OrderCancel.ts new file mode 100644 index 000000000..4be781645 --- /dev/null +++ b/src/orders/types/OrderCancel.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderCancel +// ==================================================== + +export interface OrderCancel_orderCancel_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderCancel_orderCancel_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderCancel_orderCancel_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderCancel_orderCancel_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderCancel_orderCancel_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderCancel_orderCancel_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderCancel_orderCancel_order_events_user | null; +} + +export interface OrderCancel_orderCancel_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderCancel_orderCancel_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderCancel_orderCancel_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderCancel_orderCancel_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderCancel_orderCancel_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderCancel_orderCancel_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderCancel_orderCancel_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderCancel_orderCancel_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderCancel_orderCancel_order_fulfillments_lines_orderLine | null; +} + +export interface OrderCancel_orderCancel_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderCancel_orderCancel_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderCancel_orderCancel_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderCancel_orderCancel_order_lines_unitPrice_gross; + net: OrderCancel_orderCancel_order_lines_unitPrice_net; +} + +export interface OrderCancel_orderCancel_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderCancel_orderCancel_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderCancel_orderCancel_order_lines_unitPrice | null; + thumbnail: OrderCancel_orderCancel_order_lines_thumbnail | null; +} + +export interface OrderCancel_orderCancel_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderCancel_orderCancel_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderCancel_orderCancel_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderCancel_orderCancel_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderCancel_orderCancel_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderCancel_orderCancel_order_shippingPrice_gross; +} + +export interface OrderCancel_orderCancel_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderCancel_orderCancel_order_subtotal_gross; +} + +export interface OrderCancel_orderCancel_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_total { + __typename: "TaxedMoney"; + gross: OrderCancel_orderCancel_order_total_gross; + tax: OrderCancel_orderCancel_order_total_tax; +} + +export interface OrderCancel_orderCancel_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderCancel_orderCancel_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCancel_orderCancel_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderCancel_orderCancel_order_availableShippingMethods_price | null; +} + +export interface OrderCancel_orderCancel_order { + __typename: "Order"; + id: string; + billingAddress: OrderCancel_orderCancel_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderCancel_orderCancel_order_events | null)[] | null; + fulfillments: (OrderCancel_orderCancel_order_fulfillments | null)[]; + lines: (OrderCancel_orderCancel_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderCancel_orderCancel_order_shippingAddress | null; + shippingMethod: OrderCancel_orderCancel_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderCancel_orderCancel_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderCancel_orderCancel_order_subtotal | null; + total: OrderCancel_orderCancel_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderCancel_orderCancel_order_totalAuthorized | null; + totalCaptured: OrderCancel_orderCancel_order_totalCaptured | null; + user: OrderCancel_orderCancel_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderCancel_orderCancel_order_availableShippingMethods | null)[] | null; +} + +export interface OrderCancel_orderCancel { + __typename: "OrderCancel"; + errors: OrderCancel_orderCancel_errors[] | null; + order: OrderCancel_orderCancel_order | null; +} + +export interface OrderCancel { + orderCancel: OrderCancel_orderCancel | null; +} + +export interface OrderCancelVariables { + id: string; + restock: boolean; +} diff --git a/src/orders/types/OrderCapture.ts b/src/orders/types/OrderCapture.ts new file mode 100644 index 000000000..2c3bf0f51 --- /dev/null +++ b/src/orders/types/OrderCapture.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderCapture +// ==================================================== + +export interface OrderCapture_orderCapture_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderCapture_orderCapture_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderCapture_orderCapture_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderCapture_orderCapture_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderCapture_orderCapture_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderCapture_orderCapture_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderCapture_orderCapture_order_events_user | null; +} + +export interface OrderCapture_orderCapture_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderCapture_orderCapture_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderCapture_orderCapture_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderCapture_orderCapture_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderCapture_orderCapture_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderCapture_orderCapture_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderCapture_orderCapture_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderCapture_orderCapture_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderCapture_orderCapture_order_fulfillments_lines_orderLine | null; +} + +export interface OrderCapture_orderCapture_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderCapture_orderCapture_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderCapture_orderCapture_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderCapture_orderCapture_order_lines_unitPrice_gross; + net: OrderCapture_orderCapture_order_lines_unitPrice_net; +} + +export interface OrderCapture_orderCapture_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderCapture_orderCapture_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderCapture_orderCapture_order_lines_unitPrice | null; + thumbnail: OrderCapture_orderCapture_order_lines_thumbnail | null; +} + +export interface OrderCapture_orderCapture_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderCapture_orderCapture_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderCapture_orderCapture_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderCapture_orderCapture_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderCapture_orderCapture_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderCapture_orderCapture_order_shippingPrice_gross; +} + +export interface OrderCapture_orderCapture_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderCapture_orderCapture_order_subtotal_gross; +} + +export interface OrderCapture_orderCapture_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_total { + __typename: "TaxedMoney"; + gross: OrderCapture_orderCapture_order_total_gross; + tax: OrderCapture_orderCapture_order_total_tax; +} + +export interface OrderCapture_orderCapture_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderCapture_orderCapture_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCapture_orderCapture_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderCapture_orderCapture_order_availableShippingMethods_price | null; +} + +export interface OrderCapture_orderCapture_order { + __typename: "Order"; + id: string; + billingAddress: OrderCapture_orderCapture_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderCapture_orderCapture_order_events | null)[] | null; + fulfillments: (OrderCapture_orderCapture_order_fulfillments | null)[]; + lines: (OrderCapture_orderCapture_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderCapture_orderCapture_order_shippingAddress | null; + shippingMethod: OrderCapture_orderCapture_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderCapture_orderCapture_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderCapture_orderCapture_order_subtotal | null; + total: OrderCapture_orderCapture_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderCapture_orderCapture_order_totalAuthorized | null; + totalCaptured: OrderCapture_orderCapture_order_totalCaptured | null; + user: OrderCapture_orderCapture_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderCapture_orderCapture_order_availableShippingMethods | null)[] | null; +} + +export interface OrderCapture_orderCapture { + __typename: "OrderCapture"; + errors: OrderCapture_orderCapture_errors[] | null; + order: OrderCapture_orderCapture_order | null; +} + +export interface OrderCapture { + orderCapture: OrderCapture_orderCapture | null; +} + +export interface OrderCaptureVariables { + id: string; + amount: any; +} diff --git a/src/orders/types/OrderCreateFulfillment.ts b/src/orders/types/OrderCreateFulfillment.ts new file mode 100644 index 000000000..0cba57943 --- /dev/null +++ b/src/orders/types/OrderCreateFulfillment.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { FulfillmentCreateInput, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderCreateFulfillment +// ==================================================== + +export interface OrderCreateFulfillment_orderFulfillmentCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderCreateFulfillment_orderFulfillmentCreate_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderCreateFulfillment_orderFulfillmentCreate_order_events_user | null; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines_orderLine | null; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderCreateFulfillment_orderFulfillmentCreate_order_lines_unitPrice_gross; + net: OrderCreateFulfillment_orderFulfillmentCreate_order_lines_unitPrice_net; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderCreateFulfillment_orderFulfillmentCreate_order_lines_unitPrice | null; + thumbnail: OrderCreateFulfillment_orderFulfillmentCreate_order_lines_thumbnail | null; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderCreateFulfillment_orderFulfillmentCreate_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderCreateFulfillment_orderFulfillmentCreate_order_shippingPrice_gross; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderCreateFulfillment_orderFulfillmentCreate_order_subtotal_gross; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_total { + __typename: "TaxedMoney"; + gross: OrderCreateFulfillment_orderFulfillmentCreate_order_total_gross; + tax: OrderCreateFulfillment_orderFulfillmentCreate_order_total_tax; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderCreateFulfillment_orderFulfillmentCreate_order_availableShippingMethods_price | null; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate_order { + __typename: "Order"; + id: string; + billingAddress: OrderCreateFulfillment_orderFulfillmentCreate_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderCreateFulfillment_orderFulfillmentCreate_order_events | null)[] | null; + fulfillments: (OrderCreateFulfillment_orderFulfillmentCreate_order_fulfillments | null)[]; + lines: (OrderCreateFulfillment_orderFulfillmentCreate_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderCreateFulfillment_orderFulfillmentCreate_order_shippingAddress | null; + shippingMethod: OrderCreateFulfillment_orderFulfillmentCreate_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderCreateFulfillment_orderFulfillmentCreate_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderCreateFulfillment_orderFulfillmentCreate_order_subtotal | null; + total: OrderCreateFulfillment_orderFulfillmentCreate_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderCreateFulfillment_orderFulfillmentCreate_order_totalAuthorized | null; + totalCaptured: OrderCreateFulfillment_orderFulfillmentCreate_order_totalCaptured | null; + user: OrderCreateFulfillment_orderFulfillmentCreate_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderCreateFulfillment_orderFulfillmentCreate_order_availableShippingMethods | null)[] | null; +} + +export interface OrderCreateFulfillment_orderFulfillmentCreate { + __typename: "FulfillmentCreate"; + errors: OrderCreateFulfillment_orderFulfillmentCreate_errors[] | null; + order: OrderCreateFulfillment_orderFulfillmentCreate_order | null; +} + +export interface OrderCreateFulfillment { + orderFulfillmentCreate: OrderCreateFulfillment_orderFulfillmentCreate | null; +} + +export interface OrderCreateFulfillmentVariables { + order: string; + input: FulfillmentCreateInput; +} diff --git a/src/orders/types/OrderDetails.ts b/src/orders/types/OrderDetails.ts new file mode 100644 index 000000000..b6bb55380 --- /dev/null +++ b/src/orders/types/OrderDetails.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, WeightUnitsEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: OrderDetails +// ==================================================== + +export interface OrderDetails_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDetails_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDetails_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDetails_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDetails_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderDetails_order_events_user | null; +} + +export interface OrderDetails_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDetails_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderDetails_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderDetails_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDetails_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDetails_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderDetails_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderDetails_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderDetails_order_fulfillments_lines_orderLine | null; +} + +export interface OrderDetails_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderDetails_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderDetails_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDetails_order_lines_unitPrice_gross; + net: OrderDetails_order_lines_unitPrice_net; +} + +export interface OrderDetails_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDetails_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDetails_order_lines_unitPrice | null; + thumbnail: OrderDetails_order_lines_thumbnail | null; +} + +export interface OrderDetails_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDetails_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDetails_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDetails_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderDetails_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderDetails_order_shippingPrice_gross; +} + +export interface OrderDetails_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderDetails_order_subtotal_gross; +} + +export interface OrderDetails_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_total { + __typename: "TaxedMoney"; + gross: OrderDetails_order_total_gross; + tax: OrderDetails_order_total_tax; +} + +export interface OrderDetails_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDetails_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetails_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderDetails_order_availableShippingMethods_price | null; +} + +export interface OrderDetails_order { + __typename: "Order"; + id: string; + billingAddress: OrderDetails_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderDetails_order_events | null)[] | null; + fulfillments: (OrderDetails_order_fulfillments | null)[]; + lines: (OrderDetails_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderDetails_order_shippingAddress | null; + shippingMethod: OrderDetails_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderDetails_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderDetails_order_subtotal | null; + total: OrderDetails_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderDetails_order_totalAuthorized | null; + totalCaptured: OrderDetails_order_totalCaptured | null; + user: OrderDetails_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderDetails_order_availableShippingMethods | null)[] | null; +} + +export interface OrderDetails_shop_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDetails_shop { + __typename: "Shop"; + countries: (OrderDetails_shop_countries | null)[]; + defaultWeightUnit: WeightUnitsEnum | null; +} + +export interface OrderDetails { + order: OrderDetails_order | null; + shop: OrderDetails_shop | null; +} + +export interface OrderDetailsVariables { + id: string; +} diff --git a/src/orders/types/OrderDetailsFragment.ts b/src/orders/types/OrderDetailsFragment.ts new file mode 100644 index 000000000..fc2f5d3ba --- /dev/null +++ b/src/orders/types/OrderDetailsFragment.ts @@ -0,0 +1,261 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: OrderDetailsFragment +// ==================================================== + +export interface OrderDetailsFragment_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDetailsFragment_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDetailsFragment_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDetailsFragment_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDetailsFragment_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderDetailsFragment_events_user | null; +} + +export interface OrderDetailsFragment_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDetailsFragment_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderDetailsFragment_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderDetailsFragment_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDetailsFragment_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDetailsFragment_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderDetailsFragment_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderDetailsFragment_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderDetailsFragment_fulfillments_lines_orderLine | null; +} + +export interface OrderDetailsFragment_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderDetailsFragment_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderDetailsFragment_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDetailsFragment_lines_unitPrice_gross; + net: OrderDetailsFragment_lines_unitPrice_net; +} + +export interface OrderDetailsFragment_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDetailsFragment_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDetailsFragment_lines_unitPrice | null; + thumbnail: OrderDetailsFragment_lines_thumbnail | null; +} + +export interface OrderDetailsFragment_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDetailsFragment_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDetailsFragment_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDetailsFragment_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderDetailsFragment_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderDetailsFragment_shippingPrice_gross; +} + +export interface OrderDetailsFragment_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_subtotal { + __typename: "TaxedMoney"; + gross: OrderDetailsFragment_subtotal_gross; +} + +export interface OrderDetailsFragment_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_total { + __typename: "TaxedMoney"; + gross: OrderDetailsFragment_total_gross; + tax: OrderDetailsFragment_total_tax; +} + +export interface OrderDetailsFragment_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDetailsFragment_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDetailsFragment_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderDetailsFragment_availableShippingMethods_price | null; +} + +export interface OrderDetailsFragment { + __typename: "Order"; + id: string; + billingAddress: OrderDetailsFragment_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderDetailsFragment_events | null)[] | null; + fulfillments: (OrderDetailsFragment_fulfillments | null)[]; + lines: (OrderDetailsFragment_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderDetailsFragment_shippingAddress | null; + shippingMethod: OrderDetailsFragment_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderDetailsFragment_shippingPrice | null; + status: OrderStatus; + subtotal: OrderDetailsFragment_subtotal | null; + total: OrderDetailsFragment_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderDetailsFragment_totalAuthorized | null; + totalCaptured: OrderDetailsFragment_totalCaptured | null; + user: OrderDetailsFragment_user | null; + userEmail: string | null; + availableShippingMethods: (OrderDetailsFragment_availableShippingMethods | null)[] | null; +} diff --git a/src/orders/types/OrderDraftBulkCancel.ts b/src/orders/types/OrderDraftBulkCancel.ts new file mode 100644 index 000000000..e679e9055 --- /dev/null +++ b/src/orders/types/OrderDraftBulkCancel.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: OrderDraftBulkCancel +// ==================================================== + +export interface OrderDraftBulkCancel_draftOrderBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderDraftBulkCancel_draftOrderBulkDelete { + __typename: "DraftOrderBulkDelete"; + errors: OrderDraftBulkCancel_draftOrderBulkDelete_errors[] | null; +} + +export interface OrderDraftBulkCancel { + draftOrderBulkDelete: OrderDraftBulkCancel_draftOrderBulkDelete | null; +} + +export interface OrderDraftBulkCancelVariables { + ids: (string | null)[]; +} diff --git a/src/orders/types/OrderDraftCancel.ts b/src/orders/types/OrderDraftCancel.ts new file mode 100644 index 000000000..675b8bac5 --- /dev/null +++ b/src/orders/types/OrderDraftCancel.ts @@ -0,0 +1,281 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderDraftCancel +// ==================================================== + +export interface OrderDraftCancel_draftOrderDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderDraftCancel_draftOrderDelete_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDraftCancel_draftOrderDelete_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderDraftCancel_draftOrderDelete_order_events_user | null; +} + +export interface OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderDraftCancel_draftOrderDelete_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderDraftCancel_draftOrderDelete_order_fulfillments_lines_orderLine | null; +} + +export interface OrderDraftCancel_draftOrderDelete_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderDraftCancel_draftOrderDelete_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDraftCancel_draftOrderDelete_order_lines_unitPrice_gross; + net: OrderDraftCancel_draftOrderDelete_order_lines_unitPrice_net; +} + +export interface OrderDraftCancel_draftOrderDelete_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDraftCancel_draftOrderDelete_order_lines_unitPrice | null; + thumbnail: OrderDraftCancel_draftOrderDelete_order_lines_thumbnail | null; +} + +export interface OrderDraftCancel_draftOrderDelete_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDraftCancel_draftOrderDelete_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderDraftCancel_draftOrderDelete_order_shippingPrice_gross; +} + +export interface OrderDraftCancel_draftOrderDelete_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderDraftCancel_draftOrderDelete_order_subtotal_gross; +} + +export interface OrderDraftCancel_draftOrderDelete_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_total { + __typename: "TaxedMoney"; + gross: OrderDraftCancel_draftOrderDelete_order_total_gross; + tax: OrderDraftCancel_draftOrderDelete_order_total_tax; +} + +export interface OrderDraftCancel_draftOrderDelete_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftCancel_draftOrderDelete_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderDraftCancel_draftOrderDelete_order_availableShippingMethods_price | null; +} + +export interface OrderDraftCancel_draftOrderDelete_order { + __typename: "Order"; + id: string; + billingAddress: OrderDraftCancel_draftOrderDelete_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderDraftCancel_draftOrderDelete_order_events | null)[] | null; + fulfillments: (OrderDraftCancel_draftOrderDelete_order_fulfillments | null)[]; + lines: (OrderDraftCancel_draftOrderDelete_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderDraftCancel_draftOrderDelete_order_shippingAddress | null; + shippingMethod: OrderDraftCancel_draftOrderDelete_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderDraftCancel_draftOrderDelete_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderDraftCancel_draftOrderDelete_order_subtotal | null; + total: OrderDraftCancel_draftOrderDelete_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderDraftCancel_draftOrderDelete_order_totalAuthorized | null; + totalCaptured: OrderDraftCancel_draftOrderDelete_order_totalCaptured | null; + user: OrderDraftCancel_draftOrderDelete_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderDraftCancel_draftOrderDelete_order_availableShippingMethods | null)[] | null; +} + +export interface OrderDraftCancel_draftOrderDelete { + __typename: "DraftOrderDelete"; + errors: OrderDraftCancel_draftOrderDelete_errors[] | null; + order: OrderDraftCancel_draftOrderDelete_order | null; +} + +export interface OrderDraftCancel { + draftOrderDelete: OrderDraftCancel_draftOrderDelete | null; +} + +export interface OrderDraftCancelVariables { + id: string; +} diff --git a/src/orders/types/OrderDraftCreate.ts b/src/orders/types/OrderDraftCreate.ts new file mode 100644 index 000000000..a978459cc --- /dev/null +++ b/src/orders/types/OrderDraftCreate.ts @@ -0,0 +1,28 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: OrderDraftCreate +// ==================================================== + +export interface OrderDraftCreate_draftOrderCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderDraftCreate_draftOrderCreate_order { + __typename: "Order"; + id: string; +} + +export interface OrderDraftCreate_draftOrderCreate { + __typename: "DraftOrderCreate"; + errors: OrderDraftCreate_draftOrderCreate_errors[] | null; + order: OrderDraftCreate_draftOrderCreate_order | null; +} + +export interface OrderDraftCreate { + draftOrderCreate: OrderDraftCreate_draftOrderCreate | null; +} diff --git a/src/orders/types/OrderDraftFinalize.ts b/src/orders/types/OrderDraftFinalize.ts new file mode 100644 index 000000000..5076ae026 --- /dev/null +++ b/src/orders/types/OrderDraftFinalize.ts @@ -0,0 +1,281 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderDraftFinalize +// ==================================================== + +export interface OrderDraftFinalize_draftOrderComplete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDraftFinalize_draftOrderComplete_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderDraftFinalize_draftOrderComplete_order_events_user | null; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines_orderLine | null; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderDraftFinalize_draftOrderComplete_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDraftFinalize_draftOrderComplete_order_lines_unitPrice_gross; + net: OrderDraftFinalize_draftOrderComplete_order_lines_unitPrice_net; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDraftFinalize_draftOrderComplete_order_lines_unitPrice | null; + thumbnail: OrderDraftFinalize_draftOrderComplete_order_lines_thumbnail | null; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDraftFinalize_draftOrderComplete_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderDraftFinalize_draftOrderComplete_order_shippingPrice_gross; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderDraftFinalize_draftOrderComplete_order_subtotal_gross; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_total { + __typename: "TaxedMoney"; + gross: OrderDraftFinalize_draftOrderComplete_order_total_gross; + tax: OrderDraftFinalize_draftOrderComplete_order_total_tax; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftFinalize_draftOrderComplete_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderDraftFinalize_draftOrderComplete_order_availableShippingMethods_price | null; +} + +export interface OrderDraftFinalize_draftOrderComplete_order { + __typename: "Order"; + id: string; + billingAddress: OrderDraftFinalize_draftOrderComplete_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderDraftFinalize_draftOrderComplete_order_events | null)[] | null; + fulfillments: (OrderDraftFinalize_draftOrderComplete_order_fulfillments | null)[]; + lines: (OrderDraftFinalize_draftOrderComplete_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderDraftFinalize_draftOrderComplete_order_shippingAddress | null; + shippingMethod: OrderDraftFinalize_draftOrderComplete_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderDraftFinalize_draftOrderComplete_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderDraftFinalize_draftOrderComplete_order_subtotal | null; + total: OrderDraftFinalize_draftOrderComplete_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderDraftFinalize_draftOrderComplete_order_totalAuthorized | null; + totalCaptured: OrderDraftFinalize_draftOrderComplete_order_totalCaptured | null; + user: OrderDraftFinalize_draftOrderComplete_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderDraftFinalize_draftOrderComplete_order_availableShippingMethods | null)[] | null; +} + +export interface OrderDraftFinalize_draftOrderComplete { + __typename: "DraftOrderComplete"; + errors: OrderDraftFinalize_draftOrderComplete_errors[] | null; + order: OrderDraftFinalize_draftOrderComplete_order | null; +} + +export interface OrderDraftFinalize { + draftOrderComplete: OrderDraftFinalize_draftOrderComplete | null; +} + +export interface OrderDraftFinalizeVariables { + id: string; +} diff --git a/src/orders/types/OrderDraftList.ts b/src/orders/types/OrderDraftList.ts new file mode 100644 index 000000000..c3567edca --- /dev/null +++ b/src/orders/types/OrderDraftList.ts @@ -0,0 +1,84 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PaymentChargeStatusEnum, OrderStatus } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: OrderDraftList +// ==================================================== + +export interface OrderDraftList_draftOrders_edges_node_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDraftList_draftOrders_edges_node_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDraftList_draftOrders_edges_node_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDraftList_draftOrders_edges_node_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftList_draftOrders_edges_node_total { + __typename: "TaxedMoney"; + gross: OrderDraftList_draftOrders_edges_node_total_gross; +} + +export interface OrderDraftList_draftOrders_edges_node { + __typename: "Order"; + billingAddress: OrderDraftList_draftOrders_edges_node_billingAddress | null; + created: any; + id: string; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + status: OrderStatus; + total: OrderDraftList_draftOrders_edges_node_total | null; + userEmail: string | null; +} + +export interface OrderDraftList_draftOrders_edges { + __typename: "OrderCountableEdge"; + node: OrderDraftList_draftOrders_edges_node; +} + +export interface OrderDraftList_draftOrders_pageInfo { + __typename: "PageInfo"; + hasPreviousPage: boolean; + hasNextPage: boolean; + startCursor: string | null; + endCursor: string | null; +} + +export interface OrderDraftList_draftOrders { + __typename: "OrderCountableConnection"; + edges: OrderDraftList_draftOrders_edges[]; + pageInfo: OrderDraftList_draftOrders_pageInfo; +} + +export interface OrderDraftList { + draftOrders: OrderDraftList_draftOrders | null; +} + +export interface OrderDraftListVariables { + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/orders/types/OrderDraftUpdate.ts b/src/orders/types/OrderDraftUpdate.ts new file mode 100644 index 000000000..6d446e0fe --- /dev/null +++ b/src/orders/types/OrderDraftUpdate.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { DraftOrderInput, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderDraftUpdate +// ==================================================== + +export interface OrderDraftUpdate_draftOrderUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDraftUpdate_draftOrderUpdate_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderDraftUpdate_draftOrderUpdate_order_events_user | null; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines_orderLine | null; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderDraftUpdate_draftOrderUpdate_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderDraftUpdate_draftOrderUpdate_order_lines_unitPrice_gross; + net: OrderDraftUpdate_draftOrderUpdate_order_lines_unitPrice_net; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderDraftUpdate_draftOrderUpdate_order_lines_unitPrice | null; + thumbnail: OrderDraftUpdate_draftOrderUpdate_order_lines_thumbnail | null; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderDraftUpdate_draftOrderUpdate_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderDraftUpdate_draftOrderUpdate_order_shippingPrice_gross; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderDraftUpdate_draftOrderUpdate_order_subtotal_gross; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_total { + __typename: "TaxedMoney"; + gross: OrderDraftUpdate_draftOrderUpdate_order_total_gross; + tax: OrderDraftUpdate_draftOrderUpdate_order_total_tax; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderDraftUpdate_draftOrderUpdate_order_availableShippingMethods_price | null; +} + +export interface OrderDraftUpdate_draftOrderUpdate_order { + __typename: "Order"; + id: string; + billingAddress: OrderDraftUpdate_draftOrderUpdate_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderDraftUpdate_draftOrderUpdate_order_events | null)[] | null; + fulfillments: (OrderDraftUpdate_draftOrderUpdate_order_fulfillments | null)[]; + lines: (OrderDraftUpdate_draftOrderUpdate_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderDraftUpdate_draftOrderUpdate_order_shippingAddress | null; + shippingMethod: OrderDraftUpdate_draftOrderUpdate_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderDraftUpdate_draftOrderUpdate_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderDraftUpdate_draftOrderUpdate_order_subtotal | null; + total: OrderDraftUpdate_draftOrderUpdate_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderDraftUpdate_draftOrderUpdate_order_totalAuthorized | null; + totalCaptured: OrderDraftUpdate_draftOrderUpdate_order_totalCaptured | null; + user: OrderDraftUpdate_draftOrderUpdate_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderDraftUpdate_draftOrderUpdate_order_availableShippingMethods | null)[] | null; +} + +export interface OrderDraftUpdate_draftOrderUpdate { + __typename: "DraftOrderUpdate"; + errors: OrderDraftUpdate_draftOrderUpdate_errors[] | null; + order: OrderDraftUpdate_draftOrderUpdate_order | null; +} + +export interface OrderDraftUpdate { + draftOrderUpdate: OrderDraftUpdate_draftOrderUpdate | null; +} + +export interface OrderDraftUpdateVariables { + id: string; + input: DraftOrderInput; +} diff --git a/src/orders/types/OrderEventFragment.ts b/src/orders/types/OrderEventFragment.ts new file mode 100644 index 000000000..324d3d958 --- /dev/null +++ b/src/orders/types/OrderEventFragment.ts @@ -0,0 +1,28 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: OrderEventFragment +// ==================================================== + +export interface OrderEventFragment_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderEventFragment { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderEventFragment_user | null; +} diff --git a/src/orders/types/OrderFulfillmentCancel.ts b/src/orders/types/OrderFulfillmentCancel.ts new file mode 100644 index 000000000..217ddda7b --- /dev/null +++ b/src/orders/types/OrderFulfillmentCancel.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { FulfillmentCancelInput, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderFulfillmentCancel +// ==================================================== + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderFulfillmentCancel_orderFulfillmentCancel_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderFulfillmentCancel_orderFulfillmentCancel_order_events_user | null; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines_orderLine | null; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderFulfillmentCancel_orderFulfillmentCancel_order_lines_unitPrice_gross; + net: OrderFulfillmentCancel_orderFulfillmentCancel_order_lines_unitPrice_net; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderFulfillmentCancel_orderFulfillmentCancel_order_lines_unitPrice | null; + thumbnail: OrderFulfillmentCancel_orderFulfillmentCancel_order_lines_thumbnail | null; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingPrice_gross; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderFulfillmentCancel_orderFulfillmentCancel_order_subtotal_gross; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_total { + __typename: "TaxedMoney"; + gross: OrderFulfillmentCancel_orderFulfillmentCancel_order_total_gross; + tax: OrderFulfillmentCancel_orderFulfillmentCancel_order_total_tax; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderFulfillmentCancel_orderFulfillmentCancel_order_availableShippingMethods_price | null; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order { + __typename: "Order"; + id: string; + billingAddress: OrderFulfillmentCancel_orderFulfillmentCancel_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderFulfillmentCancel_orderFulfillmentCancel_order_events | null)[] | null; + fulfillments: (OrderFulfillmentCancel_orderFulfillmentCancel_order_fulfillments | null)[]; + lines: (OrderFulfillmentCancel_orderFulfillmentCancel_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingAddress | null; + shippingMethod: OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderFulfillmentCancel_orderFulfillmentCancel_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderFulfillmentCancel_orderFulfillmentCancel_order_subtotal | null; + total: OrderFulfillmentCancel_orderFulfillmentCancel_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderFulfillmentCancel_orderFulfillmentCancel_order_totalAuthorized | null; + totalCaptured: OrderFulfillmentCancel_orderFulfillmentCancel_order_totalCaptured | null; + user: OrderFulfillmentCancel_orderFulfillmentCancel_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderFulfillmentCancel_orderFulfillmentCancel_order_availableShippingMethods | null)[] | null; +} + +export interface OrderFulfillmentCancel_orderFulfillmentCancel { + __typename: "FulfillmentCancel"; + errors: OrderFulfillmentCancel_orderFulfillmentCancel_errors[] | null; + order: OrderFulfillmentCancel_orderFulfillmentCancel_order | null; +} + +export interface OrderFulfillmentCancel { + orderFulfillmentCancel: OrderFulfillmentCancel_orderFulfillmentCancel | null; +} + +export interface OrderFulfillmentCancelVariables { + id: string; + input: FulfillmentCancelInput; +} diff --git a/src/orders/types/OrderFulfillmentUpdateTracking.ts b/src/orders/types/OrderFulfillmentUpdateTracking.ts new file mode 100644 index 000000000..e1a912f15 --- /dev/null +++ b/src/orders/types/OrderFulfillmentUpdateTracking.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { FulfillmentUpdateTrackingInput, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderFulfillmentUpdateTracking +// ==================================================== + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_events_user | null; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines_orderLine | null; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines_unitPrice_gross; + net: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines_unitPrice_net; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines_unitPrice | null; + thumbnail: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines_thumbnail | null; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingPrice_gross; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_subtotal_gross; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_total { + __typename: "TaxedMoney"; + gross: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_total_gross; + tax: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_total_tax; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_availableShippingMethods_price | null; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order { + __typename: "Order"; + id: string; + billingAddress: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_events | null)[] | null; + fulfillments: (OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_fulfillments | null)[]; + lines: (OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingAddress | null; + shippingMethod: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_subtotal | null; + total: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_totalAuthorized | null; + totalCaptured: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_totalCaptured | null; + user: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_availableShippingMethods | null)[] | null; +} + +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking { + __typename: "FulfillmentUpdateTracking"; + errors: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_errors[] | null; + order: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order | null; +} + +export interface OrderFulfillmentUpdateTracking { + orderFulfillmentUpdateTracking: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking | null; +} + +export interface OrderFulfillmentUpdateTrackingVariables { + id: string; + input: FulfillmentUpdateTrackingInput; +} diff --git a/src/orders/types/OrderLineDelete.ts b/src/orders/types/OrderLineDelete.ts new file mode 100644 index 000000000..946439ad2 --- /dev/null +++ b/src/orders/types/OrderLineDelete.ts @@ -0,0 +1,281 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderLineDelete +// ==================================================== + +export interface OrderLineDelete_draftOrderLineDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderLineDelete_draftOrderLineDelete_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderLineDelete_draftOrderLineDelete_order_events_user | null; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines_orderLine | null; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderLineDelete_draftOrderLineDelete_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderLineDelete_draftOrderLineDelete_order_lines_unitPrice_gross; + net: OrderLineDelete_draftOrderLineDelete_order_lines_unitPrice_net; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderLineDelete_draftOrderLineDelete_order_lines_unitPrice | null; + thumbnail: OrderLineDelete_draftOrderLineDelete_order_lines_thumbnail | null; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderLineDelete_draftOrderLineDelete_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderLineDelete_draftOrderLineDelete_order_shippingPrice_gross; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderLineDelete_draftOrderLineDelete_order_subtotal_gross; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_total { + __typename: "TaxedMoney"; + gross: OrderLineDelete_draftOrderLineDelete_order_total_gross; + tax: OrderLineDelete_draftOrderLineDelete_order_total_tax; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineDelete_draftOrderLineDelete_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderLineDelete_draftOrderLineDelete_order_availableShippingMethods_price | null; +} + +export interface OrderLineDelete_draftOrderLineDelete_order { + __typename: "Order"; + id: string; + billingAddress: OrderLineDelete_draftOrderLineDelete_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderLineDelete_draftOrderLineDelete_order_events | null)[] | null; + fulfillments: (OrderLineDelete_draftOrderLineDelete_order_fulfillments | null)[]; + lines: (OrderLineDelete_draftOrderLineDelete_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderLineDelete_draftOrderLineDelete_order_shippingAddress | null; + shippingMethod: OrderLineDelete_draftOrderLineDelete_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderLineDelete_draftOrderLineDelete_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderLineDelete_draftOrderLineDelete_order_subtotal | null; + total: OrderLineDelete_draftOrderLineDelete_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderLineDelete_draftOrderLineDelete_order_totalAuthorized | null; + totalCaptured: OrderLineDelete_draftOrderLineDelete_order_totalCaptured | null; + user: OrderLineDelete_draftOrderLineDelete_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderLineDelete_draftOrderLineDelete_order_availableShippingMethods | null)[] | null; +} + +export interface OrderLineDelete_draftOrderLineDelete { + __typename: "DraftOrderLineDelete"; + errors: OrderLineDelete_draftOrderLineDelete_errors[] | null; + order: OrderLineDelete_draftOrderLineDelete_order | null; +} + +export interface OrderLineDelete { + draftOrderLineDelete: OrderLineDelete_draftOrderLineDelete | null; +} + +export interface OrderLineDeleteVariables { + id: string; +} diff --git a/src/orders/types/OrderLineFragment.ts b/src/orders/types/OrderLineFragment.ts new file mode 100644 index 000000000..725832671 --- /dev/null +++ b/src/orders/types/OrderLineFragment.ts @@ -0,0 +1,42 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: OrderLineFragment +// ==================================================== + +export interface OrderLineFragment_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineFragment_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineFragment_unitPrice { + __typename: "TaxedMoney"; + gross: OrderLineFragment_unitPrice_gross; + net: OrderLineFragment_unitPrice_net; +} + +export interface OrderLineFragment_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderLineFragment { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderLineFragment_unitPrice | null; + thumbnail: OrderLineFragment_thumbnail | null; +} diff --git a/src/orders/types/OrderLineUpdate.ts b/src/orders/types/OrderLineUpdate.ts new file mode 100644 index 000000000..a511163ad --- /dev/null +++ b/src/orders/types/OrderLineUpdate.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderLineInput, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderLineUpdate +// ==================================================== + +export interface OrderLineUpdate_draftOrderLineUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderLineUpdate_draftOrderLineUpdate_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderLineUpdate_draftOrderLineUpdate_order_events_user | null; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines_orderLine | null; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderLineUpdate_draftOrderLineUpdate_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderLineUpdate_draftOrderLineUpdate_order_lines_unitPrice_gross; + net: OrderLineUpdate_draftOrderLineUpdate_order_lines_unitPrice_net; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderLineUpdate_draftOrderLineUpdate_order_lines_unitPrice | null; + thumbnail: OrderLineUpdate_draftOrderLineUpdate_order_lines_thumbnail | null; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderLineUpdate_draftOrderLineUpdate_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderLineUpdate_draftOrderLineUpdate_order_shippingPrice_gross; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderLineUpdate_draftOrderLineUpdate_order_subtotal_gross; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_total { + __typename: "TaxedMoney"; + gross: OrderLineUpdate_draftOrderLineUpdate_order_total_gross; + tax: OrderLineUpdate_draftOrderLineUpdate_order_total_tax; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderLineUpdate_draftOrderLineUpdate_order_availableShippingMethods_price | null; +} + +export interface OrderLineUpdate_draftOrderLineUpdate_order { + __typename: "Order"; + id: string; + billingAddress: OrderLineUpdate_draftOrderLineUpdate_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderLineUpdate_draftOrderLineUpdate_order_events | null)[] | null; + fulfillments: (OrderLineUpdate_draftOrderLineUpdate_order_fulfillments | null)[]; + lines: (OrderLineUpdate_draftOrderLineUpdate_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderLineUpdate_draftOrderLineUpdate_order_shippingAddress | null; + shippingMethod: OrderLineUpdate_draftOrderLineUpdate_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderLineUpdate_draftOrderLineUpdate_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderLineUpdate_draftOrderLineUpdate_order_subtotal | null; + total: OrderLineUpdate_draftOrderLineUpdate_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderLineUpdate_draftOrderLineUpdate_order_totalAuthorized | null; + totalCaptured: OrderLineUpdate_draftOrderLineUpdate_order_totalCaptured | null; + user: OrderLineUpdate_draftOrderLineUpdate_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderLineUpdate_draftOrderLineUpdate_order_availableShippingMethods | null)[] | null; +} + +export interface OrderLineUpdate_draftOrderLineUpdate { + __typename: "DraftOrderLineUpdate"; + errors: OrderLineUpdate_draftOrderLineUpdate_errors[] | null; + order: OrderLineUpdate_draftOrderLineUpdate_order | null; +} + +export interface OrderLineUpdate { + draftOrderLineUpdate: OrderLineUpdate_draftOrderLineUpdate | null; +} + +export interface OrderLineUpdateVariables { + id: string; + input: OrderLineInput; +} diff --git a/src/orders/types/OrderLinesAdd.ts b/src/orders/types/OrderLinesAdd.ts new file mode 100644 index 000000000..763011990 --- /dev/null +++ b/src/orders/types/OrderLinesAdd.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderLineCreateInput, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderLinesAdd +// ==================================================== + +export interface OrderLinesAdd_draftOrderLinesCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderLinesAdd_draftOrderLinesCreate_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderLinesAdd_draftOrderLinesCreate_order_events_user | null; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines_orderLine | null; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderLinesAdd_draftOrderLinesCreate_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderLinesAdd_draftOrderLinesCreate_order_lines_unitPrice_gross; + net: OrderLinesAdd_draftOrderLinesCreate_order_lines_unitPrice_net; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderLinesAdd_draftOrderLinesCreate_order_lines_unitPrice | null; + thumbnail: OrderLinesAdd_draftOrderLinesCreate_order_lines_thumbnail | null; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderLinesAdd_draftOrderLinesCreate_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderLinesAdd_draftOrderLinesCreate_order_shippingPrice_gross; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderLinesAdd_draftOrderLinesCreate_order_subtotal_gross; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_total { + __typename: "TaxedMoney"; + gross: OrderLinesAdd_draftOrderLinesCreate_order_total_gross; + tax: OrderLinesAdd_draftOrderLinesCreate_order_total_tax; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderLinesAdd_draftOrderLinesCreate_order_availableShippingMethods_price | null; +} + +export interface OrderLinesAdd_draftOrderLinesCreate_order { + __typename: "Order"; + id: string; + billingAddress: OrderLinesAdd_draftOrderLinesCreate_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderLinesAdd_draftOrderLinesCreate_order_events | null)[] | null; + fulfillments: (OrderLinesAdd_draftOrderLinesCreate_order_fulfillments | null)[]; + lines: (OrderLinesAdd_draftOrderLinesCreate_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderLinesAdd_draftOrderLinesCreate_order_shippingAddress | null; + shippingMethod: OrderLinesAdd_draftOrderLinesCreate_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderLinesAdd_draftOrderLinesCreate_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderLinesAdd_draftOrderLinesCreate_order_subtotal | null; + total: OrderLinesAdd_draftOrderLinesCreate_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderLinesAdd_draftOrderLinesCreate_order_totalAuthorized | null; + totalCaptured: OrderLinesAdd_draftOrderLinesCreate_order_totalCaptured | null; + user: OrderLinesAdd_draftOrderLinesCreate_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderLinesAdd_draftOrderLinesCreate_order_availableShippingMethods | null)[] | null; +} + +export interface OrderLinesAdd_draftOrderLinesCreate { + __typename: "DraftOrderLinesCreate"; + errors: OrderLinesAdd_draftOrderLinesCreate_errors[] | null; + order: OrderLinesAdd_draftOrderLinesCreate_order | null; +} + +export interface OrderLinesAdd { + draftOrderLinesCreate: OrderLinesAdd_draftOrderLinesCreate | null; +} + +export interface OrderLinesAddVariables { + id: string; + input: (OrderLineCreateInput | null)[]; +} diff --git a/src/orders/types/OrderList.ts b/src/orders/types/OrderList.ts new file mode 100644 index 000000000..959ca2309 --- /dev/null +++ b/src/orders/types/OrderList.ts @@ -0,0 +1,86 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderStatusFilter, OrderFilterInput, PaymentChargeStatusEnum, OrderStatus } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: OrderList +// ==================================================== + +export interface OrderList_orders_edges_node_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderList_orders_edges_node_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderList_orders_edges_node_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderList_orders_edges_node_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderList_orders_edges_node_total { + __typename: "TaxedMoney"; + gross: OrderList_orders_edges_node_total_gross; +} + +export interface OrderList_orders_edges_node { + __typename: "Order"; + billingAddress: OrderList_orders_edges_node_billingAddress | null; + created: any; + id: string; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + status: OrderStatus; + total: OrderList_orders_edges_node_total | null; + userEmail: string | null; +} + +export interface OrderList_orders_edges { + __typename: "OrderCountableEdge"; + node: OrderList_orders_edges_node; +} + +export interface OrderList_orders_pageInfo { + __typename: "PageInfo"; + hasPreviousPage: boolean; + hasNextPage: boolean; + startCursor: string | null; + endCursor: string | null; +} + +export interface OrderList_orders { + __typename: "OrderCountableConnection"; + edges: OrderList_orders_edges[]; + pageInfo: OrderList_orders_pageInfo; +} + +export interface OrderList { + orders: OrderList_orders | null; +} + +export interface OrderListVariables { + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; + status?: OrderStatusFilter | null; + filter?: OrderFilterInput | null; +} diff --git a/src/orders/types/OrderMarkAsPaid.ts b/src/orders/types/OrderMarkAsPaid.ts new file mode 100644 index 000000000..821ed8d39 --- /dev/null +++ b/src/orders/types/OrderMarkAsPaid.ts @@ -0,0 +1,281 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderMarkAsPaid +// ==================================================== + +export interface OrderMarkAsPaid_orderMarkAsPaid_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderMarkAsPaid_orderMarkAsPaid_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderMarkAsPaid_orderMarkAsPaid_order_events_user | null; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines_orderLine | null; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderMarkAsPaid_orderMarkAsPaid_order_lines_unitPrice_gross; + net: OrderMarkAsPaid_orderMarkAsPaid_order_lines_unitPrice_net; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderMarkAsPaid_orderMarkAsPaid_order_lines_unitPrice | null; + thumbnail: OrderMarkAsPaid_orderMarkAsPaid_order_lines_thumbnail | null; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderMarkAsPaid_orderMarkAsPaid_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderMarkAsPaid_orderMarkAsPaid_order_shippingPrice_gross; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderMarkAsPaid_orderMarkAsPaid_order_subtotal_gross; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_total { + __typename: "TaxedMoney"; + gross: OrderMarkAsPaid_orderMarkAsPaid_order_total_gross; + tax: OrderMarkAsPaid_orderMarkAsPaid_order_total_tax; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderMarkAsPaid_orderMarkAsPaid_order_availableShippingMethods_price | null; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid_order { + __typename: "Order"; + id: string; + billingAddress: OrderMarkAsPaid_orderMarkAsPaid_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderMarkAsPaid_orderMarkAsPaid_order_events | null)[] | null; + fulfillments: (OrderMarkAsPaid_orderMarkAsPaid_order_fulfillments | null)[]; + lines: (OrderMarkAsPaid_orderMarkAsPaid_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderMarkAsPaid_orderMarkAsPaid_order_shippingAddress | null; + shippingMethod: OrderMarkAsPaid_orderMarkAsPaid_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderMarkAsPaid_orderMarkAsPaid_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderMarkAsPaid_orderMarkAsPaid_order_subtotal | null; + total: OrderMarkAsPaid_orderMarkAsPaid_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderMarkAsPaid_orderMarkAsPaid_order_totalAuthorized | null; + totalCaptured: OrderMarkAsPaid_orderMarkAsPaid_order_totalCaptured | null; + user: OrderMarkAsPaid_orderMarkAsPaid_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderMarkAsPaid_orderMarkAsPaid_order_availableShippingMethods | null)[] | null; +} + +export interface OrderMarkAsPaid_orderMarkAsPaid { + __typename: "OrderMarkAsPaid"; + errors: OrderMarkAsPaid_orderMarkAsPaid_errors[] | null; + order: OrderMarkAsPaid_orderMarkAsPaid_order | null; +} + +export interface OrderMarkAsPaid { + orderMarkAsPaid: OrderMarkAsPaid_orderMarkAsPaid | null; +} + +export interface OrderMarkAsPaidVariables { + id: string; +} diff --git a/src/orders/types/OrderRefund.ts b/src/orders/types/OrderRefund.ts new file mode 100644 index 000000000..5fedbe1a9 --- /dev/null +++ b/src/orders/types/OrderRefund.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderRefund +// ==================================================== + +export interface OrderRefund_orderRefund_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderRefund_orderRefund_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderRefund_orderRefund_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderRefund_orderRefund_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderRefund_orderRefund_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderRefund_orderRefund_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderRefund_orderRefund_order_events_user | null; +} + +export interface OrderRefund_orderRefund_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderRefund_orderRefund_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderRefund_orderRefund_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderRefund_orderRefund_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderRefund_orderRefund_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderRefund_orderRefund_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderRefund_orderRefund_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderRefund_orderRefund_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderRefund_orderRefund_order_fulfillments_lines_orderLine | null; +} + +export interface OrderRefund_orderRefund_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderRefund_orderRefund_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderRefund_orderRefund_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderRefund_orderRefund_order_lines_unitPrice_gross; + net: OrderRefund_orderRefund_order_lines_unitPrice_net; +} + +export interface OrderRefund_orderRefund_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderRefund_orderRefund_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderRefund_orderRefund_order_lines_unitPrice | null; + thumbnail: OrderRefund_orderRefund_order_lines_thumbnail | null; +} + +export interface OrderRefund_orderRefund_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderRefund_orderRefund_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderRefund_orderRefund_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderRefund_orderRefund_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderRefund_orderRefund_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderRefund_orderRefund_order_shippingPrice_gross; +} + +export interface OrderRefund_orderRefund_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderRefund_orderRefund_order_subtotal_gross; +} + +export interface OrderRefund_orderRefund_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_total { + __typename: "TaxedMoney"; + gross: OrderRefund_orderRefund_order_total_gross; + tax: OrderRefund_orderRefund_order_total_tax; +} + +export interface OrderRefund_orderRefund_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderRefund_orderRefund_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRefund_orderRefund_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderRefund_orderRefund_order_availableShippingMethods_price | null; +} + +export interface OrderRefund_orderRefund_order { + __typename: "Order"; + id: string; + billingAddress: OrderRefund_orderRefund_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderRefund_orderRefund_order_events | null)[] | null; + fulfillments: (OrderRefund_orderRefund_order_fulfillments | null)[]; + lines: (OrderRefund_orderRefund_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderRefund_orderRefund_order_shippingAddress | null; + shippingMethod: OrderRefund_orderRefund_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderRefund_orderRefund_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderRefund_orderRefund_order_subtotal | null; + total: OrderRefund_orderRefund_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderRefund_orderRefund_order_totalAuthorized | null; + totalCaptured: OrderRefund_orderRefund_order_totalCaptured | null; + user: OrderRefund_orderRefund_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderRefund_orderRefund_order_availableShippingMethods | null)[] | null; +} + +export interface OrderRefund_orderRefund { + __typename: "OrderRefund"; + errors: OrderRefund_orderRefund_errors[] | null; + order: OrderRefund_orderRefund_order | null; +} + +export interface OrderRefund { + orderRefund: OrderRefund_orderRefund | null; +} + +export interface OrderRefundVariables { + id: string; + amount: any; +} diff --git a/src/orders/types/OrderRelease.ts b/src/orders/types/OrderRelease.ts new file mode 100644 index 000000000..0fb77a66f --- /dev/null +++ b/src/orders/types/OrderRelease.ts @@ -0,0 +1,267 @@ +/* tslint:disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderRelease +// ==================================================== + +export interface OrderRelease_orderRelease_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderRelease_orderRelease_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderRelease_orderRelease_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderRelease_orderRelease_order_events_user { + __typename: "User"; + email: string; +} + +export interface OrderRelease_orderRelease_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderRelease_orderRelease_order_events_user | null; +} + +export interface OrderRelease_orderRelease_order_fulfillments_lines_edges_node_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_fulfillments_lines_edges_node_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_fulfillments_lines_edges_node_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderRelease_orderRelease_order_fulfillments_lines_edges_node_orderLine_unitPrice_gross; + net: OrderRelease_orderRelease_order_fulfillments_lines_edges_node_orderLine_unitPrice_net; +} + +export interface OrderRelease_orderRelease_order_fulfillments_lines_edges_node_orderLine { + __typename: "OrderLine"; + id: string; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderRelease_orderRelease_order_fulfillments_lines_edges_node_orderLine_unitPrice | null; + thumbnailUrl: string | null; +} + +export interface OrderRelease_orderRelease_order_fulfillments_lines_edges_node { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderRelease_orderRelease_order_fulfillments_lines_edges_node_orderLine | null; +} + +export interface OrderRelease_orderRelease_order_fulfillments_lines_edges { + __typename: "FulfillmentLineCountableEdge"; + node: OrderRelease_orderRelease_order_fulfillments_lines_edges_node; +} + +export interface OrderRelease_orderRelease_order_fulfillments_lines { + __typename: "FulfillmentLineCountableConnection"; + edges: OrderRelease_orderRelease_order_fulfillments_lines_edges[]; +} + +export interface OrderRelease_orderRelease_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: OrderRelease_orderRelease_order_fulfillments_lines | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderRelease_orderRelease_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderRelease_orderRelease_order_lines_unitPrice_gross; + net: OrderRelease_orderRelease_order_lines_unitPrice_net; +} + +export interface OrderRelease_orderRelease_order_lines { + __typename: "OrderLine"; + id: string; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderRelease_orderRelease_order_lines_unitPrice | null; + thumbnailUrl: string | null; +} + +export interface OrderRelease_orderRelease_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderRelease_orderRelease_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderRelease_orderRelease_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderRelease_orderRelease_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderRelease_orderRelease_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderRelease_orderRelease_order_shippingPrice_gross; +} + +export interface OrderRelease_orderRelease_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderRelease_orderRelease_order_subtotal_gross; +} + +export interface OrderRelease_orderRelease_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_total { + __typename: "TaxedMoney"; + gross: OrderRelease_orderRelease_order_total_gross; + tax: OrderRelease_orderRelease_order_total_tax; +} + +export interface OrderRelease_orderRelease_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderRelease_orderRelease_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderRelease_orderRelease_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderRelease_orderRelease_order_availableShippingMethods_price | null; +} + +export interface OrderRelease_orderRelease_order { + __typename: "Order"; + id: string; + billingAddress: OrderRelease_orderRelease_order_billingAddress | null; + created: any; + events: (OrderRelease_orderRelease_order_events | null)[] | null; + fulfillments: (OrderRelease_orderRelease_order_fulfillments | null)[]; + lines: (OrderRelease_orderRelease_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderRelease_orderRelease_order_shippingAddress | null; + shippingMethod: OrderRelease_orderRelease_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderRelease_orderRelease_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderRelease_orderRelease_order_subtotal | null; + total: OrderRelease_orderRelease_order_total | null; + totalAuthorized: OrderRelease_orderRelease_order_totalAuthorized | null; + totalCaptured: OrderRelease_orderRelease_order_totalCaptured | null; + user: OrderRelease_orderRelease_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderRelease_orderRelease_order_availableShippingMethods | null)[] | null; +} + +export interface OrderRelease_orderRelease { + __typename: "OrderRelease"; + order: OrderRelease_orderRelease_order | null; +} + +export interface OrderRelease { + orderRelease: OrderRelease_orderRelease | null; +} + +export interface OrderReleaseVariables { + id: string; +} diff --git a/src/orders/types/OrderShippingMethodUpdate.ts b/src/orders/types/OrderShippingMethodUpdate.ts new file mode 100644 index 000000000..abeb03535 --- /dev/null +++ b/src/orders/types/OrderShippingMethodUpdate.ts @@ -0,0 +1,69 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderUpdateShippingInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderShippingMethodUpdate +// ==================================================== + +export interface OrderShippingMethodUpdate_orderUpdateShipping_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderShippingMethodUpdate_orderUpdateShipping_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; +} + +export interface OrderShippingMethodUpdate_orderUpdateShipping_order_shippingMethod_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderShippingMethodUpdate_orderUpdateShipping_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderShippingMethodUpdate_orderUpdateShipping_order_shippingMethod_price | null; +} + +export interface OrderShippingMethodUpdate_orderUpdateShipping_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderShippingMethodUpdate_orderUpdateShipping_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderShippingMethodUpdate_orderUpdateShipping_order_shippingPrice_gross; +} + +export interface OrderShippingMethodUpdate_orderUpdateShipping_order { + __typename: "Order"; + availableShippingMethods: (OrderShippingMethodUpdate_orderUpdateShipping_order_availableShippingMethods | null)[] | null; + id: string; + shippingMethod: OrderShippingMethodUpdate_orderUpdateShipping_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderShippingMethodUpdate_orderUpdateShipping_order_shippingPrice | null; +} + +export interface OrderShippingMethodUpdate_orderUpdateShipping { + __typename: "OrderUpdateShipping"; + errors: OrderShippingMethodUpdate_orderUpdateShipping_errors[] | null; + order: OrderShippingMethodUpdate_orderUpdateShipping_order | null; +} + +export interface OrderShippingMethodUpdate { + orderUpdateShipping: OrderShippingMethodUpdate_orderUpdateShipping | null; +} + +export interface OrderShippingMethodUpdateVariables { + id: string; + input: OrderUpdateShippingInput; +} diff --git a/src/orders/types/OrderShippingMethods.ts b/src/orders/types/OrderShippingMethods.ts new file mode 100644 index 000000000..818adf916 --- /dev/null +++ b/src/orders/types/OrderShippingMethods.ts @@ -0,0 +1,31 @@ +/* tslint:disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: OrderShippingMethods +// ==================================================== + +export interface OrderShippingMethods_shippingZones_edges_node_shippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; +} + +export interface OrderShippingMethods_shippingZones_edges_node { + __typename: "ShippingZone"; + shippingMethods: (OrderShippingMethods_shippingZones_edges_node_shippingMethods | null)[] | null; +} + +export interface OrderShippingMethods_shippingZones_edges { + __typename: "ShippingZoneCountableEdge"; + node: OrderShippingMethods_shippingZones_edges_node; +} + +export interface OrderShippingMethods_shippingZones { + __typename: "ShippingZoneCountableConnection"; + edges: OrderShippingMethods_shippingZones_edges[]; +} + +export interface OrderShippingMethods { + shippingZones: OrderShippingMethods_shippingZones | null; +} diff --git a/src/orders/types/OrderUpdate.ts b/src/orders/types/OrderUpdate.ts new file mode 100644 index 000000000..66946aaab --- /dev/null +++ b/src/orders/types/OrderUpdate.ts @@ -0,0 +1,82 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderUpdateInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderUpdate +// ==================================================== + +export interface OrderUpdate_orderUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderUpdate_orderUpdate_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderUpdate_orderUpdate_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderUpdate_orderUpdate_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderUpdate_orderUpdate_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderUpdate_orderUpdate_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderUpdate_orderUpdate_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderUpdate_orderUpdate_order { + __typename: "Order"; + id: string; + userEmail: string | null; + billingAddress: OrderUpdate_orderUpdate_order_billingAddress | null; + shippingAddress: OrderUpdate_orderUpdate_order_shippingAddress | null; +} + +export interface OrderUpdate_orderUpdate { + __typename: "OrderUpdate"; + errors: OrderUpdate_orderUpdate_errors[] | null; + order: OrderUpdate_orderUpdate_order | null; +} + +export interface OrderUpdate { + orderUpdate: OrderUpdate_orderUpdate | null; +} + +export interface OrderUpdateVariables { + id: string; + input: OrderUpdateInput; +} diff --git a/src/orders/types/OrderVoid.ts b/src/orders/types/OrderVoid.ts new file mode 100644 index 000000000..1d3e76026 --- /dev/null +++ b/src/orders/types/OrderVoid.ts @@ -0,0 +1,281 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: OrderVoid +// ==================================================== + +export interface OrderVoid_orderVoid_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface OrderVoid_orderVoid_order_billingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderVoid_orderVoid_order_billingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderVoid_orderVoid_order_billingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderVoid_orderVoid_order_events_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderVoid_orderVoid_order_events { + __typename: "OrderEvent"; + id: string; + amount: number | null; + date: any | null; + email: string | null; + emailType: OrderEventsEmailsEnum | null; + message: string | null; + quantity: number | null; + type: OrderEventsEnum | null; + user: OrderVoid_orderVoid_order_events_user | null; +} + +export interface OrderVoid_orderVoid_order_fulfillments_lines_orderLine_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_fulfillments_lines_orderLine_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_fulfillments_lines_orderLine_unitPrice { + __typename: "TaxedMoney"; + gross: OrderVoid_orderVoid_order_fulfillments_lines_orderLine_unitPrice_gross; + net: OrderVoid_orderVoid_order_fulfillments_lines_orderLine_unitPrice_net; +} + +export interface OrderVoid_orderVoid_order_fulfillments_lines_orderLine_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderVoid_orderVoid_order_fulfillments_lines_orderLine { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderVoid_orderVoid_order_fulfillments_lines_orderLine_unitPrice | null; + thumbnail: OrderVoid_orderVoid_order_fulfillments_lines_orderLine_thumbnail | null; +} + +export interface OrderVoid_orderVoid_order_fulfillments_lines { + __typename: "FulfillmentLine"; + id: string; + quantity: number; + orderLine: OrderVoid_orderVoid_order_fulfillments_lines_orderLine | null; +} + +export interface OrderVoid_orderVoid_order_fulfillments { + __typename: "Fulfillment"; + id: string; + lines: (OrderVoid_orderVoid_order_fulfillments_lines | null)[] | null; + fulfillmentOrder: number; + status: FulfillmentStatus; + trackingNumber: string; +} + +export interface OrderVoid_orderVoid_order_lines_unitPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_lines_unitPrice_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_lines_unitPrice { + __typename: "TaxedMoney"; + gross: OrderVoid_orderVoid_order_lines_unitPrice_gross; + net: OrderVoid_orderVoid_order_lines_unitPrice_net; +} + +export interface OrderVoid_orderVoid_order_lines_thumbnail { + __typename: "Image"; + url: string; +} + +export interface OrderVoid_orderVoid_order_lines { + __typename: "OrderLine"; + id: string; + isShippingRequired: boolean; + productName: string; + productSku: string; + quantity: number; + quantityFulfilled: number; + unitPrice: OrderVoid_orderVoid_order_lines_unitPrice | null; + thumbnail: OrderVoid_orderVoid_order_lines_thumbnail | null; +} + +export interface OrderVoid_orderVoid_order_shippingAddress_country { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface OrderVoid_orderVoid_order_shippingAddress { + __typename: "Address"; + city: string; + cityArea: string; + companyName: string; + country: OrderVoid_orderVoid_order_shippingAddress_country; + countryArea: string; + firstName: string; + id: string; + lastName: string; + phone: string | null; + postalCode: string; + streetAddress1: string; + streetAddress2: string; +} + +export interface OrderVoid_orderVoid_order_shippingMethod { + __typename: "ShippingMethod"; + id: string; +} + +export interface OrderVoid_orderVoid_order_shippingPrice_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_shippingPrice { + __typename: "TaxedMoney"; + gross: OrderVoid_orderVoid_order_shippingPrice_gross; +} + +export interface OrderVoid_orderVoid_order_subtotal_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_subtotal { + __typename: "TaxedMoney"; + gross: OrderVoid_orderVoid_order_subtotal_gross; +} + +export interface OrderVoid_orderVoid_order_total_gross { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_total_tax { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_total { + __typename: "TaxedMoney"; + gross: OrderVoid_orderVoid_order_total_gross; + tax: OrderVoid_orderVoid_order_total_tax; +} + +export interface OrderVoid_orderVoid_order_totalAuthorized { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_totalCaptured { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_user { + __typename: "User"; + id: string; + email: string; +} + +export interface OrderVoid_orderVoid_order_availableShippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface OrderVoid_orderVoid_order_availableShippingMethods { + __typename: "ShippingMethod"; + id: string; + name: string; + price: OrderVoid_orderVoid_order_availableShippingMethods_price | null; +} + +export interface OrderVoid_orderVoid_order { + __typename: "Order"; + id: string; + billingAddress: OrderVoid_orderVoid_order_billingAddress | null; + canFinalize: boolean; + created: any; + customerNote: string; + events: (OrderVoid_orderVoid_order_events | null)[] | null; + fulfillments: (OrderVoid_orderVoid_order_fulfillments | null)[]; + lines: (OrderVoid_orderVoid_order_lines | null)[]; + number: string | null; + paymentStatus: PaymentChargeStatusEnum | null; + shippingAddress: OrderVoid_orderVoid_order_shippingAddress | null; + shippingMethod: OrderVoid_orderVoid_order_shippingMethod | null; + shippingMethodName: string | null; + shippingPrice: OrderVoid_orderVoid_order_shippingPrice | null; + status: OrderStatus; + subtotal: OrderVoid_orderVoid_order_subtotal | null; + total: OrderVoid_orderVoid_order_total | null; + actions: (OrderAction | null)[]; + totalAuthorized: OrderVoid_orderVoid_order_totalAuthorized | null; + totalCaptured: OrderVoid_orderVoid_order_totalCaptured | null; + user: OrderVoid_orderVoid_order_user | null; + userEmail: string | null; + availableShippingMethods: (OrderVoid_orderVoid_order_availableShippingMethods | null)[] | null; +} + +export interface OrderVoid_orderVoid { + __typename: "OrderVoid"; + errors: OrderVoid_orderVoid_errors[] | null; + order: OrderVoid_orderVoid_order | null; +} + +export interface OrderVoid { + orderVoid: OrderVoid_orderVoid | null; +} + +export interface OrderVoidVariables { + id: string; +} diff --git a/src/orders/types/SearchOrderVariant.ts b/src/orders/types/SearchOrderVariant.ts new file mode 100644 index 000000000..f2f0949eb --- /dev/null +++ b/src/orders/types/SearchOrderVariant.ts @@ -0,0 +1,63 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: SearchOrderVariant +// ==================================================== + +export interface SearchOrderVariant_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface SearchOrderVariant_products_edges_node_variants_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface SearchOrderVariant_products_edges_node_variants { + __typename: "ProductVariant"; + id: string; + name: string; + sku: string; + price: SearchOrderVariant_products_edges_node_variants_price | null; +} + +export interface SearchOrderVariant_products_edges_node { + __typename: "Product"; + id: string; + name: string; + thumbnail: SearchOrderVariant_products_edges_node_thumbnail | null; + variants: (SearchOrderVariant_products_edges_node_variants | null)[] | null; +} + +export interface SearchOrderVariant_products_edges { + __typename: "ProductCountableEdge"; + node: SearchOrderVariant_products_edges_node; +} + +export interface SearchOrderVariant_products_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SearchOrderVariant_products { + __typename: "ProductCountableConnection"; + edges: SearchOrderVariant_products_edges[]; + pageInfo: SearchOrderVariant_products_pageInfo; +} + +export interface SearchOrderVariant { + products: SearchOrderVariant_products | null; +} + +export interface SearchOrderVariantVariables { + first: number; + query: string; + after?: string | null; +} diff --git a/src/orders/urls.ts b/src/orders/urls.ts new file mode 100644 index 000000000..5edbbd758 --- /dev/null +++ b/src/orders/urls.ts @@ -0,0 +1,72 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { + ActiveTab, + BulkAction, + Dialog, + Filters, + Pagination, + SingleAction +} from "../types"; + +const orderSectionUrl = "/orders"; + +export const orderListPath = orderSectionUrl; +export enum OrderListUrlFiltersEnum { + dateFrom = "dateFrom", + dateTo = "dateTo", + status = "status", + email = "email", + payment = "payment" +} +export type OrderListUrlFilters = Filters; +export type OrderListUrlDialog = "cancel" | "save-search" | "delete-search"; +export type OrderListUrlQueryParams = BulkAction & + Dialog & + OrderListUrlFilters & + Pagination & + ActiveTab; +export const orderListUrl = (params?: OrderListUrlQueryParams): string => { + const orderList = orderListPath; + if (params === undefined) { + return orderList; + } else { + return urlJoin(orderList, "?" + stringifyQs(params)); + } +}; + +export const orderDraftListPath = urlJoin(orderSectionUrl, "drafts"); +export type OrderDraftListUrlDialog = "remove"; +export type OrderDraftListUrlQueryParams = BulkAction & + Dialog & + Pagination; +export const orderDraftListUrl = ( + params?: OrderDraftListUrlQueryParams +): string => { + const orderDraftList = orderDraftListPath; + if (params === undefined) { + return orderDraftList; + } else { + return urlJoin(orderDraftList, "?" + stringifyQs(params)); + } +}; + +export const orderPath = (id: string) => urlJoin(orderSectionUrl, id); +export type OrderUrlDialog = + | "add-order-line" + | "cancel" + | "cancel-fulfillment" + | "capture" + | "edit-billing-address" + | "edit-fulfillment" + | "edit-shipping" + | "edit-shipping-address" + | "finalize" + | "fulfill" + | "mark-paid" + | "refund" + | "void"; +export type OrderUrlQueryParams = Dialog & SingleAction; +export const orderUrl = (id: string, params?: OrderUrlQueryParams) => + orderPath(encodeURIComponent(id)) + "?" + stringifyQs(params); diff --git a/src/orders/views/OrderDetails/OrderDetailsMessages.tsx b/src/orders/views/OrderDetails/OrderDetailsMessages.tsx new file mode 100644 index 000000000..e4383c107 --- /dev/null +++ b/src/orders/views/OrderDetails/OrderDetailsMessages.tsx @@ -0,0 +1,314 @@ +import * as React from "react"; + +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { OrderAddNote } from "../../types/OrderAddNote"; +import { OrderCancel } from "../../types/OrderCancel"; +import { OrderCapture } from "../../types/OrderCapture"; +import { OrderCreateFulfillment } from "../../types/OrderCreateFulfillment"; +import { OrderDraftCancel } from "../../types/OrderDraftCancel"; +import { OrderDraftFinalize } from "../../types/OrderDraftFinalize"; +import { OrderDraftUpdate } from "../../types/OrderDraftUpdate"; +import { OrderFulfillmentCancel } from "../../types/OrderFulfillmentCancel"; +import { OrderFulfillmentUpdateTracking } from "../../types/OrderFulfillmentUpdateTracking"; +import { OrderLineDelete } from "../../types/OrderLineDelete"; +import { OrderLinesAdd } from "../../types/OrderLinesAdd"; +import { OrderLineUpdate } from "../../types/OrderLineUpdate"; +import { OrderMarkAsPaid } from "../../types/OrderMarkAsPaid"; +import { OrderRefund } from "../../types/OrderRefund"; +import { OrderShippingMethodUpdate } from "../../types/OrderShippingMethodUpdate"; +import { OrderUpdate } from "../../types/OrderUpdate"; +import { OrderVoid } from "../../types/OrderVoid"; +import { orderListUrl, orderUrl } from "../../urls"; + +interface OrderDetailsMessages { + children: (props: { + handleDraftCancel: (data: OrderDraftCancel) => void; + handleDraftFinalize: (data: OrderDraftFinalize) => void; + handleDraftUpdate: (data: OrderDraftUpdate) => void; + handleNoteAdd: (data: OrderAddNote) => void; + handleOrderCancel: (data: OrderCancel) => void; + handleOrderFulfillmentCancel: (data: OrderFulfillmentCancel) => void; + handleOrderFulfillmentCreate: (data: OrderCreateFulfillment) => void; + handleOrderFulfillmentUpdate: ( + data: OrderFulfillmentUpdateTracking + ) => void; + handleOrderLinesAdd: (data: OrderLinesAdd) => void; + handleOrderLineDelete: (data: OrderLineDelete) => void; + handleOrderLineUpdate: (data: OrderLineUpdate) => void; + handleOrderMarkAsPaid: (data: OrderMarkAsPaid) => void; + handleOrderVoid: (data: OrderVoid) => void; + handlePaymentCapture: (data: OrderCapture) => void; + handlePaymentRefund: (data: OrderRefund) => void; + handleShippingMethodUpdate: (data: OrderShippingMethodUpdate) => void; + handleUpdate: (data: OrderUpdate) => void; + }) => React.ReactElement; +} + +export const OrderDetailsMessages: React.StatelessComponent< + OrderDetailsMessages +> = ({ children }) => { + const navigate = useNavigator(); + const pushMessage = useNotifier(); + + const handlePaymentCapture = (data: OrderCapture) => { + if (!maybe(() => data.orderCapture.errors.length)) { + pushMessage({ + text: i18n.t("Payment successfully captured", { + context: "notification" + }) + }); + } else { + pushMessage({ + text: i18n.t("Payment not captured: {{ errorMessage }}", { + context: "notification", + errorMessage: data.orderCapture.errors.filter( + error => error.field === "payment" + )[0].message + }) + }); + } + }; + const handlePaymentRefund = (data: OrderRefund) => { + if (!maybe(() => data.orderRefund.errors.length)) { + pushMessage({ + text: i18n.t("Payment successfully refunded", { + context: "notification" + }) + }); + } else { + pushMessage({ + text: i18n.t("Payment not refunded: {{ errorMessage }}", { + context: "notification", + errorMessage: data.orderRefund.errors.filter( + error => error.field === "payment" + )[0].message + }) + }); + } + }; + const handleOrderFulfillmentCreate = (data: OrderCreateFulfillment) => { + if (!maybe(() => data.orderFulfillmentCreate.errors.length)) { + pushMessage({ + text: i18n.t("Items successfully fulfilled", { + context: "notification" + }) + }); + navigate(orderUrl(data.orderFulfillmentCreate.order.id), true); + } else { + pushMessage({ + text: i18n.t("Could not fulfill items", { + context: "notification" + }) + }); + } + }; + const handleOrderMarkAsPaid = (data: OrderMarkAsPaid) => { + if (!maybe(() => data.orderMarkAsPaid.errors.length)) { + pushMessage({ + text: i18n.t("Order marked as paid", { + context: "notification" + }) + }); + navigate(orderUrl(data.orderMarkAsPaid.order.id), true); + } else { + pushMessage({ + text: i18n.t("Could not mark order as paid", { + context: "notification" + }) + }); + } + }; + const handleOrderCancel = (data: OrderCancel) => { + pushMessage({ + text: i18n.t("Order successfully cancelled", { + context: "notification" + }) + }); + navigate(orderUrl(data.orderCancel.order.id), true); + }; + const handleDraftCancel = () => { + pushMessage({ + text: i18n.t("Order successfully cancelled", { + context: "notification" + }) + }); + navigate(orderListUrl(), true); + }; + const handleOrderVoid = () => { + pushMessage({ + text: i18n.t("Order payment successfully voided", { + context: "notification" + }) + }); + }; + const handleNoteAdd = (data: OrderAddNote) => { + if (!maybe(() => data.orderAddNote.errors.length)) { + pushMessage({ + text: i18n.t("Note successfully added", { + context: "notification" + }) + }); + } else { + pushMessage({ + text: i18n.t("Could not add note", { + context: "notification" + }) + }); + } + }; + const handleUpdate = (data: OrderUpdate) => { + if (!maybe(() => data.orderUpdate.errors.length)) { + pushMessage({ + text: i18n.t("Order successfully updated", { + context: "notification" + }) + }); + navigate(orderUrl(data.orderUpdate.order.id), true); + } + }; + const handleDraftUpdate = (data: OrderDraftUpdate) => { + if (!maybe(() => data.draftOrderUpdate.errors.length)) { + pushMessage({ + text: i18n.t("Order successfully updated", { + context: "notification" + }) + }); + navigate(orderUrl(data.draftOrderUpdate.order.id), true); + } + }; + const handleShippingMethodUpdate = (data: OrderShippingMethodUpdate) => { + if (!maybe(() => data.orderUpdateShipping.errors.length)) { + pushMessage({ + text: i18n.t("Shipping method successfully updated", { + context: "notification" + }) + }); + } else { + pushMessage({ + text: i18n.t("Could not update shipping method", { + context: "notification" + }) + }); + } + navigate(orderUrl(data.orderUpdateShipping.order.id), true); + }; + const handleOrderLineDelete = (data: OrderLineDelete) => { + if (!maybe(() => data.draftOrderLineDelete.errors.length)) { + pushMessage({ + text: i18n.t("Order line deleted", { + context: "notification" + }) + }); + } else { + pushMessage({ + text: i18n.t("Could not delete order line", { + context: "notification" + }) + }); + } + }; + const handleOrderLinesAdd = (data: OrderLinesAdd) => { + if (!maybe(() => data.draftOrderLinesCreate.errors.length)) { + pushMessage({ + text: i18n.t("Order line added", { + context: "notification" + }) + }); + navigate(orderUrl(data.draftOrderLinesCreate.order.id), true); + } else { + pushMessage({ + text: i18n.t("Could not create order line", { + context: "notification" + }) + }); + } + }; + const handleOrderLineUpdate = (data: OrderLineUpdate) => { + if (!maybe(() => data.draftOrderLineUpdate.errors.length)) { + pushMessage({ + text: i18n.t("Order line updated", { + context: "notification" + }) + }); + } else { + pushMessage({ + text: i18n.t("Could not update order line", { + context: "notification" + }) + }); + } + }; + const handleOrderFulfillmentCancel = (data: OrderFulfillmentCancel) => { + if (!maybe(() => data.orderFulfillmentCancel.errors.length)) { + pushMessage({ + text: i18n.t("Fulfillment successfully cancelled", { + context: "notification" + }) + }); + navigate(orderUrl(data.orderFulfillmentCancel.order.id), true); + } else { + pushMessage({ + text: i18n.t("Could not cancel fulfillment", { + context: "notification" + }) + }); + } + }; + const handleOrderFulfillmentUpdate = ( + data: OrderFulfillmentUpdateTracking + ) => { + if (!maybe(() => data.orderFulfillmentUpdateTracking.errors.length)) { + pushMessage({ + text: i18n.t("Fulfillment successfully updated", { + context: "notification" + }) + }); + navigate(orderUrl(data.orderFulfillmentUpdateTracking.order.id), true); + } else { + pushMessage({ + text: i18n.t("Could not update fulfillment", { + context: "notification" + }) + }); + } + }; + const handleDraftFinalize = (data: OrderDraftFinalize) => { + if (!maybe(() => data.draftOrderComplete.errors.length)) { + pushMessage({ + text: i18n.t("Draft order successfully finalized", { + context: "notification" + }) + }); + navigate(orderUrl(data.draftOrderComplete.order.id), true); + } else { + pushMessage({ + text: i18n.t("Could not finalize draft", { + context: "notification" + }) + }); + } + }; + + return children({ + handleDraftCancel, + handleDraftFinalize, + handleDraftUpdate, + handleNoteAdd, + handleOrderCancel, + handleOrderFulfillmentCancel, + handleOrderFulfillmentCreate, + handleOrderFulfillmentUpdate, + handleOrderLineDelete, + handleOrderLineUpdate, + handleOrderLinesAdd, + handleOrderMarkAsPaid, + handleOrderVoid, + handlePaymentCapture, + handlePaymentRefund, + handleShippingMethodUpdate, + handleUpdate + }); +}; diff --git a/src/orders/views/OrderDetails/index.tsx b/src/orders/views/OrderDetails/index.tsx new file mode 100644 index 000000000..1afec5dcd --- /dev/null +++ b/src/orders/views/OrderDetails/index.tsx @@ -0,0 +1,673 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import { DEFAULT_INITIAL_SEARCH_DATA } from "../../../config"; +import SearchCustomers from "../../../containers/SearchCustomers"; +import { customerUrl } from "../../../customers/urls"; +import { getMutationState, maybe, transformAddressToForm } from "../../../misc"; +import { productUrl } from "../../../products/urls"; +import { OrderStatus } from "../../../types/globalTypes"; +import OrderAddressEditDialog from "../../components/OrderAddressEditDialog"; +import OrderCancelDialog from "../../components/OrderCancelDialog"; +import OrderDetailsPage from "../../components/OrderDetailsPage"; +import OrderDraftCancelDialog from "../../components/OrderDraftCancelDialog/OrderDraftCancelDialog"; +import OrderDraftFinalizeDialog, { + OrderDraftFinalizeWarning +} from "../../components/OrderDraftFinalizeDialog"; +import OrderDraftPage from "../../components/OrderDraftPage"; +import OrderFulfillmentCancelDialog from "../../components/OrderFulfillmentCancelDialog"; +import OrderFulfillmentDialog from "../../components/OrderFulfillmentDialog"; +import OrderFulfillmentTrackingDialog from "../../components/OrderFulfillmentTrackingDialog"; +import OrderMarkAsPaidDialog from "../../components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog"; +import OrderPaymentDialog from "../../components/OrderPaymentDialog"; +import OrderPaymentVoidDialog from "../../components/OrderPaymentVoidDialog"; +import OrderProductAddDialog from "../../components/OrderProductAddDialog"; +import OrderShippingMethodEditDialog from "../../components/OrderShippingMethodEditDialog"; +import OrderOperations from "../../containers/OrderOperations"; +import { SearchOrderVariant, TypedOrderDetailsQuery } from "../../queries"; +import { OrderDetails_order } from "../../types/OrderDetails"; +import { + orderListUrl, + orderUrl, + OrderUrlDialog, + OrderUrlQueryParams +} from "../../urls"; +import { OrderDetailsMessages } from "./OrderDetailsMessages"; + +const orderDraftFinalizeWarnings = (order: OrderDetails_order) => { + const warnings = [] as OrderDraftFinalizeWarning[]; + if (!(order && order.shippingAddress)) { + warnings.push("no-shipping"); + } + if (!(order && order.billingAddress)) { + warnings.push("no-billing"); + } + if (!(order && (order.user || order.userEmail))) { + warnings.push("no-user"); + } + if ( + order && + order.lines && + order.lines.filter(line => line.isShippingRequired).length > 0 && + order.shippingMethod === null + ) { + warnings.push("no-shipping-method"); + } + if ( + order && + order.lines && + order.lines.filter(line => line.isShippingRequired).length === 0 && + order.shippingMethod !== null + ) { + warnings.push("unnecessary-shipping-method"); + } + return warnings; +}; + +interface OrderDetailsProps { + id: string; + params: OrderUrlQueryParams; +} + +export const OrderDetails: React.StatelessComponent = ({ + id, + params +}) => { + const navigate = useNavigator(); + + return ( + + {({ data, loading }) => { + const order = maybe(() => data.order); + const closeModal = () => navigate(orderUrl(id), true); + const openModal = (action: OrderUrlDialog) => + navigate( + orderUrl(id, { + action + }) + ); + return ( + + {({ search: searchUsers, result: users }) => ( + + {orderMessages => ( + + {({ + orderAddNote, + orderCancel, + orderCreateFulfillment, + orderDraftUpdate, + orderLinesAdd, + orderLineDelete, + orderLineUpdate, + orderPaymentCapture, + orderPaymentRefund, + orderVoid, + orderShippingMethodUpdate, + orderUpdate, + orderFulfillmentCancel, + orderFulfillmentUpdateTracking, + orderDraftCancel, + orderDraftFinalize, + orderPaymentMarkAsPaid + }) => { + const finalizeTransitionState = getMutationState( + orderDraftFinalize.opts.called, + orderDraftFinalize.opts.loading, + maybe( + () => + orderDraftFinalize.opts.data.draftOrderComplete + .errors + ) + ); + return ( + <> + {maybe(() => order.status !== OrderStatus.DRAFT) ? ( + <> + "Order #" + data.order.number + )} + /> + + orderAddNote.mutate({ + input: variables, + order: id + }) + } + onBack={() => navigate(orderListUrl())} + order={order} + shippingMethods={maybe( + () => data.order.availableShippingMethods, + [] + )} + onOrderCancel={() => openModal("cancel")} + onOrderFulfill={() => openModal("fulfill")} + onFulfillmentCancel={fulfillmentId => + navigate( + orderUrl(id, { + action: "cancel-fulfillment", + id: fulfillmentId + }) + ) + } + onFulfillmentTrackingNumberUpdate={fulfillmentId => + navigate( + orderUrl(id, { + action: "edit-fulfillment", + id: fulfillmentId + }) + ) + } + onPaymentCapture={() => openModal("capture")} + onPaymentVoid={() => openModal("void")} + onPaymentRefund={() => openModal("refund")} + onProductClick={id => () => + navigate(productUrl(id))} + onBillingAddressEdit={() => + openModal("edit-billing-address") + } + onShippingAddressEdit={() => + openModal("edit-shipping-address") + } + onPaymentPaid={() => openModal("mark-paid")} + onProfileView={() => + navigate(customerUrl(order.user.id)) + } + /> + + orderCancel.opts.data.orderCancel.errors + ) + )} + number={maybe(() => order.number)} + open={params.action === "cancel"} + onClose={closeModal} + onSubmit={variables => + orderCancel.mutate({ + id, + ...variables + }) + } + /> + + orderPaymentMarkAsPaid.opts.data + .orderMarkAsPaid.errors + ) + )} + onClose={closeModal} + onConfirm={() => + orderPaymentMarkAsPaid.mutate({ + id + }) + } + open={params.action === "mark-paid"} + /> + orderVoid.opts.data.orderVoid.errors + ) + )} + open={params.action === "void"} + onClose={closeModal} + onConfirm={() => orderVoid.mutate({ id })} + /> + + orderPaymentCapture.opts.data.orderCapture + .errors + ) + )} + initial={maybe(() => order.total.gross.amount)} + open={params.action === "capture"} + variant="capture" + onClose={closeModal} + onSubmit={variables => + orderPaymentCapture.mutate({ + ...variables, + id + }) + } + /> + + orderPaymentRefund.opts.data.orderRefund + .errors + ) + )} + initial={maybe(() => order.total.gross.amount)} + open={params.action === "refund"} + variant="refund" + onClose={closeModal} + onSubmit={variables => + orderPaymentRefund.mutate({ + ...variables, + id + }) + } + /> + + orderCreateFulfillment.opts.data + .orderFulfillmentCreate.errors + ) + )} + open={params.action === "fulfill"} + lines={maybe(() => order.lines, []).filter( + line => line.quantityFulfilled < line.quantity + )} + onClose={closeModal} + onSubmit={variables => + orderCreateFulfillment.mutate({ + input: { + ...variables, + lines: maybe(() => order.lines, []) + .filter( + line => + line.quantityFulfilled < + line.quantity + ) + .map((line, lineIndex) => ({ + orderLineId: line.id, + quantity: variables.lines[lineIndex] + })) + .filter(line => line.quantity > 0) + }, + order: order.id + }) + } + /> + + orderFulfillmentCancel.opts.data + .orderFulfillmentCancel.errors + ) + )} + open={params.action === "cancel-fulfillment"} + onConfirm={variables => + orderFulfillmentCancel.mutate({ + id: params.id, + input: variables + }) + } + onClose={closeModal} + /> + + orderFulfillmentUpdateTracking.opts.data + .orderFulfillmentUpdateTracking.errors + ) + )} + open={params.action === "edit-fulfillment"} + trackingNumber={maybe( + () => + data.order.fulfillments.find( + fulfillment => + fulfillment.id === params.id + ).trackingNumber + )} + onConfirm={variables => + orderFulfillmentUpdateTracking.mutate({ + id: params.id, + input: { + ...variables, + notifyCustomer: true + } + }) + } + onClose={closeModal} + /> + + ) : ( + <> + "Draft order #" + data.order.number + )} + /> + + orderAddNote.mutate({ + input: variables, + order: id + }) + } + users={maybe( + () => + users.data.customers.edges.map( + edge => edge.node + ), + [] + )} + fetchUsers={searchUsers} + usersLoading={users.loading} + onCustomerEdit={data => + orderDraftUpdate.mutate({ + id, + input: data + }) + } + onDraftFinalize={() => openModal("finalize")} + onDraftRemove={() => openModal("cancel")} + onOrderLineAdd={() => + openModal("add-order-line") + } + onBack={() => navigate(orderListUrl())} + order={order} + countries={maybe( + () => data.shop.countries, + [] + ).map(country => ({ + code: country.code, + label: country.country + }))} + onProductClick={id => () => + navigate(productUrl(encodeURIComponent(id)))} + onBillingAddressEdit={() => + openModal("edit-billing-address") + } + onShippingAddressEdit={() => + openModal("edit-shipping-address") + } + onShippingMethodEdit={() => + openModal("edit-shipping") + } + onOrderLineRemove={id => + orderLineDelete.mutate({ id }) + } + onOrderLineChange={(id, data) => + orderLineUpdate.mutate({ + id, + input: data + }) + } + saveButtonBarState="default" + onProfileView={() => + navigate(customerUrl(order.user.id)) + } + /> + + orderDraftCancel.opts.data + .draftOrderDelete.errors + ) + )} + onClose={closeModal} + onConfirm={() => + orderDraftCancel.mutate({ id }) + } + open={params.action === "cancel"} + orderNumber={maybe(() => order.number)} + /> + + orderDraftFinalize.mutate({ id }) + } + open={params.action === "finalize"} + orderNumber={maybe(() => order.number)} + warnings={orderDraftFinalizeWarnings(order)} + /> + + orderShippingMethodUpdate.opts.data + .orderUpdateShipping.errors + ) + )} + open={params.action === "edit-shipping"} + shippingMethod={maybe( + () => order.shippingMethod.id, + "..." + )} + shippingMethods={maybe( + () => order.availableShippingMethods + )} + onClose={closeModal} + onSubmit={variables => + orderShippingMethodUpdate.mutate({ + id, + input: { + shippingMethod: variables.shippingMethod + } + }) + } + /> + + {({ + search: variantSearch, + result: variantSearchOpts + }) => { + const fetchMore = () => + variantSearchOpts.loadMore( + (prev, next) => { + if ( + prev.products.pageInfo.endCursor === + next.products.pageInfo.endCursor + ) { + return prev; + } + return { + ...prev, + products: { + ...prev.products, + edges: [ + ...prev.products.edges, + ...next.products.edges + ], + pageInfo: next.products.pageInfo + } + }; + }, + { + after: + variantSearchOpts.data.products + .pageInfo.endCursor + } + ); + return ( + + orderLinesAdd.opts.data + .draftOrderLinesCreate.errors + ) + )} + loading={variantSearchOpts.loading} + open={params.action === "add-order-line"} + hasMore={maybe( + () => + variantSearchOpts.data.products + .pageInfo.hasNextPage + )} + products={maybe(() => + variantSearchOpts.data.products.edges.map( + edge => edge.node + ) + )} + onClose={closeModal} + onFetch={variantSearch} + onFetchMore={fetchMore} + onSubmit={formData => + orderLinesAdd.mutate({ + id, + input: formData.variants.map( + variant => ({ + quantity: 1, + variantId: variant.id + }) + ) + }) + } + /> + ); + }} + + + )} + orderUpdate.opts.data.orderUpdate.errors + ) + )} + address={transformAddressToForm( + maybe(() => order.shippingAddress) + )} + countries={maybe(() => data.shop.countries, []).map( + country => ({ + code: country.code, + label: country.country + }) + )} + errors={maybe( + () => orderUpdate.opts.data.orderUpdate.errors, + [] + )} + open={params.action === "edit-shipping-address"} + variant="shipping" + onClose={closeModal} + onConfirm={variables => + orderUpdate.mutate({ + id, + input: { + shippingAddress: { + ...variables, + country: variables.country.value + } + } + }) + } + /> + orderUpdate.opts.data.orderUpdate.errors + ) + )} + address={transformAddressToForm( + maybe(() => order.billingAddress) + )} + countries={maybe(() => data.shop.countries, []).map( + country => ({ + code: country.code, + label: country.country + }) + )} + errors={maybe( + () => orderUpdate.opts.data.orderUpdate.errors, + [] + )} + open={params.action === "edit-billing-address"} + variant="billing" + onClose={closeModal} + onConfirm={variables => + orderUpdate.mutate({ + id, + input: { + billingAddress: { + ...variables, + country: variables.country.value + } + } + }) + } + /> + + ); + }} + + )} + + )} + + ); + }} + + ); +}; + +export default OrderDetails; diff --git a/src/orders/views/OrderDraftList.tsx b/src/orders/views/OrderDraftList.tsx new file mode 100644 index 000000000..e73c966b8 --- /dev/null +++ b/src/orders/views/OrderDraftList.tsx @@ -0,0 +1,171 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { PAGINATE_BY } from "../../config"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import OrderDraftListPage from "../components/OrderDraftListPage"; +import { + TypedOrderDraftBulkCancelMutation, + TypedOrderDraftCreateMutation +} from "../mutations"; +import { TypedOrderDraftListQuery } from "../queries"; +import { OrderDraftBulkCancel } from "../types/OrderDraftBulkCancel"; +import { OrderDraftCreate } from "../types/OrderDraftCreate"; +import { + orderDraftListUrl, + OrderDraftListUrlQueryParams, + orderUrl +} from "../urls"; + +interface OrderDraftListProps { + params: OrderDraftListUrlQueryParams; +} + +export const OrderDraftList: React.StatelessComponent = ({ + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const closeModal = () => + navigate( + orderDraftListUrl({ + ...params, + action: undefined, + ids: undefined + }) + ); + + const handleCreateOrderCreateSuccess = (data: OrderDraftCreate) => { + notify({ + text: i18n.t("Order draft succesfully created") + }); + navigate(orderUrl(data.draftOrderCreate.order.id)); + }; + + const paginationState = createPaginationState(PAGINATE_BY, params); + + return ( + + {createOrder => ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.draftOrders.pageInfo), + paginationState, + params + ); + + const handleOrderDraftBulkCancel = (data: OrderDraftBulkCancel) => { + if (data.draftOrderBulkDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed draft orders") + }); + refetch(); + reset(); + closeModal(); + } + }; + + return ( + + {(orderDraftBulkDelete, orderDraftBulkDeleteOpts) => { + const bulkRemoveTransitionState = getMutationState( + orderDraftBulkDeleteOpts.called, + orderDraftBulkDeleteOpts.loading, + maybe( + () => + orderDraftBulkDeleteOpts.data.draftOrderBulkDelete + .errors + ) + ); + const onOrderDraftBulkDelete = () => + orderDraftBulkDelete({ + variables: { + ids: params.ids + } + }); + + return ( + <> + + data.draftOrders.edges.map(edge => edge.node) + )} + pageInfo={pageInfo} + onAdd={createOrder} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRowClick={id => () => navigate(orderUrl(id))} + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + toolbar={ + + navigate( + orderDraftListUrl({ + action: "remove", + ids: listElements + }) + ) + } + > + + + } + /> + + {{ number }} order drafts?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + ); + }} + + )} + + ); +}; + +export default OrderDraftList; diff --git a/src/orders/views/OrderList/OrderList.tsx b/src/orders/views/OrderList/OrderList.tsx new file mode 100644 index 000000000..f0b19205e --- /dev/null +++ b/src/orders/views/OrderList/OrderList.tsx @@ -0,0 +1,270 @@ +import Button from "@material-ui/core/Button"; +import * as React from "react"; + +import DeleteFilterTabDialog from "@saleor/components/DeleteFilterTabDialog"; +import SaveFilterTabDialog, { + SaveFilterTabDialogFormData +} from "@saleor/components/SaveFilterTabDialog"; +import { PAGINATE_BY } from "@saleor/config"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useDateLocalize from "@saleor/hooks/useDateLocalize"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import useShop from "@saleor/hooks/useShop"; +import i18n from "@saleor/i18n"; +import { getMutationState, maybe } from "@saleor/misc"; +import OrderBulkCancelDialog from "../../components/OrderBulkCancelDialog"; +import OrderListPage from "../../components/OrderListPage/OrderListPage"; +import { + TypedOrderBulkCancelMutation, + TypedOrderDraftCreateMutation +} from "../../mutations"; +import { TypedOrderListQuery } from "../../queries"; +import { OrderBulkCancel } from "../../types/OrderBulkCancel"; +import { OrderDraftCreate } from "../../types/OrderDraftCreate"; +import { + orderListUrl, + OrderListUrlDialog, + OrderListUrlFilters, + OrderListUrlQueryParams, + orderUrl +} from "../../urls"; +import { + areFiltersApplied, + createFilter, + createFilterChips, + deleteFilterTab, + getActiveFilters, + getFilterTabs, + getFilterVariables, + saveFilterTab +} from "./filters"; + +interface OrderListProps { + params: OrderListUrlQueryParams; +} + +export const OrderList: React.StatelessComponent = ({ + params +}) => { + const formatDate = useDateLocalize(); + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const shop = useShop(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const tabs = getFilterTabs(); + + const currentTab = + params.activeTab === undefined + ? areFiltersApplied(params) + ? tabs.length + 1 + : 0 + : parseInt(params.activeTab, 0); + + const closeModal = () => + navigate( + orderListUrl({ + ...params, + action: undefined, + ids: undefined + }), + true + ); + + const changeFilters = (filters: OrderListUrlFilters) => { + reset(); + navigate(orderListUrl(filters)); + }; + + const changeFilterField = (filter: OrderListUrlFilters) => { + reset(); + navigate( + orderListUrl({ + ...getActiveFilters(params), + ...filter, + activeTab: undefined + }) + ); + }; + + const openModal = (action: OrderListUrlDialog, ids?: string[]) => + navigate( + orderListUrl({ + ...params, + action, + ids + }) + ); + + const handleTabChange = (tab: number) => { + reset(); + navigate( + orderListUrl({ + activeTab: tab.toString(), + ...getFilterTabs()[tab - 1].data + }) + ); + }; + + const handleFilterTabDelete = () => { + deleteFilterTab(currentTab); + reset(); + navigate(orderListUrl()); + }; + + const handleFilterTabSave = (data: SaveFilterTabDialogFormData) => { + saveFilterTab(data.name, getActiveFilters(params)); + handleTabChange(tabs.length + 1); + }; + + const paginationState = createPaginationState(PAGINATE_BY, params); + const currencySymbol = maybe(() => shop.defaultCurrency, "USD"); + + const handleCreateOrderCreateSuccess = (data: OrderDraftCreate) => { + notify({ + text: i18n.t("Order draft succesfully created") + }); + navigate(orderUrl(data.draftOrderCreate.order.id)); + }; + + const queryVariables = React.useMemo( + () => ({ + ...paginationState, + filter: getFilterVariables(params) + }), + [params] + ); + + return ( + + {createOrder => ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.orders.pageInfo), + paginationState, + params + ); + + const handleOrderBulkCancel = (data: OrderBulkCancel) => { + if (data.orderBulkCancel.errors.length === 0) { + notify({ + text: i18n.t("Orders cancelled", { + context: "notification" + }) + }); + reset(); + refetch(); + closeModal(); + } + }; + + return ( + + {(orderBulkCancel, orderBulkCancelOpts) => { + const orderBulkCancelTransitionState = getMutationState( + orderBulkCancelOpts.called, + orderBulkCancelOpts.loading, + maybe(() => orderBulkCancelOpts.data.orderBulkCancel.errors) + ); + const onOrderBulkCancel = (restock: boolean) => + orderBulkCancel({ + variables: { + ids: params.ids, + restock + } + }); + + return ( + <> + + data.orders.edges.map(edge => edge.node) + )} + pageInfo={pageInfo} + onAdd={createOrder} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRowClick={id => () => navigate(orderUrl(id))} + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + toolbar={ + + } + onSearchChange={email => changeFilterField({ email })} + onFilterAdd={filter => + changeFilterField(createFilter(filter)) + } + onFilterSave={() => openModal("save-search")} + onFilterDelete={() => openModal("delete-search")} + onTabChange={handleTabChange} + initialSearch={params.email || ""} + filterTabs={getFilterTabs()} + onAll={() => + changeFilters({ + status: undefined + }) + } + /> + params.ids.length.toString(), + "..." + )} + onClose={closeModal} + onConfirm={onOrderBulkCancel} + open={params.action === "cancel"} + /> + + tabs[currentTab - 1].name, "...")} + /> + + ); + }} + + ); + }} + + )} + + ); +}; + +export default OrderList; diff --git a/src/orders/views/OrderList/filters.ts b/src/orders/views/OrderList/filters.ts new file mode 100644 index 000000000..39bc73341 --- /dev/null +++ b/src/orders/views/OrderList/filters.ts @@ -0,0 +1,174 @@ +import { FilterContentSubmitData } from "../../../components/Filter"; +import { Filter } from "../../../components/TableFilter"; +import i18n from "../../../i18n"; +import { + OrderFilterInput, + OrderStatusFilter +} from "../../../types/globalTypes"; +import { + createFilterTabUtils, + createFilterUtils +} from "../../../utils/filters"; +import { OrderFilterKeys } from "../../components/OrderListFilter"; +import { + OrderListUrlFilters, + OrderListUrlFiltersEnum, + OrderListUrlQueryParams +} from "../../urls"; + +export const ORDER_FILTERS_KEY = "orderFilters"; + +function getStatusLabel(status: string): string { + switch (status) { + case OrderStatusFilter.FULFILLED.toString(): + return i18n.t("Fulfilled"); + + case OrderStatusFilter.PARTIALLY_FULFILLED.toString(): + return i18n.t("Partially Fulfilled"); + + case OrderStatusFilter.UNFULFILLED.toString(): + return i18n.t("Unfulfilled"); + } + + return ""; +} + +export function getFilterVariables( + params: OrderListUrlFilters +): OrderFilterInput { + return { + created: { + gte: params.dateFrom, + lte: params.dateTo + }, + customer: params.email, + status: OrderStatusFilter[params.status] + }; +} + +export function createFilter( + filter: FilterContentSubmitData +): OrderListUrlFilters { + const filterName = filter.name; + if (filterName === OrderFilterKeys.dateEqual.toString()) { + const value = filter.value as string; + return { + dateFrom: value, + dateTo: value + }; + } else if (filterName === OrderFilterKeys.dateRange.toString()) { + const { value } = filter; + return { + dateFrom: value[0], + dateTo: value[1] + }; + } else if ( + [ + OrderFilterKeys.dateLastWeek, + OrderFilterKeys.dateLastMonth, + OrderFilterKeys.dateLastYear + ] + .map(value => value.toString()) + .includes(filterName) + ) { + const { value } = filter; + return { + dateFrom: value as string, + dateTo: undefined + }; + } else if (filterName === OrderFilterKeys.fulfillment.toString()) { + const { value } = filter; + return { + status: value as string + }; + } +} + +interface OrderListChipFormatData { + formatDate: (date: string) => string; +} +export function createFilterChips( + filters: OrderListUrlFilters, + formatData: OrderListChipFormatData, + onFilterDelete: (filters: OrderListUrlFilters) => void +): Filter[] { + let filterChips: Filter[] = []; + + if (!!filters.dateFrom || !!filters.dateTo) { + if (filters.dateFrom === filters.dateTo) { + filterChips = [ + ...filterChips, + { + label: i18n.t("Date is {{ date }}", { + date: formatData.formatDate(filters.dateFrom) + }), + onClick: () => + onFilterDelete({ + ...filters, + dateFrom: undefined, + dateTo: undefined + }) + } + ]; + } else { + if (!!filters.dateFrom) { + filterChips = [ + ...filterChips, + { + label: i18n.t("Date from {{ date }}", { + date: formatData.formatDate(filters.dateFrom) + }), + onClick: () => + onFilterDelete({ + ...filters, + dateFrom: undefined + }) + } + ]; + } + + if (!!filters.dateTo) { + filterChips = [ + ...filterChips, + { + label: i18n.t("Date to {{ date }}", { + date: formatData.formatDate(filters.dateTo) + }), + onClick: () => + onFilterDelete({ + ...filters, + dateTo: undefined + }) + } + ]; + } + } + } + + if (!!filters.status) { + filterChips = [ + ...filterChips, + { + label: getStatusLabel(filters.status), + onClick: () => + onFilterDelete({ + ...filters, + status: undefined + }) + } + ]; + } + + return filterChips; +} + +export const { + deleteFilterTab, + getFilterTabs, + saveFilterTab +} = createFilterTabUtils(ORDER_FILTERS_KEY); + +export const { areFiltersApplied, getActiveFilters } = createFilterUtils< + OrderListUrlQueryParams, + OrderListUrlFilters +>(OrderListUrlFiltersEnum); diff --git a/src/orders/views/OrderList/index.ts b/src/orders/views/OrderList/index.ts new file mode 100644 index 000000000..6f012db87 --- /dev/null +++ b/src/orders/views/OrderList/index.ts @@ -0,0 +1,2 @@ +export * from "./OrderList"; +export { default } from "./OrderList"; diff --git a/src/pages/components/PageDetailsPage/PageDetailsPage.tsx b/src/pages/components/PageDetailsPage/PageDetailsPage.tsx new file mode 100644 index 000000000..18cbd54b9 --- /dev/null +++ b/src/pages/components/PageDetailsPage/PageDetailsPage.tsx @@ -0,0 +1,136 @@ +import { + ContentState, + convertFromRaw, + convertToRaw, + RawDraftContentState +} from "draft-js"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import SeoForm from "@saleor/components/SeoForm"; +import VisibilityCard from "@saleor/components/VisibilityCard"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { UserError } from "../../../types"; +import { PageDetails_page } from "../../types/PageDetails"; +import PageInfo from "../PageInfo"; +import PageSlug from "../PageSlug"; + +export interface FormData { + content: RawDraftContentState; + isPublished: boolean; + publicationDate: string; + seoDescription: string; + seoTitle: string; + slug: string; + title: string; +} + +export interface PageDetailsPageProps { + disabled: boolean; + errors: UserError[]; + page: PageDetails_page; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onRemove: () => void; + onSubmit: (data: FormData) => void; +} + +const PageDetailsPage: React.StatelessComponent = ({ + disabled, + errors, + page, + saveButtonBarState, + onBack, + onRemove, + onSubmit +}) => { + const initialForm: FormData = { + content: maybe( + () => JSON.parse(page.contentJson), + convertToRaw(ContentState.createFromText("")) + ), + isPublished: maybe(() => page.isPublished, false), + publicationDate: maybe(() => page.publicationDate, ""), + seoDescription: maybe(() => page.seoDescription || "", ""), + seoTitle: maybe(() => page.seoTitle || "", ""), + slug: maybe(() => page.slug, ""), + title: maybe(() => page.title, "") + }; + return ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Pages")} + page.title) + } + /> + +
    + + + { + return convertFromRaw(data.content) + .getPlainText() + .slice(0, 300); + }, "")} + onChange={change} + title={data.seoTitle} + titlePlaceholder={data.title} + helperText={i18n.t( + "Add search engine title and description to make this page easier to find" + )} + /> +
    +
    + + + +
    +
    + +
    + )} +
    + ); +}; +PageDetailsPage.displayName = "PageDetailsPage"; +export default PageDetailsPage; diff --git a/src/pages/components/PageDetailsPage/index.ts b/src/pages/components/PageDetailsPage/index.ts new file mode 100644 index 000000000..c299df7ee --- /dev/null +++ b/src/pages/components/PageDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from './PageDetailsPage'; +export * from './PageDetailsPage'; \ No newline at end of file diff --git a/src/pages/components/PageInfo/PageInfo.tsx b/src/pages/components/PageInfo/PageInfo.tsx new file mode 100644 index 000000000..3d7d5de9e --- /dev/null +++ b/src/pages/components/PageInfo/PageInfo.tsx @@ -0,0 +1,69 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import FormSpacer from "@saleor/components/FormSpacer"; +import RichTextEditor from "@saleor/components/RichTextEditor"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { FormErrors } from "../../../types"; +import { PageDetails_page } from "../../types/PageDetails"; +import { FormData } from "../PageDetailsPage"; + +export interface PageInfoProps { + data: FormData; + disabled: boolean; + errors: FormErrors<"contentJson" | "title">; + page: PageDetails_page; + onChange: (event: React.ChangeEvent) => void; +} + +const styles = createStyles({ + root: { + overflow: "visible" + } +}); + +const PageInfo = withStyles(styles, { + name: "PageInfo" +})( + ({ + classes, + data, + disabled, + errors, + page, + onChange + }: PageInfoProps & WithStyles) => ( + + + + + + JSON.parse(page.contentJson))} + label={i18n.t("Content")} + name={"content" as keyof FormData} + onChange={onChange} + /> + + + ) +); +PageInfo.displayName = "PageInfo"; +export default PageInfo; diff --git a/src/pages/components/PageInfo/index.ts b/src/pages/components/PageInfo/index.ts new file mode 100644 index 000000000..8bcf98a76 --- /dev/null +++ b/src/pages/components/PageInfo/index.ts @@ -0,0 +1,2 @@ +export { default } from './PageInfo'; +export * from './PageInfo'; \ No newline at end of file diff --git a/src/pages/components/PageList/PageList.tsx b/src/pages/components/PageList/PageList.tsx new file mode 100644 index 000000000..ad77e8d68 --- /dev/null +++ b/src/pages/components/PageList/PageList.tsx @@ -0,0 +1,151 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { PageList_pages_edges_node } from "../../types/PageList"; + +export interface PageListProps extends ListProps, ListActions { + pages: PageList_pages_edges_node[]; +} + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colSlug: { + width: 250 + }, + colTitle: {}, + colVisibility: { + width: 200 + } + }, + colSlug: {}, + colTitle: {}, + colVisibility: {}, + link: { + cursor: "pointer" + } + }); +const PageList = withStyles(styles, { name: "PageList" })( + ({ + classes, + pages, + disabled, + onNextPage, + pageInfo, + onRowClick, + onPreviousPage, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: PageListProps & WithStyles) => ( + + + + + {i18n.t("Title", { context: "table header" })} + + + {i18n.t("Slug", { context: "table header" })} + + + {i18n.t("Visibility", { context: "table header" })} + + + + + + + + + {renderCollection( + pages, + page => { + const isSelected = page ? isChecked(page.id) : false; + + return ( + + + toggle(page.id)} + /> + + + {maybe(() => page.title, )} + + + {maybe(() => page.slug, )} + + + {maybe( + () => ( + + ), + + )} + + + ); + }, + () => ( + + {i18n.t("No pages found")} + + ) + )} + +
    +
    + ) +); +PageList.displayName = "PageList"; +export default PageList; diff --git a/src/pages/components/PageList/index.ts b/src/pages/components/PageList/index.ts new file mode 100644 index 000000000..0b888e9db --- /dev/null +++ b/src/pages/components/PageList/index.ts @@ -0,0 +1,2 @@ +export { default } from './PageList'; +export * from './PageList'; \ No newline at end of file diff --git a/src/pages/components/PageListPage/PageListPage.tsx b/src/pages/components/PageListPage/PageListPage.tsx new file mode 100644 index 000000000..1e6a72bc9 --- /dev/null +++ b/src/pages/components/PageListPage/PageListPage.tsx @@ -0,0 +1,62 @@ +import Button from "@material-ui/core/Button"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { PageList_pages_edges_node } from "../../types/PageList"; +import PageList from "../PageList/PageList"; + +export interface PageListPageProps extends PageListProps, ListActions { + pages: PageList_pages_edges_node[]; + onBack: () => void; +} + +const PageListPage: React.StatelessComponent = ({ + disabled, + onAdd, + onBack, + onNextPage, + onPreviousPage, + onRowClick, + pageInfo, + pages, + isChecked, + selected, + toggle, + toggleAll, + toolbar +}) => ( + + {i18n.t("Configuration")} + + + + + +); +PageListPage.displayName = "PageListPage"; +export default PageListPage; diff --git a/src/pages/components/PageListPage/index.ts b/src/pages/components/PageListPage/index.ts new file mode 100644 index 000000000..c5d589974 --- /dev/null +++ b/src/pages/components/PageListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from './PageListPage'; +export * from './PageListPage'; \ No newline at end of file diff --git a/src/pages/components/PageSlug/PageSlug.tsx b/src/pages/components/PageSlug/PageSlug.tsx new file mode 100644 index 000000000..b251e4af2 --- /dev/null +++ b/src/pages/components/PageSlug/PageSlug.tsx @@ -0,0 +1,45 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; +import slugify from "slugify"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; +import { FormData } from "../PageDetailsPage"; + +export interface PageSlugProps { + data: FormData; + disabled: boolean; + errors: Partial>; + onChange: (event: React.ChangeEvent) => void; +} + +const PageSlug: React.StatelessComponent = ({ + data, + disabled, + errors, + onChange +}) => ( + + + + + + +); +PageSlug.displayName = "PageSlug"; +export default PageSlug; diff --git a/src/pages/components/PageSlug/index.ts b/src/pages/components/PageSlug/index.ts new file mode 100644 index 000000000..06056b307 --- /dev/null +++ b/src/pages/components/PageSlug/index.ts @@ -0,0 +1,2 @@ +export { default } from './PageSlug'; +export * from './PageSlug'; \ No newline at end of file diff --git a/src/pages/fixtures.ts b/src/pages/fixtures.ts new file mode 100644 index 000000000..86739b16c --- /dev/null +++ b/src/pages/fixtures.ts @@ -0,0 +1,45 @@ +import { content } from "../storybook/stories/components/RichTextEditor"; +import { PageDetails_page } from "./types/PageDetails"; +import { PageList_pages_edges_node } from "./types/PageList"; + +export const pageList: PageList_pages_edges_node[] = [ + { + __typename: "Page", + id: "Jzx123sEt==", + isPublished: true, + slug: "about", + title: "About" + }, + { + __typename: "Page", + id: "Jzx123sEx==", + isPublished: false, + slug: "about", + title: "About" + }, + { + __typename: "Page", + id: "Jzx123sEu==", + isPublished: true, + slug: "about", + title: "About" + }, + { + __typename: "Page", + id: "Jzx123sEm==", + isPublished: true, + slug: "about", + title: "About" + } +]; +export const page: PageDetails_page = { + __typename: "Page", + contentJson: JSON.stringify(content), + id: "Kzx152sEm==", + isPublished: false, + publicationDate: "", + seoDescription: "About", + seoTitle: "About", + slug: "about", + title: "About" +}; diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 000000000..d156d0941 --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,51 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { + pageCreatePath, + pageListPath, + PageListUrlQueryParams, + pagePath, + PageUrlQueryParams +} from "./urls"; +import PageCreate from "./views/PageCreate"; +import PageDetailsComponent from "./views/PageDetails"; +import PageListComponent from "./views/PageList"; + +const PageList: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: PageListUrlQueryParams = qs; + return ; +}; + +const PageDetails: React.StatelessComponent> = ({ + match +}) => { + const qs = parseQs(location.search.substr(1)); + const params: PageUrlQueryParams = qs; + + return ( + + ); +}; + +const Component = () => ( + <> + + + + + + + +); + +export default Component; diff --git a/src/pages/mutations.ts b/src/pages/mutations.ts new file mode 100644 index 000000000..48432ef42 --- /dev/null +++ b/src/pages/mutations.ts @@ -0,0 +1,95 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { pageDetailsFragment } from "./queries"; +import { + PageBulkPublish, + PageBulkPublishVariables +} from "./types/PageBulkPublish"; +import { + PageBulkRemove, + PageBulkRemoveVariables +} from "./types/PageBulkRemove"; +import { PageCreate, PageCreateVariables } from "./types/PageCreate"; +import { PageRemove, PageRemoveVariables } from "./types/PageRemove"; +import { PageUpdate, PageUpdateVariables } from "./types/PageUpdate"; + +const pageCreate = gql` + ${pageDetailsFragment} + mutation PageCreate($input: PageInput!) { + pageCreate(input: $input) { + errors { + field + message + } + page { + ...PageDetailsFragment + } + } + } +`; +export const TypedPageCreate = TypedMutation( + pageCreate +); + +const pageUpdate = gql` + ${pageDetailsFragment} + mutation PageUpdate($id: ID!, $input: PageInput!) { + pageUpdate(id: $id, input: $input) { + errors { + field + message + } + page { + ...PageDetailsFragment + } + } + } +`; +export const TypedPageUpdate = TypedMutation( + pageUpdate +); + +const pageRemove = gql` + mutation PageRemove($id: ID!) { + pageDelete(id: $id) { + errors { + field + message + } + } + } +`; +export const TypedPageRemove = TypedMutation( + pageRemove +); + +const pageBulkPublish = gql` + mutation PageBulkPublish($ids: [ID]!, $isPublished: Boolean!) { + pageBulkPublish(ids: $ids, isPublished: $isPublished) { + errors { + field + message + } + } + } +`; +export const TypedPageBulkPublish = TypedMutation< + PageBulkPublish, + PageBulkPublishVariables +>(pageBulkPublish); + +const pageBulkRemove = gql` + mutation PageBulkRemove($ids: [ID]!) { + pageBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedPageBulkRemove = TypedMutation< + PageBulkRemove, + PageBulkRemoveVariables +>(pageBulkRemove); diff --git a/src/pages/queries.ts b/src/pages/queries.ts new file mode 100644 index 000000000..8990a6267 --- /dev/null +++ b/src/pages/queries.ts @@ -0,0 +1,60 @@ +import gql from "graphql-tag"; + +import { TypedQuery } from "../queries"; +import { PageDetails, PageDetailsVariables } from "./types/PageDetails"; +import { PageList, PageListVariables } from "./types/PageList"; + +export const pageFragment = gql` + fragment PageFragment on Page { + id + title + slug + isPublished + } +`; + +export const pageDetailsFragment = gql` + ${pageFragment} + fragment PageDetailsFragment on Page { + ...PageFragment + contentJson + seoTitle + seoDescription + publicationDate + } +`; + +const pageList = gql` + ${pageFragment} + query PageList($first: Int, $after: String, $last: Int, $before: String) { + pages(before: $before, after: $after, first: $first, last: $last) { + edges { + node { + ...PageFragment + } + } + pageInfo { + hasPreviousPage + hasNextPage + startCursor + endCursor + } + } + } +`; +export const TypedPageListQuery = TypedQuery( + pageList +); + +const pageDetails = gql` + ${pageDetailsFragment} + query PageDetails($id: ID!) { + page(id: $id) { + ...PageDetailsFragment + } + } +`; +export const TypedPageDetailsQuery = TypedQuery< + PageDetails, + PageDetailsVariables +>(pageDetails); diff --git a/src/pages/types/PageBulkPublish.ts b/src/pages/types/PageBulkPublish.ts new file mode 100644 index 000000000..1a84cab83 --- /dev/null +++ b/src/pages/types/PageBulkPublish.ts @@ -0,0 +1,27 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: PageBulkPublish +// ==================================================== + +export interface PageBulkPublish_pageBulkPublish_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface PageBulkPublish_pageBulkPublish { + __typename: "PageBulkPublish"; + errors: PageBulkPublish_pageBulkPublish_errors[] | null; +} + +export interface PageBulkPublish { + pageBulkPublish: PageBulkPublish_pageBulkPublish | null; +} + +export interface PageBulkPublishVariables { + ids: (string | null)[]; + isPublished: boolean; +} diff --git a/src/pages/types/PageBulkRemove.ts b/src/pages/types/PageBulkRemove.ts new file mode 100644 index 000000000..be5c1f85b --- /dev/null +++ b/src/pages/types/PageBulkRemove.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: PageBulkRemove +// ==================================================== + +export interface PageBulkRemove_pageBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface PageBulkRemove_pageBulkDelete { + __typename: "PageBulkDelete"; + errors: PageBulkRemove_pageBulkDelete_errors[] | null; +} + +export interface PageBulkRemove { + pageBulkDelete: PageBulkRemove_pageBulkDelete | null; +} + +export interface PageBulkRemoveVariables { + ids: (string | null)[]; +} diff --git a/src/pages/types/PageCreate.ts b/src/pages/types/PageCreate.ts new file mode 100644 index 000000000..b87367761 --- /dev/null +++ b/src/pages/types/PageCreate.ts @@ -0,0 +1,41 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PageInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: PageCreate +// ==================================================== + +export interface PageCreate_pageCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface PageCreate_pageCreate_page { + __typename: "Page"; + id: string; + title: string; + slug: string; + isPublished: boolean; + contentJson: any; + seoTitle: string | null; + seoDescription: string | null; + publicationDate: any | null; +} + +export interface PageCreate_pageCreate { + __typename: "PageCreate"; + errors: PageCreate_pageCreate_errors[] | null; + page: PageCreate_pageCreate_page | null; +} + +export interface PageCreate { + pageCreate: PageCreate_pageCreate | null; +} + +export interface PageCreateVariables { + input: PageInput; +} diff --git a/src/pages/types/PageDetails.ts b/src/pages/types/PageDetails.ts new file mode 100644 index 000000000..ffc94dd3a --- /dev/null +++ b/src/pages/types/PageDetails.ts @@ -0,0 +1,27 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: PageDetails +// ==================================================== + +export interface PageDetails_page { + __typename: "Page"; + id: string; + title: string; + slug: string; + isPublished: boolean; + contentJson: any; + seoTitle: string | null; + seoDescription: string | null; + publicationDate: any | null; +} + +export interface PageDetails { + page: PageDetails_page | null; +} + +export interface PageDetailsVariables { + id: string; +} diff --git a/src/pages/types/PageDetailsFragment.ts b/src/pages/types/PageDetailsFragment.ts new file mode 100644 index 000000000..1b1e48c92 --- /dev/null +++ b/src/pages/types/PageDetailsFragment.ts @@ -0,0 +1,19 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: PageDetailsFragment +// ==================================================== + +export interface PageDetailsFragment { + __typename: "Page"; + id: string; + title: string; + slug: string; + isPublished: boolean; + contentJson: any; + seoTitle: string | null; + seoDescription: string | null; + publicationDate: any | null; +} diff --git a/src/pages/types/PageFragment.ts b/src/pages/types/PageFragment.ts new file mode 100644 index 000000000..c10ca7112 --- /dev/null +++ b/src/pages/types/PageFragment.ts @@ -0,0 +1,15 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: PageFragment +// ==================================================== + +export interface PageFragment { + __typename: "Page"; + id: string; + title: string; + slug: string; + isPublished: boolean; +} diff --git a/src/pages/types/PageList.ts b/src/pages/types/PageList.ts new file mode 100644 index 000000000..df8718b7b --- /dev/null +++ b/src/pages/types/PageList.ts @@ -0,0 +1,45 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: PageList +// ==================================================== + +export interface PageList_pages_edges_node { + __typename: "Page"; + id: string; + title: string; + slug: string; + isPublished: boolean; +} + +export interface PageList_pages_edges { + __typename: "PageCountableEdge"; + node: PageList_pages_edges_node; +} + +export interface PageList_pages_pageInfo { + __typename: "PageInfo"; + hasPreviousPage: boolean; + hasNextPage: boolean; + startCursor: string | null; + endCursor: string | null; +} + +export interface PageList_pages { + __typename: "PageCountableConnection"; + edges: PageList_pages_edges[]; + pageInfo: PageList_pages_pageInfo; +} + +export interface PageList { + pages: PageList_pages | null; +} + +export interface PageListVariables { + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/pages/types/PageRemove.ts b/src/pages/types/PageRemove.ts new file mode 100644 index 000000000..d1f63ed63 --- /dev/null +++ b/src/pages/types/PageRemove.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: PageRemove +// ==================================================== + +export interface PageRemove_pageDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface PageRemove_pageDelete { + __typename: "PageDelete"; + errors: PageRemove_pageDelete_errors[] | null; +} + +export interface PageRemove { + pageDelete: PageRemove_pageDelete | null; +} + +export interface PageRemoveVariables { + id: string; +} diff --git a/src/pages/types/PageUpdate.ts b/src/pages/types/PageUpdate.ts new file mode 100644 index 000000000..853a0a34c --- /dev/null +++ b/src/pages/types/PageUpdate.ts @@ -0,0 +1,42 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PageInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: PageUpdate +// ==================================================== + +export interface PageUpdate_pageUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface PageUpdate_pageUpdate_page { + __typename: "Page"; + id: string; + title: string; + slug: string; + isPublished: boolean; + contentJson: any; + seoTitle: string | null; + seoDescription: string | null; + publicationDate: any | null; +} + +export interface PageUpdate_pageUpdate { + __typename: "PageUpdate"; + errors: PageUpdate_pageUpdate_errors[] | null; + page: PageUpdate_pageUpdate_page | null; +} + +export interface PageUpdate { + pageUpdate: PageUpdate_pageUpdate | null; +} + +export interface PageUpdateVariables { + id: string; + input: PageInput; +} diff --git a/src/pages/urls.ts b/src/pages/urls.ts new file mode 100644 index 000000000..6761dd81f --- /dev/null +++ b/src/pages/urls.ts @@ -0,0 +1,23 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { BulkAction, Dialog, Pagination } from "../types"; + +export const pagesSection = "/pages/"; + +export const pageListPath = pagesSection; +export type PageListUrlDialog = "publish" | "unpublish" | "remove"; +export type PageListUrlQueryParams = BulkAction & + Dialog & + Pagination; +export const pageListUrl = (params?: PageListUrlQueryParams) => + pageListPath + "?" + stringifyQs(params); + +export const pagePath = (id: string) => urlJoin(pagesSection, id); +export type PageUrlDialog = "remove"; +export type PageUrlQueryParams = Dialog; +export const pageUrl = (id: string, params?: PageUrlQueryParams) => + pagePath(encodeURIComponent(id)) + "?" + stringifyQs(params); + +export const pageCreatePath = urlJoin(pagesSection, "add"); +export const pageCreateUrl = pageCreatePath; diff --git a/src/pages/views/PageCreate.tsx b/src/pages/views/PageCreate.tsx new file mode 100644 index 000000000..367d4b929 --- /dev/null +++ b/src/pages/views/PageCreate.tsx @@ -0,0 +1,84 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import PageDetailsPage from "../components/PageDetailsPage"; +import { TypedPageCreate } from "../mutations"; +import { PageCreate as PageCreateData } from "../types/PageCreate"; +import { pageListUrl, pageUrl } from "../urls"; + +export interface PageCreateProps { + id: string; +} + +export const PageCreate: React.StatelessComponent = () => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const handlePageCreate = (data: PageCreateData) => { + if (data.pageCreate.errors.length === 0) { + notify({ + text: i18n.t("Successfully created new page", { + context: "notification" + }) + }); + navigate(pageUrl(data.pageCreate.page.id)); + } + }; + + return ( + + {(pageCreate, pageCreateOpts) => { + const formTransitionState = getMutationState( + pageCreateOpts.called, + pageCreateOpts.loading, + maybe(() => pageCreateOpts.data.pageCreate.errors) + ); + + return ( + <> + + pageCreateOpts.data.pageCreate.errors, [])} + saveButtonBarState={formTransitionState} + page={null} + onBack={() => navigate(pageListUrl())} + onRemove={() => undefined} + onSubmit={formData => + pageCreate({ + variables: { + input: { + contentJson: JSON.stringify(formData.content), + isPublished: formData.isPublished + ? true + : formData.publicationDate === "" + ? false + : true, + publicationDate: formData.isPublished + ? null + : formData.publicationDate === "" + ? null + : formData.publicationDate, + seo: { + description: formData.seoDescription, + title: formData.seoTitle + }, + slug: formData.slug === "" ? null : formData.slug, + title: formData.title + } + } + }) + } + /> + + ); + }} + + ); +}; +PageCreate.displayName = "PageCreate"; +export default PageCreate; diff --git a/src/pages/views/PageDetails.tsx b/src/pages/views/PageDetails.tsx new file mode 100644 index 000000000..e8b64a283 --- /dev/null +++ b/src/pages/views/PageDetails.tsx @@ -0,0 +1,141 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import { PageInput } from "../../types/globalTypes"; +import PageDetailsPage, { FormData } from "../components/PageDetailsPage"; +import { TypedPageRemove, TypedPageUpdate } from "../mutations"; +import { TypedPageDetailsQuery } from "../queries"; +import { PageRemove } from "../types/PageRemove"; +import { pageListUrl, pageUrl, PageUrlQueryParams } from "../urls"; + +export interface PageDetailsProps { + id: string; + params: PageUrlQueryParams; +} + +const createPageInput = (data: FormData): PageInput => ({ + contentJson: JSON.stringify(data.content), + isPublished: data.isPublished + ? true + : data.publicationDate === "" || data.publicationDate === null + ? false + : true, + publicationDate: data.isPublished + ? null + : data.publicationDate === "" + ? null + : data.publicationDate, + seo: { + description: data.seoDescription, + title: data.seoTitle + }, + slug: data.slug === "" ? null : data.slug, + title: data.title +}); + +export const PageDetails: React.StatelessComponent = ({ + id, + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const handlePageRemove = (data: PageRemove) => { + if (data.pageDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed page", { + context: "notification" + }) + }); + navigate(pageListUrl()); + } + }; + return ( + + {(pageRemove, pageRemoveOpts) => ( + + {(pageUpdate, pageUpdateOpts) => ( + + {pageDetails => { + const formTransitionState = getMutationState( + pageUpdateOpts.called, + pageUpdateOpts.loading, + maybe(() => pageUpdateOpts.data.pageUpdate.errors) + ); + const removeTransitionState = getMutationState( + pageRemoveOpts.called, + pageRemoveOpts.loading, + maybe(() => pageRemoveOpts.data.pageDelete.errors) + ); + + return ( + <> + pageDetails.data.page.title)} + /> + pageUpdateOpts.data.pageUpdate.errors, + [] + )} + saveButtonBarState={formTransitionState} + page={maybe(() => pageDetails.data.page)} + onBack={() => navigate(pageListUrl())} + onRemove={() => + navigate( + pageUrl(id, { + action: "remove" + }) + ) + } + onSubmit={formData => + pageUpdate({ + variables: { + id, + input: createPageInput(formData) + } + }) + } + /> + navigate(pageUrl(id))} + onConfirm={pageRemove} + variant="delete" + > + {{ title }}?", + { + context: "page remove", + title: maybe( + () => pageDetails.data.page.title, + "..." + ) + } + ) + }} + /> + + + ); + }} + + )} + + )} + + ); +}; +PageDetails.displayName = "PageDetails"; +export default PageDetails; diff --git a/src/pages/views/PageList.tsx b/src/pages/views/PageList.tsx new file mode 100644 index 000000000..bdfea8fbb --- /dev/null +++ b/src/pages/views/PageList.tsx @@ -0,0 +1,252 @@ +import Button from "@material-ui/core/Button"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { PAGINATE_BY } from "../../config"; +import { configurationMenuUrl } from "../../configuration"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import PageListPage from "../components/PageListPage/PageListPage"; +import { TypedPageBulkPublish, TypedPageBulkRemove } from "../mutations"; +import { TypedPageListQuery } from "../queries"; +import { PageBulkPublish } from "../types/PageBulkPublish"; +import { PageBulkRemove } from "../types/PageBulkRemove"; +import { + pageCreateUrl, + pageListUrl, + PageListUrlDialog, + PageListUrlQueryParams, + pageUrl +} from "../urls"; + +interface PageListProps { + params: PageListUrlQueryParams; +} + +export const PageList: React.StatelessComponent = ({ + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + + return ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.pages.pageInfo), + paginationState, + params + ); + + const closeModal = () => + navigate( + pageListUrl({ + ...params, + action: undefined, + ids: undefined + }), + true + ); + + const openModal = (action: PageListUrlDialog, ids: string[]) => + navigate( + pageListUrl({ + ...params, + action, + ids + }) + ); + + const handlePageBulkPublish = (data: PageBulkPublish) => { + if (data.pageBulkPublish.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Published pages") + }); + reset(); + refetch(); + } + }; + + const handlePageBulkRemove = (data: PageBulkRemove) => { + if (data.pageBulkDelete.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Removed pages") + }); + reset(); + refetch(); + } + }; + + return ( + + {(bulkPageRemove, bulkPageRemoveOpts) => ( + + {(bulkPagePublish, bulkPagePublishOpts) => { + const deleteTransitionState = getMutationState( + bulkPageRemoveOpts.called, + bulkPageRemoveOpts.loading, + maybe(() => bulkPageRemoveOpts.data.pageBulkDelete.errors) + ); + + const publishTransitionState = getMutationState( + bulkPagePublishOpts.called, + bulkPagePublishOpts.loading, + maybe(() => bulkPagePublishOpts.data.pageBulkPublish.errors) + ); + + return ( + <> + + data.pages.edges.map(edge => edge.node) + )} + pageInfo={pageInfo} + onAdd={() => navigate(pageCreateUrl)} + onBack={() => navigate(configurationMenuUrl)} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRowClick={id => () => navigate(pageUrl(id))} + toolbar={ + <> + + + openModal("remove", listElements)} + > + + + + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + /> + + bulkPagePublish({ + variables: { + ids: params.ids, + isPublished: true + } + }) + } + title={i18n.t("Publish pages")} + > + {{ number }} pages?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + bulkPagePublish({ + variables: { + ids: params.ids, + isPublished: false + } + }) + } + title={i18n.t("Unpublish pages")} + > + {{ number }} pages?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + bulkPageRemove({ + variables: { + ids: params.ids + } + }) + } + variant="delete" + title={i18n.t("Remove pages")} + > + {{ number }} pages?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + )} + + ); + }} + + ); +}; + +export default PageList; diff --git a/src/productTypes/components/ProductTypeAttributeEditDialog/ProductTypeAttributeEditDialog.tsx b/src/productTypes/components/ProductTypeAttributeEditDialog/ProductTypeAttributeEditDialog.tsx new file mode 100644 index 000000000..7e431962c --- /dev/null +++ b/src/productTypes/components/ProductTypeAttributeEditDialog/ProductTypeAttributeEditDialog.tsx @@ -0,0 +1,99 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import Form from "@saleor/components/Form"; +import { FormSpacer } from "@saleor/components/FormSpacer"; +import ListField from "@saleor/components/ListField"; +import i18n from "../../../i18n"; + +export interface FormData { + name: string; + values: Array<{ + label: string; + value: string; + }>; +} + +export interface ProductTypeAttributeEditDialogProps { + disabled: boolean; + errors: Array<{ + field: string; + message: string; + }>; + name: string; + opened: boolean; + title: string; + values: Array<{ + label: string; + value: string; + }>; + onClose: () => void; + onConfirm: (data: FormData) => void; +} + +const ProductTypeAttributeEditDialog: React.StatelessComponent< + ProductTypeAttributeEditDialogProps +> = ({ disabled, errors, name, opened, title, values, onClose, onConfirm }) => { + const initialForm: FormData = { + name: name || "", + values: values || [] + }; + return ( + +
    + {({ change, data, errors: formErrors }) => ( + <> + {title} + + + + + + + + + + + )} +
    +
    + ); +}; +ProductTypeAttributeEditDialog.displayName = "ProductTypeAttributeEditDialog"; +export default ProductTypeAttributeEditDialog; diff --git a/src/productTypes/components/ProductTypeAttributeEditDialog/index.ts b/src/productTypes/components/ProductTypeAttributeEditDialog/index.ts new file mode 100644 index 000000000..6344b380f --- /dev/null +++ b/src/productTypes/components/ProductTypeAttributeEditDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductTypeAttributeEditDialog"; +export * from "./ProductTypeAttributeEditDialog"; diff --git a/src/productTypes/components/ProductTypeAttributes/ProductTypeAttributes.tsx b/src/productTypes/components/ProductTypeAttributes/ProductTypeAttributes.tsx new file mode 100644 index 000000000..e75f41ab4 --- /dev/null +++ b/src/productTypes/components/ProductTypeAttributes/ProductTypeAttributes.tsx @@ -0,0 +1,139 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { AttributeTypeEnum } from "../../../types/globalTypes"; +import { + ProductTypeDetails_productType_productAttributes, + ProductTypeDetails_productType_variantAttributes +} from "../../types/ProductTypeDetails"; + +const styles = (theme: Theme) => + createStyles({ + iconCell: { + "&:last-child": { + paddingRight: 0 + }, + width: 48 + theme.spacing.unit / 2 + }, + link: { + cursor: "pointer" + }, + textLeft: { + textAlign: "left" + } + }); + +interface ProductTypeAttributesProps extends WithStyles { + attributes: + | ProductTypeDetails_productType_productAttributes[] + | ProductTypeDetails_productType_variantAttributes[]; + type: AttributeTypeEnum; + onAttributeAdd: (type: AttributeTypeEnum) => void; + onAttributeDelete: (id: string, event: React.MouseEvent) => void; + onAttributeUpdate: (id: string) => void; +} + +const ProductTypeAttributes = withStyles(styles, { + name: "ProductTypeAttributes" +})( + ({ + attributes, + classes, + type, + onAttributeAdd, + onAttributeDelete, + onAttributeUpdate + }: ProductTypeAttributesProps) => ( + + onAttributeAdd(type)} + > + {i18n.t("Add attribute", { context: "button" })} + + } + /> + + + + {i18n.t("Attribute name")} + + {i18n.t("Values")} + + + + + + {renderCollection( + attributes, + attribute => ( + onAttributeUpdate(attribute.id) + : undefined + } + key={maybe(() => attribute.id)} + > + + {maybe(() => attribute.name) ? attribute.name : } + + + {maybe(() => attribute.values) !== undefined ? ( + attribute.values.map(value => value.name).join(", ") + ) : ( + + )} + + + onAttributeDelete(attribute.id, event)} + > + + + + + ), + () => ( + + + {i18n.t("No attributes found")} + + + ) + )} + +
    +
    + ) +); +ProductTypeAttributes.displayName = "ProductTypeAttributes"; +export default ProductTypeAttributes; diff --git a/src/productTypes/components/ProductTypeAttributes/index.ts b/src/productTypes/components/ProductTypeAttributes/index.ts new file mode 100644 index 000000000..c59c84532 --- /dev/null +++ b/src/productTypes/components/ProductTypeAttributes/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductTypeAttributes"; +export * from "./ProductTypeAttributes"; diff --git a/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx b/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx new file mode 100644 index 000000000..76dfcda74 --- /dev/null +++ b/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx @@ -0,0 +1,102 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { TaxRateType, WeightUnitsEnum } from "../../../types/globalTypes"; +import ProductTypeDetails from "../ProductTypeDetails/ProductTypeDetails"; +import ProductTypeShipping from "../ProductTypeShipping/ProductTypeShipping"; +import ProductTypeTaxes from "../ProductTypeTaxes/ProductTypeTaxes"; + +export interface ProductTypeForm { + chargeTaxes: boolean; + name: string; + isShippingRequired: boolean; + taxRate: TaxRateType; + weight: number; +} + +export interface ProductTypeCreatePageProps { + errors: Array<{ + field: string; + message: string; + }>; + defaultWeightUnit: WeightUnitsEnum; + disabled: boolean; + pageTitle: string; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onSubmit: (data: ProductTypeForm) => void; +} + +const ProductTypeCreatePage: React.StatelessComponent< + ProductTypeCreatePageProps +> = ({ + defaultWeightUnit, + disabled, + errors, + pageTitle, + saveButtonBarState, + onBack, + onSubmit +}: ProductTypeCreatePageProps) => { + const formInitialData: ProductTypeForm = { + chargeTaxes: true, + isShippingRequired: false, + name: "", + taxRate: TaxRateType.STANDARD, + weight: 0 + }; + return ( +
    + {({ change, data, hasChanged, submit }) => ( + + {i18n.t("Product Types")} + + +
    + +
    +
    + + + +
    +
    + +
    + )} +
    + ); +}; +ProductTypeCreatePage.displayName = "ProductTypeCreatePage"; +export default ProductTypeCreatePage; diff --git a/src/productTypes/components/ProductTypeCreatePage/index.ts b/src/productTypes/components/ProductTypeCreatePage/index.ts new file mode 100644 index 000000000..2a18e4c3e --- /dev/null +++ b/src/productTypes/components/ProductTypeCreatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductTypeCreatePage"; +export * from "./ProductTypeCreatePage"; diff --git a/src/productTypes/components/ProductTypeDetails/ProductTypeDetails.tsx b/src/productTypes/components/ProductTypeDetails/ProductTypeDetails.tsx new file mode 100644 index 000000000..984b1f03d --- /dev/null +++ b/src/productTypes/components/ProductTypeDetails/ProductTypeDetails.tsx @@ -0,0 +1,42 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { createStyles, withStyles, WithStyles } from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; + +const styles = createStyles({ + root: { + overflow: "visible" + } +}); + +interface ProductTypeDetailsProps extends WithStyles { + data?: { + name: string; + }; + disabled: boolean; + onChange: (event: React.ChangeEvent) => void; +} + +const ProductTypeDetails = withStyles(styles, { name: "ProductTypeDetails" })( + ({ classes, data, disabled, onChange }: ProductTypeDetailsProps) => ( + + + + + + + ) +); +ProductTypeDetails.displayName = "ProductTypeDetails"; +export default ProductTypeDetails; diff --git a/src/productTypes/components/ProductTypeDetails/index.ts b/src/productTypes/components/ProductTypeDetails/index.ts new file mode 100644 index 000000000..4677bf57a --- /dev/null +++ b/src/productTypes/components/ProductTypeDetails/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductTypeDetails"; +export * from "./ProductTypeDetails"; diff --git a/src/productTypes/components/ProductTypeDetailsPage/ProductTypeDetailsPage.tsx b/src/productTypes/components/ProductTypeDetailsPage/ProductTypeDetailsPage.tsx new file mode 100644 index 000000000..bffc67b0d --- /dev/null +++ b/src/productTypes/components/ProductTypeDetailsPage/ProductTypeDetailsPage.tsx @@ -0,0 +1,179 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { + AttributeTypeEnum, + TaxRateType, + WeightUnitsEnum +} from "../../../types/globalTypes"; +import { ProductTypeDetails_productType } from "../../types/ProductTypeDetails"; +import ProductTypeAttributes from "../ProductTypeAttributes/ProductTypeAttributes"; +import ProductTypeDetails from "../ProductTypeDetails/ProductTypeDetails"; +import ProductTypeShipping from "../ProductTypeShipping/ProductTypeShipping"; +import ProductTypeTaxes from "../ProductTypeTaxes/ProductTypeTaxes"; + +interface ChoiceType { + label: string; + value: string; +} + +export interface ProductTypeForm { + name: string; + hasVariants: boolean; + isShippingRequired: boolean; + taxRate: TaxRateType; + productAttributes: ChoiceType[]; + variantAttributes: ChoiceType[]; + weight: number; +} + +export interface ProductTypeDetailsPageProps { + errors: Array<{ + field: string; + message: string; + }>; + productType: ProductTypeDetails_productType; + defaultWeightUnit: WeightUnitsEnum; + disabled: boolean; + pageTitle: string; + saveButtonBarState: ConfirmButtonTransitionState; + onAttributeAdd: (type: AttributeTypeEnum) => void; + onAttributeDelete: (id: string, event: React.MouseEvent) => void; + onAttributeUpdate: (id: string) => void; + onBack: () => void; + onDelete: () => void; + onSubmit: (data: ProductTypeForm) => void; +} + +const ProductTypeDetailsPage: React.StatelessComponent< + ProductTypeDetailsPageProps +> = ({ + defaultWeightUnit, + disabled, + errors, + pageTitle, + productType, + saveButtonBarState, + onAttributeAdd, + onAttributeDelete, + onAttributeUpdate, + onBack, + onDelete, + onSubmit +}) => { + const formInitialData: ProductTypeForm = { + hasVariants: + maybe(() => productType.hasVariants) !== undefined + ? productType.hasVariants + : false, + isShippingRequired: + maybe(() => productType.isShippingRequired) !== undefined + ? productType.isShippingRequired + : false, + name: maybe(() => productType.name) !== undefined ? productType.name : "", + productAttributes: + maybe(() => productType.productAttributes) !== undefined + ? productType.productAttributes.map(attribute => ({ + label: attribute.name, + value: attribute.id + })) + : [], + taxRate: + maybe(() => productType.taxRate) !== undefined + ? productType.taxRate + : null, + variantAttributes: + maybe(() => productType.variantAttributes) !== undefined + ? productType.variantAttributes.map(attribute => ({ + label: attribute.name, + value: attribute.id + })) + : [], + weight: maybe(() => productType.weight.value) + }; + return ( +
    + {({ change, data, hasChanged, submit }) => ( + + {i18n.t("Product Types")} + + +
    + + + productType.productAttributes)} + type={AttributeTypeEnum.PRODUCT} + onAttributeAdd={onAttributeAdd} + onAttributeDelete={onAttributeDelete} + onAttributeUpdate={onAttributeUpdate} + /> + + + {data.hasVariants && ( + <> + + productType.variantAttributes)} + type={AttributeTypeEnum.VARIANT} + onAttributeAdd={onAttributeAdd} + onAttributeDelete={onAttributeDelete} + onAttributeUpdate={onAttributeUpdate} + /> + + )} +
    +
    + + + +
    +
    + +
    + )} +
    + ); +}; +ProductTypeDetailsPage.displayName = "ProductTypeDetailsPage"; +export default ProductTypeDetailsPage; diff --git a/src/productTypes/components/ProductTypeDetailsPage/index.ts b/src/productTypes/components/ProductTypeDetailsPage/index.ts new file mode 100644 index 000000000..eae6822fc --- /dev/null +++ b/src/productTypes/components/ProductTypeDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductTypeDetailsPage"; +export * from "./ProductTypeDetailsPage"; diff --git a/src/productTypes/components/ProductTypeList/ProductTypeList.tsx b/src/productTypes/components/ProductTypeList/ProductTypeList.tsx new file mode 100644 index 000000000..6ad65504f --- /dev/null +++ b/src/productTypes/components/ProductTypeList/ProductTypeList.tsx @@ -0,0 +1,174 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection, translatedTaxRates } from "../../../misc"; +import { ListActions, ListProps } from "../../../types"; +import { ProductTypeList_productTypes_edges_node } from "../../types/ProductTypeList"; + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colName: {}, + colTax: { + width: 300 + }, + colType: { + width: 300 + } + }, + colName: {}, + colTax: {}, + colType: {}, + link: { + cursor: "pointer" + } + }); + +interface ProductTypeListProps + extends ListProps, + ListActions, + WithStyles { + productTypes: ProductTypeList_productTypes_edges_node[]; +} + +const ProductTypeList = withStyles(styles, { name: "ProductTypeList" })( + ({ + classes, + disabled, + productTypes, + pageInfo, + onNextPage, + onPreviousPage, + onRowClick, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: ProductTypeListProps) => ( + + + + + {i18n.t("Type Name", { context: "table header" })} + + + {i18n.t("Type", { context: "table header" })} + + + {i18n.t("Tax", { context: "table header" })} + + + + + + + + + {renderCollection( + productTypes, + productType => { + const isSelected = productType + ? isChecked(productType.id) + : false; + return ( + + + toggle(productType.id)} + /> + + + {productType ? ( + <> + {productType.name} + + {maybe(() => productType.hasVariants) + ? i18n.t("Configurable", { + context: "product type" + }) + : i18n.t("Simple product", { + context: "product type" + })} + + + ) : ( + + )} + + + {maybe(() => productType.isShippingRequired) !== + undefined ? ( + productType.isShippingRequired ? ( + <>{i18n.t("Physical", { context: "product type" })} + ) : ( + <>{i18n.t("Digital", { context: "product type" })} + ) + ) : ( + + )} + + + {maybe(() => productType.taxRate) ? ( + translatedTaxRates()[productType.taxRate] + ) : ( + + )} + + + ); + }, + () => ( + + + {i18n.t("No product types found")} + + + ) + )} + +
    +
    + ) +); +ProductTypeList.displayName = "ProductTypeList"; +export default ProductTypeList; diff --git a/src/productTypes/components/ProductTypeList/index.ts b/src/productTypes/components/ProductTypeList/index.ts new file mode 100644 index 000000000..9c1624523 --- /dev/null +++ b/src/productTypes/components/ProductTypeList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductTypeList"; +export * from "./ProductTypeList"; diff --git a/src/productTypes/components/ProductTypeListPage/ProductTypeListPage.tsx b/src/productTypes/components/ProductTypeListPage/ProductTypeListPage.tsx new file mode 100644 index 000000000..52c754557 --- /dev/null +++ b/src/productTypes/components/ProductTypeListPage/ProductTypeListPage.tsx @@ -0,0 +1,37 @@ +import Button from "@material-ui/core/Button"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { ProductTypeList_productTypes_edges_node } from "../../types/ProductTypeList"; +import ProductTypeList from "../ProductTypeList"; + +interface ProductTypeListPageProps extends PageListProps, ListActions { + productTypes: ProductTypeList_productTypes_edges_node[]; + onBack: () => void; +} + +const ProductTypeListPage: React.StatelessComponent< + ProductTypeListPageProps +> = ({ disabled, onAdd, onBack, ...listProps }) => ( + + {i18n.t("Configuration")} + + + + + +); +ProductTypeListPage.displayName = "ProductTypeListPage"; +export default ProductTypeListPage; diff --git a/src/productTypes/components/ProductTypeListPage/index.ts b/src/productTypes/components/ProductTypeListPage/index.ts new file mode 100644 index 000000000..55c8646cc --- /dev/null +++ b/src/productTypes/components/ProductTypeListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductTypeListPage"; +export * from "./ProductTypeListPage"; diff --git a/src/productTypes/components/ProductTypeShipping/ProductTypeShipping.tsx b/src/productTypes/components/ProductTypeShipping/ProductTypeShipping.tsx new file mode 100644 index 000000000..5ad7b53e8 --- /dev/null +++ b/src/productTypes/components/ProductTypeShipping/ProductTypeShipping.tsx @@ -0,0 +1,53 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import i18n from "../../../i18n"; +import { WeightUnitsEnum } from "../../../types/globalTypes"; + +interface ProductTypeShippingProps { + data: { + isShippingRequired: boolean; + weight: number | null; + }; + defaultWeightUnit: WeightUnitsEnum; + disabled: boolean; + onChange: (event: React.ChangeEvent) => void; +} + +const ProductTypeShipping: React.StatelessComponent< + ProductTypeShippingProps +> = ({ data, defaultWeightUnit, disabled, onChange }) => ( + + + + + {data.isShippingRequired && ( + + )} + + +); + +ProductTypeShipping.displayName = "ProductTypeShipping"; +export default ProductTypeShipping; diff --git a/src/productTypes/components/ProductTypeShipping/index.ts b/src/productTypes/components/ProductTypeShipping/index.ts new file mode 100644 index 000000000..c0c638265 --- /dev/null +++ b/src/productTypes/components/ProductTypeShipping/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductTypeShipping"; +export * from "./ProductTypeShipping"; diff --git a/src/productTypes/components/ProductTypeTaxes/ProductTypeTaxes.tsx b/src/productTypes/components/ProductTypeTaxes/ProductTypeTaxes.tsx new file mode 100644 index 000000000..c824355b4 --- /dev/null +++ b/src/productTypes/components/ProductTypeTaxes/ProductTypeTaxes.tsx @@ -0,0 +1,44 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import SingleSelectField from "@saleor/components/SingleSelectField"; +import i18n from "../../../i18n"; +import { translatedTaxRates as taxRates } from "../../../misc"; +import { TaxRateType } from "../../../types/globalTypes"; + +interface ProductTypeTaxesProps { + data: { + taxRate: TaxRateType | null; + }; + disabled: boolean; + onChange: (event: React.ChangeEvent) => void; +} +const taxRateChoices = Object.keys(taxRates()).map(key => ({ + label: taxRates()[key], + value: key +})); +const ProductTypeTaxes: React.StatelessComponent = ({ + data, + disabled, + onChange +}) => ( + + + + + + +); +ProductTypeTaxes.displayName = "ProductTypeTaxes"; +export default ProductTypeTaxes; diff --git a/src/productTypes/components/ProductTypeTaxes/index.ts b/src/productTypes/components/ProductTypeTaxes/index.ts new file mode 100644 index 000000000..3996500a9 --- /dev/null +++ b/src/productTypes/components/ProductTypeTaxes/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductTypeTaxes"; +export * from "./ProductTypeTaxes"; diff --git a/src/productTypes/containers/ProductTypeOperations.tsx b/src/productTypes/containers/ProductTypeOperations.tsx new file mode 100644 index 000000000..f99152083 --- /dev/null +++ b/src/productTypes/containers/ProductTypeOperations.tsx @@ -0,0 +1,117 @@ +import * as React from "react"; + +import { getMutationProviderData } from "../../misc"; +import { PartialMutationProviderOutput } from "../../types"; +import { + TypedAttributeCreateMutation, + TypedAttributeDeleteMutation, + TypedAttributeUpdateMutation, + TypedProductTypeDeleteMutation, + TypedProductTypeUpdateMutation +} from "../mutations"; +import { + AttributeCreate, + AttributeCreateVariables +} from "../types/AttributeCreate"; +import { + AttributeDelete, + AttributeDeleteVariables +} from "../types/AttributeDelete"; +import { + AttributeUpdate, + AttributeUpdateVariables +} from "../types/AttributeUpdate"; +import { + ProductTypeDelete, + ProductTypeDeleteVariables +} from "../types/ProductTypeDelete"; +import { + ProductTypeUpdate, + ProductTypeUpdateVariables +} from "../types/ProductTypeUpdate"; + +interface ProductTypeOperationsProps { + children: ( + props: { + attributeCreate: PartialMutationProviderOutput< + AttributeCreate, + AttributeCreateVariables + >; + deleteAttribute: PartialMutationProviderOutput< + AttributeDelete, + AttributeDeleteVariables + >; + deleteProductType: PartialMutationProviderOutput< + ProductTypeDelete, + ProductTypeDeleteVariables + >; + updateAttribute: PartialMutationProviderOutput< + AttributeUpdate, + AttributeUpdateVariables + >; + updateProductType: PartialMutationProviderOutput< + ProductTypeUpdate, + ProductTypeUpdateVariables + >; + } + ) => React.ReactNode; + onAttributeCreate: (data: AttributeCreate) => void; + onAttributeDelete: (data: AttributeDelete) => void; + onAttributeUpdate: (data: AttributeUpdate) => void; + onProductTypeDelete: (data: ProductTypeDelete) => void; + onProductTypeUpdate: (data: ProductTypeUpdate) => void; +} + +const ProductTypeOperations: React.StatelessComponent< + ProductTypeOperationsProps +> = ({ + children, + onAttributeCreate, + onAttributeDelete, + onAttributeUpdate, + onProductTypeDelete, + onProductTypeUpdate +}) => { + return ( + + {(...deleteProductType) => ( + + {(...updateProductType) => ( + + {(...createAttribute) => ( + + {(...deleteAttribute) => ( + + {(...updateAttribute) => + children({ + attributeCreate: getMutationProviderData( + ...createAttribute + ), + deleteAttribute: getMutationProviderData( + ...deleteAttribute + ), + deleteProductType: getMutationProviderData( + ...deleteProductType + ), + updateAttribute: getMutationProviderData( + ...updateAttribute + ), + updateProductType: getMutationProviderData( + ...updateProductType + ) + }) + } + + )} + + )} + + )} + + )} + + ); +}; +export default ProductTypeOperations; diff --git a/src/productTypes/fixtures.ts b/src/productTypes/fixtures.ts new file mode 100644 index 000000000..169f08b8f --- /dev/null +++ b/src/productTypes/fixtures.ts @@ -0,0 +1,580 @@ +import { + ProductCreateData_productTypes_edges_node, + ProductCreateData_productTypes_edges_node_productAttributes +} from "../products/types/ProductCreateData"; +import { TaxRateType } from "../types/globalTypes"; +import { ProductTypeDetails_productType } from "./types/ProductTypeDetails"; +import { ProductTypeList_productTypes_edges_node } from "./types/ProductTypeList"; + +export const attributes: ProductCreateData_productTypes_edges_node_productAttributes[] = [ + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZTo5", + name: "Author", + slug: "author", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI0", + name: "John Doe", + slug: "john-doe", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI1", + name: "Milionare Pirate", + slug: "milionare-pirate", + sortOrder: 1, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZTo2", + name: "Box Size", + slug: "box-size", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjE1", + name: "100g", + slug: "100g", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjE2", + name: "250g", + slug: "250g", + sortOrder: 1, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjE3", + name: "500g", + slug: "500g", + sortOrder: 2, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjE4", + name: "1kg", + slug: "1kg", + sortOrder: 3, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZToz", + name: "Brand", + slug: "brand", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjY=", + name: "Saleor", + slug: "saleor", + sortOrder: 0, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZTo4", + name: "Candy Box Size", + slug: "candy-box-size", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjIx", + name: "100g", + slug: "100g", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjIy", + name: "250g", + slug: "250g", + sortOrder: 1, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjIz", + name: "500g", + slug: "500g", + sortOrder: 2, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZTo1", + name: "Coffee Genre", + slug: "coffee-genre", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjEz", + name: "Arabica", + slug: "arabica", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjE0", + name: "Robusta", + slug: "robusta", + sortOrder: 1, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZToy", + name: "Collar", + slug: "collar", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjM=", + name: "Round", + slug: "round", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjQ=", + name: "V-Neck", + slug: "v-neck", + sortOrder: 1, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjU=", + name: "Polo", + slug: "polo", + sortOrder: 2, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZTox", + name: "Color", + slug: "color", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjE=", + name: "Blue", + slug: "blue", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI=", + name: "White", + slug: "white", + sortOrder: 1, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZToxMg==", + name: "Cover", + slug: "cover", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjMw", + name: "Soft", + slug: "soft", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjMx", + name: "Hard", + slug: "hard", + sortOrder: 1, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjMy", + name: "Middle soft", + slug: "middle-soft", + sortOrder: 2, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjMz", + name: "Middle hard", + slug: "middle-hard", + sortOrder: 3, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjM0", + name: "Middle", + slug: "middle", + sortOrder: 4, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjM1", + name: "Very hard", + slug: "very-hard", + sortOrder: 5, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZTo3", + name: "Flavor", + slug: "flavor", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjE5", + name: "Sour", + slug: "sour", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjIw", + name: "Sweet", + slug: "sweet", + sortOrder: 1, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZToxMQ==", + name: "Language", + slug: "language", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI4", + name: "English", + slug: "english", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI5", + name: "Pirate", + slug: "pirate", + sortOrder: 1, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZToxMA==", + name: "Publisher", + slug: "publisher", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI2", + name: "Mirumee Press", + slug: "mirumee-press", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI3", + name: "Saleor Publishing", + slug: "saleor-publishing", + sortOrder: 1, + type: "STRING", + value: "" + } + ] + } + }, + { + node: { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZTo0", + name: "Size", + slug: "size", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjc=", + name: "XS", + slug: "xs", + sortOrder: 0, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjg=", + name: "S", + slug: "s", + sortOrder: 1, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjk=", + name: "M", + slug: "m", + sortOrder: 2, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjEw", + name: "L", + slug: "l", + sortOrder: 3, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjEx", + name: "XL", + slug: "xl", + sortOrder: 4, + type: "STRING", + value: "" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjEy", + name: "XXL", + slug: "xxl", + sortOrder: 5, + type: "STRING", + value: "" + } + ] + } + } +].map(edge => edge.node); + +export const productTypes: Array< + ProductCreateData_productTypes_edges_node & + ProductTypeList_productTypes_edges_node +> = [ + { + __typename: "ProductType" as "ProductType", + hasVariants: true, + id: "UHJvZHVjdFR5cGU6NA==", + isShippingRequired: true, + name: "Candy", + productAttributes: [attributes[0]], + taxRate: "FOODSTUFFS" as TaxRateType, + variantAttributes: [attributes[1], attributes[2]] + }, + { + __typename: "ProductType" as "ProductType", + hasVariants: false, + id: "UHJvZHVjdFR5cGU6NQ==", + isShippingRequired: false, + name: "E-books", + productAttributes: [attributes[5]], + taxRate: "STANDARD" as TaxRateType, + variantAttributes: [attributes[0], attributes[3]] + }, + { + __typename: "ProductType" as "ProductType", + hasVariants: false, + id: "UHJvZHVjdFR5cGU6Mg==", + isShippingRequired: true, + name: "Mugs", + productAttributes: [attributes[7]], + taxRate: "STANDARD" as TaxRateType, + variantAttributes: [attributes[2], attributes[5]] + }, + { + __typename: "ProductType" as "ProductType", + hasVariants: true, + id: "UHJvZHVjdFR5cGU6Mw==", + isShippingRequired: true, + name: "Coffee", + productAttributes: [attributes[8]], + taxRate: "STANDARD" as TaxRateType, + variantAttributes: [attributes[1], attributes[4]] + }, + { + __typename: "ProductType" as "ProductType", + hasVariants: true, + id: "UHJvZHVjdFR5cGU6MQ==", + isShippingRequired: true, + name: "T-Shirt", + productAttributes: [attributes[4]], + taxRate: "STANDARD" as TaxRateType, + variantAttributes: [attributes[1], attributes[6]] + } +].map(productType => ({ + __typename: "ProductType" as "ProductType", + ...productType +})); +export const productType: ProductTypeDetails_productType = { + __typename: "ProductType" as "ProductType", + hasVariants: false, + id: "UHJvZHVjdFR5cGU6NQ==", + isShippingRequired: false, + name: "E-books", + productAttributes: [ + { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZTo5", + name: "Author", + slug: "author", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI0", + name: "John Doe", + slug: "john-doe" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI1", + name: "Milionare Pirate", + slug: "milionare-pirate" + } + ] + }, + { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZToxMQ==", + name: "Language", + slug: "language", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI4", + name: "English", + slug: "english" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI5", + name: "Pirate", + slug: "pirate" + } + ] + }, + { + __typename: "Attribute" as "Attribute", + id: "UHJvZHVjdEF0dHJpYnV0ZToxMA==", + name: "Publisher", + slug: "publisher", + values: [ + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI2", + name: "Mirumee Press", + slug: "mirumee-press" + }, + { + __typename: "AttributeValue" as "AttributeValue", + id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI3", + name: "Saleor Publishing", + slug: "saleor-publishing" + } + ] + } + ], + taxRate: "STANDARD" as TaxRateType, + variantAttributes: [], + weight: { + __typename: "Weight", + unit: "kg", + value: 7.82 + } +}; diff --git a/src/productTypes/index.tsx b/src/productTypes/index.tsx new file mode 100644 index 000000000..c5232cfe0 --- /dev/null +++ b/src/productTypes/index.tsx @@ -0,0 +1,56 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { + productTypeAddPath, + productTypeListPath, + ProductTypeListUrlQueryParams, + productTypePath, + ProductTypeUrlQueryParams +} from "./urls"; +import ProductTypeCreate from "./views/ProductTypeCreate"; +import ProductTypeListComponent from "./views/ProductTypeList"; +import ProductTypeUpdateComponent from "./views/ProductTypeUpdate"; + +const ProductTypeList: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: ProductTypeListUrlQueryParams = qs; + return ; +}; + +interface ProductTypeUpdateRouteParams { + id: string; +} +const ProductTypeUpdate: React.StatelessComponent< + RouteComponentProps +> = ({ match }) => { + const qs = parseQs(location.search.substr(1)); + const params: ProductTypeUrlQueryParams = qs; + + return ( + + ); +}; + +export const ProductTypeRouter: React.StatelessComponent< + RouteComponentProps +> = () => ( + <> + + + + + + + +); +ProductTypeRouter.displayName = "ProductTypeRouter"; +export default ProductTypeRouter; diff --git a/src/productTypes/mutations.ts b/src/productTypes/mutations.ts new file mode 100644 index 000000000..de7cc9543 --- /dev/null +++ b/src/productTypes/mutations.ts @@ -0,0 +1,164 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { attributeFragment, productTypeDetailsFragment } from "./queries"; +import { + AttributeCreate, + AttributeCreateVariables +} from "./types/AttributeCreate"; +import { + AttributeDelete, + AttributeDeleteVariables +} from "./types/AttributeDelete"; +import { + AttributeUpdate, + AttributeUpdateVariables +} from "./types/AttributeUpdate"; +import { + ProductTypeBulkDelete, + ProductTypeBulkDeleteVariables +} from "./types/ProductTypeBulkDelete"; +import { + ProductTypeCreate, + ProductTypeCreateVariables +} from "./types/ProductTypeCreate"; +import { + ProductTypeDelete, + ProductTypeDeleteVariables +} from "./types/ProductTypeDelete"; +import { + ProductTypeUpdate, + ProductTypeUpdateVariables +} from "./types/ProductTypeUpdate"; + +export const productTypeDeleteMutation = gql` + mutation ProductTypeDelete($id: ID!) { + productTypeDelete(id: $id) { + errors { + field + message + } + productType { + id + } + } + } +`; +export const TypedProductTypeDeleteMutation = TypedMutation< + ProductTypeDelete, + ProductTypeDeleteVariables +>(productTypeDeleteMutation); + +export const productTypeBulkDeleteMutation = gql` + mutation ProductTypeBulkDelete($ids: [ID]!) { + productTypeBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedProductTypeBulkDeleteMutation = TypedMutation< + ProductTypeBulkDelete, + ProductTypeBulkDeleteVariables +>(productTypeBulkDeleteMutation); + +export const productTypeUpdateMutation = gql` + ${productTypeDetailsFragment} + mutation ProductTypeUpdate($id: ID!, $input: ProductTypeInput!) { + productTypeUpdate(id: $id, input: $input) { + errors { + field + message + } + productType { + ...ProductTypeDetailsFragment + } + } + } +`; +export const TypedProductTypeUpdateMutation = TypedMutation< + ProductTypeUpdate, + ProductTypeUpdateVariables +>(productTypeUpdateMutation); + +export const productTypeCreateMutation = gql` + ${productTypeDetailsFragment} + mutation ProductTypeCreate($input: ProductTypeInput!) { + productTypeCreate(input: $input) { + errors { + field + message + } + productType { + ...ProductTypeDetailsFragment + } + } + } +`; +export const TypedProductTypeCreateMutation = TypedMutation< + ProductTypeCreate, + ProductTypeCreateVariables +>(productTypeCreateMutation); + +export const attributeCreateMutation = gql` + ${productTypeDetailsFragment} + mutation AttributeCreate( + $id: ID! + $input: AttributeCreateInput! + $type: AttributeTypeEnum! + ) { + attributeCreate(id: $id, input: $input, type: $type) { + errors { + field + message + } + productType { + ...ProductTypeDetailsFragment + } + } + } +`; +export const TypedAttributeCreateMutation = TypedMutation< + AttributeCreate, + AttributeCreateVariables +>(attributeCreateMutation); + +export const attributeUpdateMutation = gql` + ${attributeFragment} + mutation AttributeUpdate($id: ID!, $input: AttributeUpdateInput!) { + attributeUpdate(id: $id, input: $input) { + errors { + field + message + } + attribute { + ...AttributeFragment + } + } + } +`; +export const TypedAttributeUpdateMutation = TypedMutation< + AttributeUpdate, + AttributeUpdateVariables +>(attributeUpdateMutation); + +export const attributeDeleteMutation = gql` + ${productTypeDetailsFragment} + mutation AttributeDelete($id: ID!) { + attributeDelete(id: $id) { + errors { + field + message + } + productType { + ...ProductTypeDetailsFragment + } + } + } +`; +export const TypedAttributeDeleteMutation = TypedMutation< + AttributeDelete, + AttributeDeleteVariables +>(attributeDeleteMutation); diff --git a/src/productTypes/queries.ts b/src/productTypes/queries.ts new file mode 100644 index 000000000..f3012c73a --- /dev/null +++ b/src/productTypes/queries.ts @@ -0,0 +1,108 @@ +import gql from "graphql-tag"; + +import { TypedQuery } from "../queries"; +import { ProductTypeCreateData } from "./types/ProductTypeCreateData"; +import { + ProductTypeDetails, + ProductTypeDetailsVariables +} from "./types/ProductTypeDetails"; +import { + ProductTypeList, + ProductTypeListVariables +} from "./types/ProductTypeList"; + +export const attributeFragment = gql` + fragment AttributeFragment on Attribute { + id + name + slug + values { + id + name + slug + } + } +`; +export const productTypeFragment = gql` + fragment ProductTypeFragment on ProductType { + id + name + hasVariants + isShippingRequired + taxRate + } +`; + +export const productTypeDetailsFragment = gql` + ${attributeFragment} + ${productTypeFragment} + fragment ProductTypeDetailsFragment on ProductType { + ...ProductTypeFragment + productAttributes { + ...AttributeFragment + } + variantAttributes { + ...AttributeFragment + } + weight { + unit + value + } + } +`; + +export const productTypeListQuery = gql` + ${productTypeFragment} + query ProductTypeList( + $after: String + $before: String + $first: Int + $last: Int + ) { + productTypes(after: $after, before: $before, first: $first, last: $last) { + edges { + node { + ...ProductTypeFragment + } + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + } + } +`; +export const TypedProductTypeListQuery = TypedQuery< + ProductTypeList, + ProductTypeListVariables +>(productTypeListQuery); + +export const productTypeDetailsQuery = gql` + ${productTypeDetailsFragment} + query ProductTypeDetails($id: ID!) { + productType(id: $id) { + ...ProductTypeDetailsFragment + } + shop { + defaultWeightUnit + } + } +`; +export const TypedProductTypeDetailsQuery = TypedQuery< + ProductTypeDetails, + ProductTypeDetailsVariables +>(productTypeDetailsQuery); + +export const productTypeCreateDataQuery = gql` + query ProductTypeCreateData { + shop { + defaultWeightUnit + } + } +`; +export const TypedProductTypeCreateDataQuery = TypedQuery< + ProductTypeCreateData, + {} +>(productTypeCreateDataQuery); diff --git a/src/productTypes/types/AttributeCreate.ts b/src/productTypes/types/AttributeCreate.ts new file mode 100644 index 000000000..63548a3bc --- /dev/null +++ b/src/productTypes/types/AttributeCreate.ts @@ -0,0 +1,79 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AttributeCreateInput, AttributeTypeEnum, TaxRateType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: AttributeCreate +// ==================================================== + +export interface AttributeCreate_attributeCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface AttributeCreate_attributeCreate_productType_productAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface AttributeCreate_attributeCreate_productType_productAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (AttributeCreate_attributeCreate_productType_productAttributes_values | null)[] | null; +} + +export interface AttributeCreate_attributeCreate_productType_variantAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface AttributeCreate_attributeCreate_productType_variantAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (AttributeCreate_attributeCreate_productType_variantAttributes_values | null)[] | null; +} + +export interface AttributeCreate_attributeCreate_productType_weight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface AttributeCreate_attributeCreate_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; + isShippingRequired: boolean; + taxRate: TaxRateType | null; + productAttributes: (AttributeCreate_attributeCreate_productType_productAttributes | null)[] | null; + variantAttributes: (AttributeCreate_attributeCreate_productType_variantAttributes | null)[] | null; + weight: AttributeCreate_attributeCreate_productType_weight | null; +} + +export interface AttributeCreate_attributeCreate { + __typename: "AttributeCreate"; + errors: AttributeCreate_attributeCreate_errors[] | null; + productType: AttributeCreate_attributeCreate_productType | null; +} + +export interface AttributeCreate { + attributeCreate: AttributeCreate_attributeCreate | null; +} + +export interface AttributeCreateVariables { + id: string; + input: AttributeCreateInput; + type: AttributeTypeEnum; +} diff --git a/src/productTypes/types/AttributeDelete.ts b/src/productTypes/types/AttributeDelete.ts new file mode 100644 index 000000000..f62cd728f --- /dev/null +++ b/src/productTypes/types/AttributeDelete.ts @@ -0,0 +1,77 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { TaxRateType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: AttributeDelete +// ==================================================== + +export interface AttributeDelete_attributeDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface AttributeDelete_attributeDelete_productType_productAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface AttributeDelete_attributeDelete_productType_productAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (AttributeDelete_attributeDelete_productType_productAttributes_values | null)[] | null; +} + +export interface AttributeDelete_attributeDelete_productType_variantAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface AttributeDelete_attributeDelete_productType_variantAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (AttributeDelete_attributeDelete_productType_variantAttributes_values | null)[] | null; +} + +export interface AttributeDelete_attributeDelete_productType_weight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface AttributeDelete_attributeDelete_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; + isShippingRequired: boolean; + taxRate: TaxRateType | null; + productAttributes: (AttributeDelete_attributeDelete_productType_productAttributes | null)[] | null; + variantAttributes: (AttributeDelete_attributeDelete_productType_variantAttributes | null)[] | null; + weight: AttributeDelete_attributeDelete_productType_weight | null; +} + +export interface AttributeDelete_attributeDelete { + __typename: "AttributeDelete"; + errors: AttributeDelete_attributeDelete_errors[] | null; + productType: AttributeDelete_attributeDelete_productType | null; +} + +export interface AttributeDelete { + attributeDelete: AttributeDelete_attributeDelete | null; +} + +export interface AttributeDeleteVariables { + id: string; +} diff --git a/src/productTypes/types/AttributeFragment.ts b/src/productTypes/types/AttributeFragment.ts new file mode 100644 index 000000000..35a35464f --- /dev/null +++ b/src/productTypes/types/AttributeFragment.ts @@ -0,0 +1,22 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: AttributeFragment +// ==================================================== + +export interface AttributeFragment_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface AttributeFragment { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (AttributeFragment_values | null)[] | null; +} diff --git a/src/productTypes/types/AttributeUpdate.ts b/src/productTypes/types/AttributeUpdate.ts new file mode 100644 index 000000000..08245fd55 --- /dev/null +++ b/src/productTypes/types/AttributeUpdate.ts @@ -0,0 +1,45 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AttributeUpdateInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: AttributeUpdate +// ==================================================== + +export interface AttributeUpdate_attributeUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface AttributeUpdate_attributeUpdate_attribute_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface AttributeUpdate_attributeUpdate_attribute { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (AttributeUpdate_attributeUpdate_attribute_values | null)[] | null; +} + +export interface AttributeUpdate_attributeUpdate { + __typename: "AttributeUpdate"; + errors: AttributeUpdate_attributeUpdate_errors[] | null; + attribute: AttributeUpdate_attributeUpdate_attribute | null; +} + +export interface AttributeUpdate { + attributeUpdate: AttributeUpdate_attributeUpdate | null; +} + +export interface AttributeUpdateVariables { + id: string; + input: AttributeUpdateInput; +} diff --git a/src/productTypes/types/ProductTypeBulkDelete.ts b/src/productTypes/types/ProductTypeBulkDelete.ts new file mode 100644 index 000000000..5924436f6 --- /dev/null +++ b/src/productTypes/types/ProductTypeBulkDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: ProductTypeBulkDelete +// ==================================================== + +export interface ProductTypeBulkDelete_productTypeBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductTypeBulkDelete_productTypeBulkDelete { + __typename: "ProductTypeBulkDelete"; + errors: ProductTypeBulkDelete_productTypeBulkDelete_errors[] | null; +} + +export interface ProductTypeBulkDelete { + productTypeBulkDelete: ProductTypeBulkDelete_productTypeBulkDelete | null; +} + +export interface ProductTypeBulkDeleteVariables { + ids: (string | null)[]; +} diff --git a/src/productTypes/types/ProductTypeCreate.ts b/src/productTypes/types/ProductTypeCreate.ts new file mode 100644 index 000000000..a146ea60f --- /dev/null +++ b/src/productTypes/types/ProductTypeCreate.ts @@ -0,0 +1,77 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ProductTypeInput, TaxRateType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: ProductTypeCreate +// ==================================================== + +export interface ProductTypeCreate_productTypeCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductTypeCreate_productTypeCreate_productType_productAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductTypeCreate_productTypeCreate_productType_productAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductTypeCreate_productTypeCreate_productType_productAttributes_values | null)[] | null; +} + +export interface ProductTypeCreate_productTypeCreate_productType_variantAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductTypeCreate_productTypeCreate_productType_variantAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductTypeCreate_productTypeCreate_productType_variantAttributes_values | null)[] | null; +} + +export interface ProductTypeCreate_productTypeCreate_productType_weight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ProductTypeCreate_productTypeCreate_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; + isShippingRequired: boolean; + taxRate: TaxRateType | null; + productAttributes: (ProductTypeCreate_productTypeCreate_productType_productAttributes | null)[] | null; + variantAttributes: (ProductTypeCreate_productTypeCreate_productType_variantAttributes | null)[] | null; + weight: ProductTypeCreate_productTypeCreate_productType_weight | null; +} + +export interface ProductTypeCreate_productTypeCreate { + __typename: "ProductTypeCreate"; + errors: ProductTypeCreate_productTypeCreate_errors[] | null; + productType: ProductTypeCreate_productTypeCreate_productType | null; +} + +export interface ProductTypeCreate { + productTypeCreate: ProductTypeCreate_productTypeCreate | null; +} + +export interface ProductTypeCreateVariables { + input: ProductTypeInput; +} diff --git a/src/productTypes/types/ProductTypeCreateData.ts b/src/productTypes/types/ProductTypeCreateData.ts new file mode 100644 index 000000000..483dedd6a --- /dev/null +++ b/src/productTypes/types/ProductTypeCreateData.ts @@ -0,0 +1,18 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { WeightUnitsEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: ProductTypeCreateData +// ==================================================== + +export interface ProductTypeCreateData_shop { + __typename: "Shop"; + defaultWeightUnit: WeightUnitsEnum | null; +} + +export interface ProductTypeCreateData { + shop: ProductTypeCreateData_shop | null; +} diff --git a/src/productTypes/types/ProductTypeDelete.ts b/src/productTypes/types/ProductTypeDelete.ts new file mode 100644 index 000000000..a4b523b6a --- /dev/null +++ b/src/productTypes/types/ProductTypeDelete.ts @@ -0,0 +1,32 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: ProductTypeDelete +// ==================================================== + +export interface ProductTypeDelete_productTypeDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductTypeDelete_productTypeDelete_productType { + __typename: "ProductType"; + id: string; +} + +export interface ProductTypeDelete_productTypeDelete { + __typename: "ProductTypeDelete"; + errors: ProductTypeDelete_productTypeDelete_errors[] | null; + productType: ProductTypeDelete_productTypeDelete_productType | null; +} + +export interface ProductTypeDelete { + productTypeDelete: ProductTypeDelete_productTypeDelete | null; +} + +export interface ProductTypeDeleteVariables { + id: string; +} diff --git a/src/productTypes/types/ProductTypeDetails.ts b/src/productTypes/types/ProductTypeDetails.ts new file mode 100644 index 000000000..38cbc73a6 --- /dev/null +++ b/src/productTypes/types/ProductTypeDetails.ts @@ -0,0 +1,71 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { TaxRateType, WeightUnitsEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: ProductTypeDetails +// ==================================================== + +export interface ProductTypeDetails_productType_productAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductTypeDetails_productType_productAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductTypeDetails_productType_productAttributes_values | null)[] | null; +} + +export interface ProductTypeDetails_productType_variantAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductTypeDetails_productType_variantAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductTypeDetails_productType_variantAttributes_values | null)[] | null; +} + +export interface ProductTypeDetails_productType_weight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ProductTypeDetails_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; + isShippingRequired: boolean; + taxRate: TaxRateType | null; + productAttributes: (ProductTypeDetails_productType_productAttributes | null)[] | null; + variantAttributes: (ProductTypeDetails_productType_variantAttributes | null)[] | null; + weight: ProductTypeDetails_productType_weight | null; +} + +export interface ProductTypeDetails_shop { + __typename: "Shop"; + defaultWeightUnit: WeightUnitsEnum | null; +} + +export interface ProductTypeDetails { + productType: ProductTypeDetails_productType | null; + shop: ProductTypeDetails_shop | null; +} + +export interface ProductTypeDetailsVariables { + id: string; +} diff --git a/src/productTypes/types/ProductTypeDetailsFragment.ts b/src/productTypes/types/ProductTypeDetailsFragment.ts new file mode 100644 index 000000000..85b673786 --- /dev/null +++ b/src/productTypes/types/ProductTypeDetailsFragment.ts @@ -0,0 +1,57 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { TaxRateType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: ProductTypeDetailsFragment +// ==================================================== + +export interface ProductTypeDetailsFragment_productAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductTypeDetailsFragment_productAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductTypeDetailsFragment_productAttributes_values | null)[] | null; +} + +export interface ProductTypeDetailsFragment_variantAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductTypeDetailsFragment_variantAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductTypeDetailsFragment_variantAttributes_values | null)[] | null; +} + +export interface ProductTypeDetailsFragment_weight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ProductTypeDetailsFragment { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; + isShippingRequired: boolean; + taxRate: TaxRateType | null; + productAttributes: (ProductTypeDetailsFragment_productAttributes | null)[] | null; + variantAttributes: (ProductTypeDetailsFragment_variantAttributes | null)[] | null; + weight: ProductTypeDetailsFragment_weight | null; +} diff --git a/src/productTypes/types/ProductTypeFragment.ts b/src/productTypes/types/ProductTypeFragment.ts new file mode 100644 index 000000000..f1443f1ff --- /dev/null +++ b/src/productTypes/types/ProductTypeFragment.ts @@ -0,0 +1,18 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { TaxRateType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: ProductTypeFragment +// ==================================================== + +export interface ProductTypeFragment { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; + isShippingRequired: boolean; + taxRate: TaxRateType | null; +} diff --git a/src/productTypes/types/ProductTypeList.ts b/src/productTypes/types/ProductTypeList.ts new file mode 100644 index 000000000..89d1f26d0 --- /dev/null +++ b/src/productTypes/types/ProductTypeList.ts @@ -0,0 +1,48 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { TaxRateType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: ProductTypeList +// ==================================================== + +export interface ProductTypeList_productTypes_edges_node { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; + isShippingRequired: boolean; + taxRate: TaxRateType | null; +} + +export interface ProductTypeList_productTypes_edges { + __typename: "ProductTypeCountableEdge"; + node: ProductTypeList_productTypes_edges_node; +} + +export interface ProductTypeList_productTypes_pageInfo { + __typename: "PageInfo"; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; + endCursor: string | null; +} + +export interface ProductTypeList_productTypes { + __typename: "ProductTypeCountableConnection"; + edges: ProductTypeList_productTypes_edges[]; + pageInfo: ProductTypeList_productTypes_pageInfo; +} + +export interface ProductTypeList { + productTypes: ProductTypeList_productTypes | null; +} + +export interface ProductTypeListVariables { + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +} diff --git a/src/productTypes/types/ProductTypeUpdate.ts b/src/productTypes/types/ProductTypeUpdate.ts new file mode 100644 index 000000000..6c7f4ce11 --- /dev/null +++ b/src/productTypes/types/ProductTypeUpdate.ts @@ -0,0 +1,78 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ProductTypeInput, TaxRateType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: ProductTypeUpdate +// ==================================================== + +export interface ProductTypeUpdate_productTypeUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductTypeUpdate_productTypeUpdate_productType_productAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductTypeUpdate_productTypeUpdate_productType_productAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductTypeUpdate_productTypeUpdate_productType_productAttributes_values | null)[] | null; +} + +export interface ProductTypeUpdate_productTypeUpdate_productType_variantAttributes_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductTypeUpdate_productTypeUpdate_productType_variantAttributes { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductTypeUpdate_productTypeUpdate_productType_variantAttributes_values | null)[] | null; +} + +export interface ProductTypeUpdate_productTypeUpdate_productType_weight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ProductTypeUpdate_productTypeUpdate_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; + isShippingRequired: boolean; + taxRate: TaxRateType | null; + productAttributes: (ProductTypeUpdate_productTypeUpdate_productType_productAttributes | null)[] | null; + variantAttributes: (ProductTypeUpdate_productTypeUpdate_productType_variantAttributes | null)[] | null; + weight: ProductTypeUpdate_productTypeUpdate_productType_weight | null; +} + +export interface ProductTypeUpdate_productTypeUpdate { + __typename: "ProductTypeUpdate"; + errors: ProductTypeUpdate_productTypeUpdate_errors[] | null; + productType: ProductTypeUpdate_productTypeUpdate_productType | null; +} + +export interface ProductTypeUpdate { + productTypeUpdate: ProductTypeUpdate_productTypeUpdate | null; +} + +export interface ProductTypeUpdateVariables { + id: string; + input: ProductTypeInput; +} diff --git a/src/productTypes/urls.ts b/src/productTypes/urls.ts new file mode 100644 index 000000000..509f22d47 --- /dev/null +++ b/src/productTypes/urls.ts @@ -0,0 +1,32 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { BulkAction, Dialog, Pagination, SingleAction } from "../types"; +import { AttributeTypeEnum } from "../types/globalTypes"; + +const productTypeSection = "/product-types/"; + +export const productTypeListPath = productTypeSection; +export type ProductTypeListUrlDialog = "remove"; +export type ProductTypeListUrlQueryParams = BulkAction & + Dialog & + Pagination; +export const productTypeListUrl = (params?: ProductTypeListUrlQueryParams) => + productTypeListPath + "?" + stringifyQs(params); + +export const productTypeAddPath = urlJoin(productTypeSection, "add"); +export const productTypeAddUrl = productTypeAddPath; + +export const productTypePath = (id: string) => urlJoin(productTypeSection, id); +export type ProductTypeUrlDialog = + | "add-attribute" + | "edit-attribute" + | "remove"; +export type ProductTypeUrlQueryParams = Dialog & + SingleAction & { + type?: AttributeTypeEnum; + }; +export const productTypeUrl = ( + id: string, + params?: ProductTypeUrlQueryParams +) => productTypePath(encodeURIComponent(id)) + "?" + stringifyQs(params); diff --git a/src/productTypes/views/ProductTypeCreate.tsx b/src/productTypes/views/ProductTypeCreate.tsx new file mode 100644 index 000000000..1b21b96f2 --- /dev/null +++ b/src/productTypes/views/ProductTypeCreate.tsx @@ -0,0 +1,74 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../i18n"; +import { maybe } from "../../misc"; +import ProductTypeCreatePage, { + ProductTypeForm +} from "../components/ProductTypeCreatePage"; +import { TypedProductTypeCreateMutation } from "../mutations"; +import { TypedProductTypeCreateDataQuery } from "../queries"; +import { ProductTypeCreate as ProductTypeCreateMutation } from "../types/ProductTypeCreate"; +import { productTypeListUrl, productTypeUrl } from "../urls"; + +export const ProductTypeCreate: React.StatelessComponent = () => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const handleCreateSuccess = (updateData: ProductTypeCreateMutation) => { + if (updateData.productTypeCreate.errors.length === 0) { + notify({ + text: i18n.t("Successfully created product type") + }); + navigate(productTypeUrl(updateData.productTypeCreate.productType.id)); + } + }; + return ( + + {( + createProductType, + { loading: loadingCreate, data: createProductTypeData } + ) => { + const handleCreate = (formData: ProductTypeForm) => + createProductType({ + variables: { + input: { + hasVariants: false, + isShippingRequired: formData.isShippingRequired, + name: formData.name, + taxRate: formData.chargeTaxes ? formData.taxRate : null, + weight: formData.weight + } + } + }); + return ( + + {({ data, loading }) => ( + <> + + data.shop.defaultWeightUnit)} + disabled={loadingCreate || loading} + errors={ + createProductTypeData + ? createProductTypeData.productTypeCreate.errors + : undefined + } + pageTitle={i18n.t("Create Product Type", { + context: "page title" + })} + saveButtonBarState={loadingCreate ? "loading" : "default"} + onBack={() => navigate(productTypeListUrl())} + onSubmit={handleCreate} + /> + + )} + + ); + }} + + ); +}; +export default ProductTypeCreate; diff --git a/src/productTypes/views/ProductTypeList.tsx b/src/productTypes/views/ProductTypeList.tsx new file mode 100644 index 000000000..40d66ef2f --- /dev/null +++ b/src/productTypes/views/ProductTypeList.tsx @@ -0,0 +1,156 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { PAGINATE_BY } from "../../config"; +import { configurationMenuUrl } from "../../configuration"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import ProductTypeListPage from "../components/ProductTypeListPage"; +import { TypedProductTypeBulkDeleteMutation } from "../mutations"; +import { TypedProductTypeListQuery } from "../queries"; +import { ProductTypeBulkDelete } from "../types/ProductTypeBulkDelete"; +import { + productTypeAddUrl, + productTypeListUrl, + ProductTypeListUrlQueryParams, + productTypeUrl +} from "../urls"; + +interface ProductTypeListProps { + params: ProductTypeListUrlQueryParams; +} + +export const ProductTypeList: React.StatelessComponent< + ProductTypeListProps +> = ({ params }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const closeModal = () => navigate(productTypeListUrl(), true); + + const paginationState = createPaginationState(PAGINATE_BY, params); + return ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.productTypes.pageInfo), + paginationState, + params + ); + + const handleProductTypeBulkDelete = (data: ProductTypeBulkDelete) => { + if (data.productTypeBulkDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed product types") + }); + reset(); + refetch(); + navigate( + productTypeListUrl({ + ...params, + action: undefined, + ids: undefined + }) + ); + } + }; + + return ( + + {(productTypeBulkDelete, productTypeBulkDeleteOpts) => { + const bulkRemoveTransitionState = getMutationState( + productTypeBulkDeleteOpts.called, + productTypeBulkDeleteOpts.loading, + maybe( + () => + productTypeBulkDeleteOpts.data.productTypeBulkDelete.errors + ) + ); + + const onProductTypeBulkDelete = () => + productTypeBulkDelete({ + variables: { + ids: params.ids + } + }); + return ( + <> + + data.productTypes.edges.map(edge => edge.node) + )} + pageInfo={pageInfo} + onAdd={() => navigate(productTypeAddUrl)} + onBack={() => navigate(configurationMenuUrl)} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRowClick={id => () => navigate(productTypeUrl(id))} + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + toolbar={ + + navigate( + productTypeListUrl({ + action: "remove", + ids: listElements + }) + ) + } + > + + + } + /> + + {{ number }} product types?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + ); + }} + + ); +}; +ProductTypeList.displayName = "ProductTypeList"; +export default ProductTypeList; diff --git a/src/productTypes/views/ProductTypeUpdate/errors.tsx b/src/productTypes/views/ProductTypeUpdate/errors.tsx new file mode 100644 index 000000000..851bf6c30 --- /dev/null +++ b/src/productTypes/views/ProductTypeUpdate/errors.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; + +import { UserError } from "../../../types"; + +interface ProductTypeUpdateErrorsState { + addAttributeErrors: UserError[]; + editAttributeErrors: UserError[]; + formErrors: UserError[]; +} +interface ProductTypeUpdateErrorsProps { + children: ( + props: { + errors: ProductTypeUpdateErrorsState; + set: { + addAttributeErrors: (errors: UserError[]) => void; + editAttributeErrors: (errors: UserError[]) => void; + formErrors: (errors: UserError[]) => void; + }; + } + ) => React.ReactNode; +} + +export class ProductTypeUpdateErrors extends React.Component< + ProductTypeUpdateErrorsProps, + ProductTypeUpdateErrorsState +> { + state: ProductTypeUpdateErrorsState = { + addAttributeErrors: [], + editAttributeErrors: [], + formErrors: [] + }; + + render() { + return this.props.children({ + errors: this.state, + set: { + addAttributeErrors: (addAttributeErrors: UserError[]) => + this.setState({ addAttributeErrors }), + editAttributeErrors: (editAttributeErrors: UserError[]) => + this.setState({ editAttributeErrors }), + formErrors: (formErrors: UserError[]) => this.setState({ formErrors }) + } + }); + } +} +export default ProductTypeUpdateErrors; diff --git a/src/productTypes/views/ProductTypeUpdate/index.tsx b/src/productTypes/views/ProductTypeUpdate/index.tsx new file mode 100644 index 000000000..d7099f31b --- /dev/null +++ b/src/productTypes/views/ProductTypeUpdate/index.tsx @@ -0,0 +1,350 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../../i18n"; +import { getMutationState, maybe } from "../../../misc"; +import { AttributeTypeEnum } from "../../../types/globalTypes"; +import ProductTypeAttributeEditDialog, { + FormData as AttributeForm +} from "../../components/ProductTypeAttributeEditDialog"; +import ProductTypeDetailsPage, { + ProductTypeForm +} from "../../components/ProductTypeDetailsPage"; +import ProductTypeOperations from "../../containers/ProductTypeOperations"; +import { TypedProductTypeDetailsQuery } from "../../queries"; +import { AttributeCreate } from "../../types/AttributeCreate"; +import { AttributeDelete } from "../../types/AttributeDelete"; +import { AttributeUpdate } from "../../types/AttributeUpdate"; +import { ProductTypeDelete } from "../../types/ProductTypeDelete"; +import { ProductTypeUpdate as ProductTypeUpdateMutation } from "../../types/ProductTypeUpdate"; +import { + productTypeListUrl, + productTypeUrl, + ProductTypeUrlQueryParams +} from "../../urls"; +import { ProductTypeUpdateErrors } from "./errors"; + +interface ProductTypeUpdateProps { + id: string; + params: ProductTypeUrlQueryParams; +} + +export const ProductTypeUpdate: React.StatelessComponent< + ProductTypeUpdateProps +> = ({ id, params }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + + return ( + + {({ errors, set: setErrors }) => ( + + {({ data, loading: dataLoading }) => { + const closeModal = () => { + navigate(productTypeUrl(id), true); + setErrors.addAttributeErrors([]); + setErrors.editAttributeErrors([]); + }; + const handleAttributeCreateSuccess = (data: AttributeCreate) => { + if (data.attributeCreate.errors.length === 0) { + notify({ + text: i18n.t("Attribute created", { + context: "notification" + }) + }); + closeModal(); + } else if ( + data.attributeCreate.errors !== null && + data.attributeCreate.errors.length > 0 + ) { + setErrors.addAttributeErrors(data.attributeCreate.errors); + } + }; + const handleAttributeDeleteSuccess = (data: AttributeDelete) => { + if (!data.attributeDelete.errors) { + notify({ + text: i18n.t("Attribute deleted", { + context: "notification" + }) + }); + } + }; + const handleAttributeUpdateSuccess = (data: AttributeUpdate) => { + if (data.attributeUpdate.errors.length === 0) { + notify({ + text: i18n.t("Attribute updated", { + context: "notification" + }) + }); + closeModal(); + } else if ( + data.attributeUpdate.errors !== null && + data.attributeUpdate.errors.length > 0 + ) { + setErrors.editAttributeErrors(data.attributeUpdate.errors); + } + }; + const handleProductTypeDeleteSuccess = ( + deleteData: ProductTypeDelete + ) => { + if (deleteData.productTypeDelete.errors.length === 0) { + notify({ + text: i18n.t("Product type deleted", { + context: "notification" + }) + }); + navigate(productTypeListUrl(), true); + } + }; + const handleProductTypeUpdateSuccess = ( + updateData: ProductTypeUpdateMutation + ) => { + if ( + !updateData.productTypeUpdate.errors || + updateData.productTypeUpdate.errors.length === 0 + ) { + notify({ + text: i18n.t("Product type updated", { + context: "notification" + }) + }); + } else if ( + updateData.productTypeUpdate.errors !== null && + updateData.productTypeUpdate.errors.length > 0 + ) { + setErrors.formErrors(updateData.productTypeUpdate.errors); + } + }; + + return ( + + {({ + attributeCreate, + deleteAttribute, + deleteProductType, + updateAttribute, + updateProductType + }) => { + const handleProductTypeDelete = () => + deleteProductType.mutate({ id }); + const handleProductTypeUpdate = ( + formData: ProductTypeForm + ) => { + updateProductType.mutate({ + id, + input: { + hasVariants: formData.hasVariants, + isShippingRequired: formData.isShippingRequired, + name: formData.name, + productAttributes: formData.productAttributes.map( + choice => choice.value + ), + taxRate: formData.taxRate, + variantAttributes: formData.variantAttributes.map( + choice => choice.value + ), + weight: formData.weight + } + }); + }; + const handleAttributeCreate = ( + data: AttributeForm, + type: AttributeTypeEnum + ) => + attributeCreate.mutate({ + id, + input: { + name: data.name, + values: data.values.map(value => ({ + name: value.label + })) + }, + type + }); + const handleAttributeDelete = ( + id: string, + event: React.MouseEvent + ) => { + event.stopPropagation(); + deleteAttribute.mutate({ id }); + }; + const handleAttributeUpdate = ( + id: string, + formData: AttributeForm + ) => { + const attribute = data.productType.variantAttributes + .concat(data.productType.productAttributes) + .filter(attribute => attribute.id === id)[0]; + updateAttribute.mutate({ + id, + input: { + addValues: formData.values + .filter( + value => + !attribute.values + .map(value => value.id) + .includes(value.value) + ) + .map(value => ({ + name: value.label + })), + name: formData.name, + removeValues: attribute.values + .filter( + value => + !formData.values + .map(value => value.value) + .includes(value.id) + ) + .map(value => value.id) + } + }); + }; + const loading = updateProductType.opts.loading || dataLoading; + const deleteTransactionState = getMutationState( + deleteProductType.opts.called, + deleteProductType.opts.loading, + maybe( + () => deleteProductType.opts.data.productTypeDelete.errors + ) + ); + + const attribute = maybe(() => + data.productType.productAttributes + .concat(data.productType.variantAttributes) + .find(attribute => attribute.id === params.id) + ); + + return ( + <> + data.productType.name)} /> + data.shop.defaultWeightUnit + )} + disabled={loading} + errors={errors.formErrors} + pageTitle={maybe(() => data.productType.name)} + productType={maybe(() => data.productType)} + saveButtonBarState={loading ? "loading" : "default"} + onAttributeAdd={type => + navigate( + productTypeUrl(id, { + action: "add-attribute", + type + }) + ) + } + onAttributeDelete={handleAttributeDelete} + onAttributeUpdate={attributeId => + navigate( + productTypeUrl(id, { + action: "edit-attribute", + id: attributeId + }) + ) + } + onBack={() => navigate(productTypeListUrl())} + onDelete={() => + navigate( + productTypeUrl(id, { + action: "remove" + }) + ) + } + onSubmit={handleProductTypeUpdate} + /> + {!dataLoading && ( + <> + {Object.keys(AttributeTypeEnum).map(key => ( + + handleAttributeCreate( + data, + AttributeTypeEnum[key] + ) + } + opened={ + params.action === "add-attribute" && + params.type === AttributeTypeEnum[key] + } + title={i18n.t("Add Attribute", { + context: "modal title" + })} + key={key} + /> + ))} + attribute.name)} + values={maybe(() => + attribute.values.map(value => ({ + label: value.name, + value: value.id + })) + )} + onClose={closeModal} + onConfirm={data => + handleAttributeUpdate(params.id, data) + } + opened={params.action === "edit-attribute"} + title={i18n.t("Edit Attribute", { + context: "modal title" + })} + /> + navigate(productTypeUrl(id))} + onConfirm={handleProductTypeDelete} + title={i18n.t("Remove product type")} + variant="delete" + > + {{ name }}?", + { + name: maybe( + () => data.productType.name, + "..." + ) + } + ) + }} + /> + + + )} + + ); + }} + + ); + }} + + )} + + ); +}; +export default ProductTypeUpdate; diff --git a/src/productTypes/views/ProductTypeUpdate/urls.ts b/src/productTypes/views/ProductTypeUpdate/urls.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/products/components/ProductCategoryAndCollectionsForm/ProductCategoryAndCollectionsForm.tsx b/src/products/components/ProductCategoryAndCollectionsForm/ProductCategoryAndCollectionsForm.tsx new file mode 100644 index 000000000..ae890a1a2 --- /dev/null +++ b/src/products/components/ProductCategoryAndCollectionsForm/ProductCategoryAndCollectionsForm.tsx @@ -0,0 +1,59 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import * as React from "react"; + +import FormSpacer from "@saleor/components/FormSpacer"; +import MultiSelectField from "@saleor/components/MultiSelectField"; +import PageHeader from "@saleor/components/PageHeader"; +import SingleSelectField from "@saleor/components/SingleSelectField"; +import i18n from "../../../i18n"; + +interface ProductCategoryAndCollectionsFormProps { + categories?: Array<{ value: string; label: string }>; + collections?: Array<{ value: string; label: string }>; + errors: { [key: string]: string }; + productCollections?: string[]; + category?: string; + loading?: boolean; + onChange: (event: React.ChangeEvent) => void; +} + +const ProductCategoryAndCollectionsForm = ({ + categories, + collections, + errors, + productCollections, + category, + loading, + onChange +}: ProductCategoryAndCollectionsFormProps) => ( + + + + + + + + +); +ProductCategoryAndCollectionsForm.displayName = + "ProductCategoryAndCollectionsForm"; +export default ProductCategoryAndCollectionsForm; diff --git a/src/products/components/ProductCategoryAndCollectionsForm/index.ts b/src/products/components/ProductCategoryAndCollectionsForm/index.ts new file mode 100644 index 000000000..a706be21c --- /dev/null +++ b/src/products/components/ProductCategoryAndCollectionsForm/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductCategoryAndCollectionsForm"; +export * from "./ProductCategoryAndCollectionsForm"; diff --git a/src/products/components/ProductCreatePage/ProductCreatePage.tsx b/src/products/components/ProductCreatePage/ProductCreatePage.tsx new file mode 100644 index 000000000..ce65f194e --- /dev/null +++ b/src/products/components/ProductCreatePage/ProductCreatePage.tsx @@ -0,0 +1,229 @@ +import { RawDraftContentState } from "draft-js"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import SeoForm from "@saleor/components/SeoForm"; +import VisibilityCard from "@saleor/components/VisibilityCard"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { UserError } from "../../../types"; +import { ProductCreateData_productTypes_edges_node_productAttributes } from "../../types/ProductCreateData"; +import ProductDetailsForm from "../ProductDetailsForm"; +import ProductOrganization from "../ProductOrganization"; +import ProductPricing from "../ProductPricing"; +import ProductStock from "../ProductStock"; + +interface ChoiceType { + label: string; + value: string; +} +export interface FormData { + attributes: Array<{ + slug: string; + value: string; + }>; + basePrice: number; + publicationDate: string; + category: ChoiceType; + chargeTaxes: boolean; + collections: ChoiceType[]; + description: RawDraftContentState; + isPublished: boolean; + name: string; + productType: { + label: string; + value: { + hasVariants: boolean; + id: string; + name: string; + productAttributes: ProductCreateData_productTypes_edges_node_productAttributes[]; + }; + }; + seoDescription: string; + seoTitle: string; + sku: string; + stockQuantity: number; +} + +interface ProductCreatePageProps { + errors: UserError[]; + collections?: Array<{ + id: string; + name: string; + }>; + currency: string; + categories?: Array<{ + id: string; + name: string; + }>; + disabled: boolean; + productTypes?: Array<{ + id: string; + name: string; + hasVariants: boolean; + productAttributes: ProductCreateData_productTypes_edges_node_productAttributes[]; + }>; + header: string; + saveButtonBarState: ConfirmButtonTransitionState; + fetchCategories: (data: string) => void; + fetchCollections: (data: string) => void; + onAttributesEdit: () => void; + onBack?(); + onSubmit?(data: FormData); +} + +export const ProductCreatePage: React.StatelessComponent< + ProductCreatePageProps +> = ({ + currency, + disabled, + categories, + collections, + errors: userErrors, + fetchCategories, + fetchCollections, + header, + productTypes, + saveButtonBarState, + onBack, + onSubmit +}: ProductCreatePageProps) => { + const initialData: FormData = { + attributes: [], + basePrice: 0, + category: { + label: "", + value: "" + }, + chargeTaxes: false, + collections: [], + description: {} as any, + isPublished: false, + name: "", + productType: { + label: "", + value: { + hasVariants: false, + id: "", + name: "", + productAttributes: [] as ProductCreateData_productTypes_edges_node_productAttributes[] + } + }, + publicationDate: "", + seoDescription: "", + seoTitle: "", + sku: null, + stockQuantity: null + }; + + return ( +
    + {({ change, data, errors, hasChanged, submit }) => { + const hasVariants = + data.productType && data.productType.value.hasVariants; + return ( + + {i18n.t("Products")} + + +
    + + + + + {!hasVariants && ( + <> + + + + )} + +
    +
    + + categories.map(category => ({ + label: category.name, + value: category.id + })), + [] + )} + errors={errors} + fetchCategories={fetchCategories} + fetchCollections={fetchCollections} + collections={maybe( + () => + collections.map(collection => ({ + label: collection.name, + value: collection.id + })), + [] + )} + productTypes={productTypes} + data={data} + disabled={disabled} + onChange={change} + /> + + +
    +
    + +
    + ); + }} +
    + ); +}; +ProductCreatePage.displayName = "ProductCreatePage"; +export default ProductCreatePage; diff --git a/src/products/components/ProductCreatePage/index.ts b/src/products/components/ProductCreatePage/index.ts new file mode 100644 index 000000000..7174a4e9d --- /dev/null +++ b/src/products/components/ProductCreatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductCreatePage"; +export * from "./ProductCreatePage"; diff --git a/src/products/components/ProductDetailsForm/ProductDetailsForm.tsx b/src/products/components/ProductDetailsForm/ProductDetailsForm.tsx new file mode 100644 index 000000000..2c3c47074 --- /dev/null +++ b/src/products/components/ProductDetailsForm/ProductDetailsForm.tsx @@ -0,0 +1,80 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import FormSpacer from "@saleor/components/FormSpacer"; +import RichTextEditor from "@saleor/components/RichTextEditor"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { ProductDetails_product } from "../../types/ProductDetails"; +import { FormData as CreateFormData } from "../ProductCreatePage"; +import { FormData as UpdateFormData } from "../ProductUpdatePage"; + +const styles = (theme: Theme) => + createStyles({ + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: `3fr 1fr` + } + }); + +interface ProductDetailsFormProps extends WithStyles { + data: CreateFormData & UpdateFormData; + disabled?: boolean; + errors: { [key: string]: string }; + product?: ProductDetails_product; + onChange(event: any); +} + +export const ProductDetailsForm = withStyles(styles, { + name: "ProductDetailsForm" +})( + ({ + classes, + data, + disabled, + errors, + product, + onChange + }: ProductDetailsFormProps) => ( + + + +
    + +
    + + JSON.parse(product.descriptionJson), null)} + label={i18n.t("Description")} + name="description" + onChange={onChange} + /> +
    +
    + ) +); +ProductDetailsForm.displayName = "ProductDetailsForm"; +export default ProductDetailsForm; diff --git a/src/products/components/ProductDetailsForm/index.ts b/src/products/components/ProductDetailsForm/index.ts new file mode 100644 index 000000000..a8c915932 --- /dev/null +++ b/src/products/components/ProductDetailsForm/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductDetailsForm"; +export * from "./ProductDetailsForm"; diff --git a/src/products/components/ProductImageNavigation/ProductImageNavigation.tsx b/src/products/components/ProductImageNavigation/ProductImageNavigation.tsx new file mode 100644 index 000000000..ca3112569 --- /dev/null +++ b/src/products/components/ProductImageNavigation/ProductImageNavigation.tsx @@ -0,0 +1,94 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as classNames from "classnames"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + card: { + marginBottom: 2 * theme.spacing.unit + }, + highlightedImageContainer: { + borderColor: theme.palette.primary.main + }, + image: { + height: "100%", + objectFit: "contain", + userSelect: "none", + width: "100%" + }, + imageContainer: { + background: "#ffffff", + border: "2px solid #eaeaea", + borderRadius: theme.spacing.unit, + cursor: "pointer", + height: 48, + overflow: "hidden", + padding: theme.spacing.unit / 2, + position: "relative" + }, + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridRowGap: theme.spacing.unit + "px", + gridTemplateColumns: "repeat(4, 1fr)" + }, + toolbar: { marginTop: -theme.spacing.unit / 2 } + }); + +interface ProductImageNavigationProps extends WithStyles { + disabled: boolean; + images?: Array<{ + id: string; + url: string; + }>; + highlighted?: string; + onRowClick: (id: string) => () => void; +} + +const ProductImageNavigation = withStyles(styles, { + name: "ProductImageNavigation" +})( + ({ + classes, + highlighted, + images, + onRowClick + }: ProductImageNavigationProps) => ( + + + + {images === undefined ? ( + + ) : ( +
    + {images.map(image => ( +
    + +
    + ))} +
    + )} +
    +
    + ) +); +ProductImageNavigation.displayName = "ProductImageNavigation"; +export default ProductImageNavigation; diff --git a/src/products/components/ProductImageNavigation/index.ts b/src/products/components/ProductImageNavigation/index.ts new file mode 100644 index 000000000..d4d8bf59e --- /dev/null +++ b/src/products/components/ProductImageNavigation/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductImageNavigation"; +export * from "./ProductImageNavigation"; diff --git a/src/products/components/ProductImagePage/ProductImagePage.tsx b/src/products/components/ProductImagePage/ProductImagePage.tsx new file mode 100644 index 000000000..4363e2546 --- /dev/null +++ b/src/products/components/ProductImagePage/ProductImagePage.tsx @@ -0,0 +1,136 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardTitle from "@saleor/components/CardTitle"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import ProductImageNavigation from "../ProductImageNavigation"; + +const styles = (theme: Theme) => + createStyles({ + image: { + height: "100%", + objectFit: "contain", + width: "100%" + }, + imageContainer: { + background: "#ffffff", + border: "1px solid #eaeaea", + borderRadius: theme.spacing.unit, + margin: `0 auto ${theme.spacing.unit * 2}px`, + maxWidth: 552, + padding: theme.spacing.unit * 2 + } + }); + +interface ProductImagePageProps extends WithStyles { + image?: { + id: string; + alt: string; + url: string; + }; + images?: Array<{ + id: string; + url: string; + }>; + disabled: boolean; + product: string; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onDelete: () => void; + onRowClick: (id: string) => () => void; + onSubmit: (data: { description: string }) => void; +} + +const ProductImagePage = withStyles(styles, { name: "ProductImagePage" })( + ({ + classes, + disabled, + image, + images, + product, + saveButtonBarState, + onBack, + onDelete, + onRowClick, + onSubmit + }: ProductImagePageProps) => ( +
    + {({ change, data, hasChanged, submit }) => { + return ( + + {product} + + +
    + + + + + + + +
    +
    + + + + {!!image ? ( +
    + +
    + ) : ( + + )} +
    +
    +
    +
    + +
    + ); + }} +
    + ) +); +ProductImagePage.displayName = "ProductImagePage"; +export default ProductImagePage; diff --git a/src/products/components/ProductImagePage/index.ts b/src/products/components/ProductImagePage/index.ts new file mode 100644 index 000000000..75e8f7bda --- /dev/null +++ b/src/products/components/ProductImagePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductImagePage"; +export * from "./ProductImagePage"; diff --git a/src/products/components/ProductImages/ProductImages.tsx b/src/products/components/ProductImages/ProductImages.tsx new file mode 100644 index 000000000..1cef09dcd --- /dev/null +++ b/src/products/components/ProductImages/ProductImages.tsx @@ -0,0 +1,242 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import classNames from "classnames"; + +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import CardTitle from "@saleor/components/CardTitle"; +import ImageTile from "@saleor/components/ImageTile"; +import ImageUpload from "@saleor/components/ImageUpload"; +import * as React from "react"; +import { SortableContainer, SortableElement } from "react-sortable-hoc"; +import i18n from "../../../i18n"; +import { ProductDetails_product_images } from "../../types/ProductDetails"; + +const styles = (theme: Theme) => + createStyles({ + card: { + marginTop: theme.spacing.unit * 2, + [theme.breakpoints.down("sm")]: { + marginTop: 0 + } + }, + fileField: { + display: "none" + }, + icon: { + color: "rgba(255, 255, 255, 0.54)" + }, + image: { + height: "100%", + objectFit: "contain", + userSelect: "none", + width: "100%" + }, + imageContainer: { + "&:hover, &.dragged": { + "& $imageOverlay": { + display: "block" + } + }, + background: "#ffffff", + border: "1px solid #eaeaea", + borderRadius: theme.spacing.unit, + height: 140, + margin: "auto", + overflow: "hidden", + padding: theme.spacing.unit * 2, + position: "relative", + width: 140 + }, + imageGridContainer: { + position: "relative" + }, + imageOverlay: { + background: "rgba(0, 0, 0, 0.6)", + cursor: "move", + display: "none", + height: 140, + left: 0, + padding: theme.spacing.unit * 2, + position: "absolute", + top: 0, + width: 140 + }, + imageOverlayToolbar: { + alignContent: "flex-end", + display: "flex", + position: "relative", + right: -theme.spacing.unit * 3, + top: -theme.spacing.unit * 2 + }, + imageUpload: { + height: "100%", + left: 0, + position: "absolute", + top: 0, + width: "100%" + }, + imageUploadActive: { + zIndex: 1 + }, + imageUploadIcon: { + display: "none" + }, + imageUploadIconActive: { + display: "block" + }, + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridRowGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: "repeat(4, 1fr)", + [theme.breakpoints.down("sm")]: { + gridTemplateColumns: "repeat(3, 1fr)" + }, + [theme.breakpoints.down("xs")]: { + gridTemplateColumns: "repeat(2, 1fr)" + } + }, + rootDragActive: { + opacity: 0.2 + } + }); + +interface ProductImagesProps extends WithStyles { + placeholderImage?: string; + images: ProductDetails_product_images[]; + loading?: boolean; + onImageDelete: (id: string) => () => void; + onImageEdit: (id: string) => () => void; + onImageUpload(file: File); + onImageReorder?(event: { oldIndex: number; newIndex: number }); +} + +interface ImageListContainerProps extends WithStyles { + items: any; + onImageDelete: (id: string) => () => void; + onImageEdit: (id: string) => () => void; +} + +const SortableImage = SortableElement( + ({ image, onImageEdit, onImageDelete }) => ( + onImageEdit(image.id) : undefined} + onImageDelete={onImageDelete} + /> + ) +); + +const ImageListContainer = SortableContainer( + withStyles(styles, { name: "ImageListContainer" })( + ({ + classes, + items, + onImageDelete, + onImageEdit, + ...props + }: ImageListContainerProps) => { + return ( +
    + {items.map((image, index) => ( + + ))} +
    + ); + } + ) +); + +const ProductImages = withStyles(styles, { name: "ProductImages" })( + ({ + classes, + images, + placeholderImage, + loading, + onImageEdit, + onImageDelete, + onImageReorder, + onImageUpload + }: ProductImagesProps) => ( + + + + onImageUpload(event.target.files[0])} + type="file" + ref={ref => (this.upload = ref)} + /> + + } + /> +
    + {images === undefined ? ( + +
    +
    + +
    +
    +
    + ) : images.length > 0 ? ( + <> + + {({ isDragActive }) => ( + + + + )} + + + ) : ( + + )} +
    +
    + ) +); +ProductImages.displayName = "ProductImages"; +export default ProductImages; diff --git a/src/products/components/ProductImages/index.ts b/src/products/components/ProductImages/index.ts new file mode 100644 index 000000000..0ec8845a8 --- /dev/null +++ b/src/products/components/ProductImages/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductImages"; +export * from "./ProductImages"; diff --git a/src/products/components/ProductListCard/ProductListCard.tsx b/src/products/components/ProductListCard/ProductListCard.tsx new file mode 100644 index 000000000..c14617933 --- /dev/null +++ b/src/products/components/ProductListCard/ProductListCard.tsx @@ -0,0 +1,68 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import Container from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import ProductList from "@saleor/components/ProductList"; +import { CategoryDetails_category_products_edges_node } from "../../../categories/types/CategoryDetails"; +import i18n from "../../../i18n"; +import { FilterPageProps, ListActions, PageListProps } from "../../../types"; +import { ProductListUrlFilters } from "../../urls"; +import ProductListFilter from "../ProductListFilter"; + +export interface ProductListCardProps + extends PageListProps, + ListActions, + FilterPageProps { + currencySymbol: string; + products: CategoryDetails_category_products_edges_node[]; +} + +export const ProductListCard: React.StatelessComponent< + ProductListCardProps +> = ({ + currencySymbol, + currentTab, + filtersList, + filterTabs, + initialSearch, + onAdd, + onAll, + onSearchChange, + onFilterAdd, + onFilterSave, + onTabChange, + onFilterDelete, + ...listProps +}) => ( + + + + + + + + + +); +ProductListCard.displayName = "ProductListCard"; +export default ProductListCard; diff --git a/src/products/components/ProductListCard/index.ts b/src/products/components/ProductListCard/index.ts new file mode 100644 index 000000000..995a575ae --- /dev/null +++ b/src/products/components/ProductListCard/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductListCard"; +export * from "./ProductListCard"; diff --git a/src/products/components/ProductListFilter/ProductListFilter.tsx b/src/products/components/ProductListFilter/ProductListFilter.tsx new file mode 100644 index 000000000..a9db1f5cf --- /dev/null +++ b/src/products/components/ProductListFilter/ProductListFilter.tsx @@ -0,0 +1,95 @@ +import * as React from "react"; + +import { FieldType, IFilter } from "@saleor/components/Filter"; +import FilterBar from "@saleor/components/FilterBar"; +import i18n from "@saleor/i18n"; +import { FilterProps } from "@saleor/types"; +import { StockAvailability } from "@saleor/types/globalTypes"; +import { ProductListUrlFilters } from "../../urls"; + +type ProductListFilterProps = FilterProps; + +export enum ProductFilterKeys { + published, + price, + priceEqual, + priceRange, + stock, + query +} +const filterMenu: IFilter = [ + { + children: [], + data: { + additionalText: i18n.t("is set as"), + fieldLabel: i18n.t("Status"), + options: [ + { + label: i18n.t("Visible"), + value: true + }, + { + label: i18n.t("Hidden"), + value: false + } + ], + type: FieldType.select + }, + label: i18n.t("Visibility"), + value: ProductFilterKeys.published.toString() + }, + { + children: [], + data: { + fieldLabel: i18n.t("Stock quantity"), + options: [ + { + label: i18n.t("Available"), + value: StockAvailability.IN_STOCK + }, + { + label: i18n.t("Out Of Stock"), + value: StockAvailability.OUT_OF_STOCK + } + ], + type: FieldType.select + }, + label: i18n.t("Stock"), + value: ProductFilterKeys.stock.toString() + }, + { + children: [ + { + children: [], + data: { + additionalText: i18n.t("equals"), + fieldLabel: null, + type: FieldType.price + }, + label: i18n.t("Specific Price"), + value: ProductFilterKeys.priceEqual.toString() + }, + { + children: [], + data: { + fieldLabel: i18n.t("Range"), + type: FieldType.rangePrice + }, + label: i18n.t("Range"), + value: ProductFilterKeys.priceRange.toString() + } + ], + data: { + fieldLabel: i18n.t("Price"), + type: FieldType.range + }, + label: i18n.t("Price"), + value: ProductFilterKeys.price.toString() + } +]; + +const ProductListFilter: React.FC = props => ( + +); +ProductListFilter.displayName = "ProductListFilter"; +export default ProductListFilter; diff --git a/src/products/components/ProductListFilter/index.ts b/src/products/components/ProductListFilter/index.ts new file mode 100644 index 000000000..c251bdbef --- /dev/null +++ b/src/products/components/ProductListFilter/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductListFilter"; +export * from "./ProductListFilter"; diff --git a/src/products/components/ProductOrganization/ProductOrganization.tsx b/src/products/components/ProductOrganization/ProductOrganization.tsx new file mode 100644 index 000000000..1081878db --- /dev/null +++ b/src/products/components/ProductOrganization/ProductOrganization.tsx @@ -0,0 +1,319 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardSpacer from "@saleor/components/CardSpacer"; +import CardTitle from "@saleor/components/CardTitle"; +import Chip from "@saleor/components/Chip"; +import { FormSpacer } from "@saleor/components/FormSpacer"; +import MultiAutocompleteSelectField from "@saleor/components/MultiAutocompleteSelectField"; +import SingleAutocompleteSelectField from "@saleor/components/SingleAutocompleteSelectField"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { ProductCreateData_productTypes_edges_node_productAttributes } from "../../types/ProductCreateData"; + +interface ChoiceType { + label: string; + value: string; +} +interface ProductType { + hasVariants: boolean; + id: string; + name: string; + productAttributes: ProductCreateData_productTypes_edges_node_productAttributes[]; +} + +const styles = (theme: Theme) => + createStyles({ + card: { + overflow: "visible" + }, + cardSubtitle: { + fontSize: "1rem", + marginBottom: theme.spacing.unit / 2 + }, + hr: { + backgroundColor: theme.overrides.MuiCard.root.borderColor, + border: "none", + height: 1, + margin: `0 -${theme.spacing.unit * 3}px ${theme.spacing.unit * 3}px` + }, + label: { + marginBottom: theme.spacing.unit / 2 + } + }); + +interface ProductOrganizationProps extends WithStyles { + canChangeType: boolean; + categories?: Array<{ value: string; label: string }>; + collections?: Array<{ value: string; label: string }>; + data: { + attributes: Array<{ + slug: string; + value: string; + }>; + category: ChoiceType; + collections: ChoiceType[]; + productType: { + label: string; + value: { + hasVariants: boolean; + id: string; + name: string; + productAttributes: ProductCreateData_productTypes_edges_node_productAttributes[]; + }; + }; + }; + disabled: boolean; + errors: { [key: string]: string }; + product?: { + productType?: { + hasVariants?: boolean; + name?: string; + }; + }; + productTypes?: ProductType[]; + fetchCategories: (query: string) => void; + fetchCollections: (query: string) => void; + onChange: (event: React.ChangeEvent, cb?: () => void) => void; +} + +const ProductOrganization = withStyles(styles, { name: "ProductOrganization" })( + ({ + canChangeType, + categories, + classes, + collections, + data, + disabled, + errors, + fetchCategories, + fetchCollections, + product, + productTypes, + onChange + }: ProductOrganizationProps) => { + const unrolledAttributes = maybe( + () => data.productType.value.productAttributes, + [] + ); + const getAttributeName = (slug: string) => { + const match = unrolledAttributes.find(a => a.slug === slug); + if (!match) { + return ""; + } + return match.name; + }; + const getAttributeValue = (slug: string) => { + if (unrolledAttributes.length > 0) { + const value = data.attributes.find(a => a.slug === slug); + const attributeMatch = unrolledAttributes.find(a => a.slug === slug); + if (!attributeMatch) { + return { + label: "", + value: "" + }; + } + const attributeValueMatch = attributeMatch.values.find( + v => v.slug === value.value + ); + const label = !!attributeValueMatch + ? attributeValueMatch.name + : value.value; + return { + label, + value + }; + } + return { + label: "", + value: "" + }; + }; + const getAttributeValues = (slug: string) => { + const match = unrolledAttributes.find(a => a.slug === slug); + if (match) { + return match.values; + } + + return []; + }; + const handleProductTypeSelect = ( + event: React.ChangeEvent<{ + name: string; + value: { + label: string; + value: ProductType; + }; + }> + ) => { + onChange(event, () => + onChange({ + ...event, + target: { + ...event.target, + name: "attributes", + value: event.target.value.value.productAttributes.map( + attribute => ({ + slug: attribute.slug, + value: "" + }) + ) + } + }) + ); + }; + const handleAttributeValueSelect = ( + event: React.ChangeEvent<{ + name: string; + value: { + label: string; + value: string; + }; + }> + ) => { + onChange({ + ...event, + target: { + ...event.target, + name: "attributes", + value: data.attributes.map(a => + a.slug === event.target.name + ? { slug: a.slug, value: event.target.value.value } + : a + ) + } + }); + }; + return ( + + + + {canChangeType ? ( + ({ label: pt.name, value: pt })) + : [] + } + value={data.productType} + onChange={handleProductTypeSelect} + /> + ) : ( + <> + + {i18n.t("Product Type")} + + + {maybe(() => product.productType.name, "...")} + + + + {i18n.t("Product Type")} + + + {maybe( + () => + product.productType.hasVariants + ? i18n.t("Configurable") + : i18n.t("Simple"), + "..." + )} + + + )} + {!(data && data.attributes && data.attributes.length === 0) ? ( + <> + + + {i18n.t("Attributes")} + +
    + + ) : ( + + )} + {data.attributes ? ( + data.attributes.map((item, index) => { + return ( + + ({ + label: v.name, + value: v.slug + }))} + custom + /> + + + ); + }) + ) : ( + + )} +
    + + +
    + + {({ deleteItem, items }) => ( + <> + +
    + {items.map(item => ( + deleteItem(item)} + /> + ))} +
    + + )} +
    +
    +
    + ); + } +); +ProductOrganization.displayName = "ProductOrganization"; +export default ProductOrganization; diff --git a/src/products/components/ProductOrganization/index.ts b/src/products/components/ProductOrganization/index.ts new file mode 100644 index 000000000..5ef78dde8 --- /dev/null +++ b/src/products/components/ProductOrganization/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductOrganization"; +export * from "./ProductOrganization"; diff --git a/src/products/components/ProductPricing/ProductPricing.tsx b/src/products/components/ProductPricing/ProductPricing.tsx new file mode 100644 index 000000000..41cb7b50a --- /dev/null +++ b/src/products/components/ProductPricing/ProductPricing.tsx @@ -0,0 +1,63 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import ControlledCheckbox from "@saleor/components/ControlledCheckbox"; +import PriceField from "@saleor/components/PriceField"; +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: "1fr 1fr" + } + }); + +interface ProductPricingProps extends WithStyles { + currency?: string; + data: { + chargeTaxes: boolean; + basePrice: number; + }; + disabled: boolean; + onChange: (event: React.ChangeEvent) => void; +} + +const ProductPricing = withStyles(styles, { name: "ProductPricing" })( + ({ classes, currency, data, disabled, onChange }: ProductPricingProps) => ( + + + + + +
    + +
    +
    +
    + ) +); +ProductPricing.displayName = "ProductPricing"; +export default ProductPricing; diff --git a/src/products/components/ProductPricing/index.ts b/src/products/components/ProductPricing/index.ts new file mode 100644 index 000000000..4a41ac8e5 --- /dev/null +++ b/src/products/components/ProductPricing/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductPricing"; +export * from "./ProductPricing"; diff --git a/src/products/components/ProductStock/ProductStock.tsx b/src/products/components/ProductStock/ProductStock.tsx new file mode 100644 index 000000000..f861b817c --- /dev/null +++ b/src/products/components/ProductStock/ProductStock.tsx @@ -0,0 +1,73 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { ProductDetails_product } from "../../types/ProductDetails"; + +const styles = (theme: Theme) => + createStyles({ + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: "1fr 1fr" + } + }); + +interface ProductStockProps extends WithStyles { + data: { + sku: string; + stockQuantity: number; + }; + disabled: boolean; + errors: { [key: string]: string }; + product: ProductDetails_product; + onChange: (event: React.ChangeEvent) => void; +} + +const ProductStock = withStyles(styles, { name: "ProductStock" })( + ({ classes, data, disabled, product, onChange, errors }: ProductStockProps) => ( + + + +
    + + product.variants[0].quantityAllocated) + }) + : undefined + } + /> +
    +
    +
    + ) +); +ProductStock.displayName = "ProductStock"; +export default ProductStock; diff --git a/src/products/components/ProductStock/index.ts b/src/products/components/ProductStock/index.ts new file mode 100644 index 000000000..f98d67440 --- /dev/null +++ b/src/products/components/ProductStock/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductStock"; +export * from "./ProductStock"; diff --git a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx new file mode 100644 index 000000000..6f1d6f0aa --- /dev/null +++ b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx @@ -0,0 +1,314 @@ +import { convertFromRaw, RawDraftContentState } from "draft-js"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import SeoForm from "@saleor/components/SeoForm"; +import VisibilityCard from "@saleor/components/VisibilityCard"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { ListActions, UserError } from "../../../types"; +import { + ProductDetails_product, + ProductDetails_product_attributes_attribute, + ProductDetails_product_images, + ProductDetails_product_variants +} from "../../types/ProductDetails"; +import ProductDetailsForm from "../ProductDetailsForm"; +import ProductImages from "../ProductImages"; +import ProductOrganization from "../ProductOrganization"; +import ProductPricing from "../ProductPricing"; +import ProductStock from "../ProductStock"; +import ProductVariants from "../ProductVariants"; + +interface ProductUpdateProps extends ListActions { + errors: UserError[]; + placeholderImage: string; + collections?: Array<{ + id: string; + name: string; + }>; + categories?: Array<{ + id: string; + name: string; + }>; + disabled?: boolean; + productCollections?: Array<{ + id: string; + name: string; + }>; + variants: ProductDetails_product_variants[]; + images?: ProductDetails_product_images[]; + product?: ProductDetails_product; + header: string; + saveButtonBarState: ConfirmButtonTransitionState; + fetchCategories: (query: string) => void; + fetchCollections: (query: string) => void; + onVariantShow: (id: string) => () => void; + onImageDelete: (id: string) => () => void; + onAttributesEdit: () => void; + onBack?(); + onDelete(); + onImageEdit?(id: string); + onImageReorder?(event: { oldIndex: number; newIndex: number }); + onImageUpload(file: File); + onProductShow?(); + onSeoClick?(); + onSubmit?(data: any); + onVariantAdd?(); +} + +interface ChoiceType { + label: string; + value: string; +} +export interface FormData { + attributes: Array<{ + slug: string; + value: string; + }>; + basePrice: number; + category: ChoiceType | null; + chargeTaxes: boolean; + collections: ChoiceType[]; + description: RawDraftContentState; + isPublished: boolean; + name: string; + productType: { + label: string; + value: { + hasVariants: boolean; + id: string; + name: string; + productAttributes: Array< + Exclude + >; + }; + } | null; + publicationDate: string; + seoDescription: string; + seoTitle: string; + sku: string; + stockQuantity: number; +} + +export const ProductUpdate: React.StatelessComponent = ({ + disabled, + categories: categoryChoiceList, + collections: collectionChoiceList, + errors: userErrors, + fetchCategories, + fetchCollections, + images, + header, + placeholderImage, + product, + productCollections, + saveButtonBarState, + variants, + onAttributesEdit, + onBack, + onDelete, + onImageDelete, + onImageEdit, + onImageReorder, + onImageUpload, + onSeoClick, + onSubmit, + onVariantAdd, + onVariantShow, + isChecked, + selected, + toggle, + toggleAll, + toolbar +}) => { + const initialData: FormData = { + attributes: maybe( + () => + product.attributes.map(a => ({ + slug: a.attribute.slug, + value: a.value ? a.value.slug : null + })), + [] + ), + basePrice: maybe(() => product.basePrice.amount), + category: maybe(() => ({ + label: product.category.name, + value: product.category.id + })), + chargeTaxes: maybe(() => product.chargeTaxes, false), + collections: productCollections + ? productCollections.map(collection => ({ + label: collection.name, + value: collection.id + })) + : [], + description: maybe(() => JSON.parse(product.descriptionJson)), + isPublished: maybe(() => product.isPublished, false), + name: maybe(() => product.name), + productType: maybe(() => ({ + label: product.productType.name, + value: { + hasVariants: product.productType.hasVariants, + id: product.productType.id, + name: product.productType.name, + productAttributes: product.attributes.map(a => a.attribute) + } + })), + publicationDate: maybe(() => product.publicationDate), + seoDescription: maybe(() => product.seoDescription) || "", + seoTitle: maybe(() => product.seoTitle) || "", + sku: maybe(() => + product.productType.hasVariants + ? undefined + : variants && variants[0] + ? variants[0].sku + : undefined + ), + stockQuantity: maybe(() => + product.productType.hasVariants + ? undefined + : variants && variants[0] + ? variants[0].quantity + : undefined + ) + }; + const categories = + categoryChoiceList !== undefined + ? categoryChoiceList.map(category => ({ + label: category.name, + value: category.id + })) + : []; + const collections = + collectionChoiceList !== undefined + ? collectionChoiceList.map(collection => ({ + label: collection.name, + value: collection.id + })) + : []; + const currency = + product && product.basePrice ? product.basePrice.currency : undefined; + const hasVariants = + product && product.productType && product.productType.hasVariants; + + return ( +
    + {({ change, data, errors, hasChanged, submit }) => ( + <> + + {i18n.t("Products")} + + +
    + + + + + + + {hasVariants ? ( + + ) : ( + + )} + + + convertFromRaw(data.description) + .getPlainText() + .slice(0, 300) + )} + loading={disabled} + onClick={onSeoClick} + onChange={change} + /> +
    +
    + + + +
    +
    + +
    + + )} +
    + ); +}; +ProductUpdate.displayName = "ProductUpdate"; +export default ProductUpdate; diff --git a/src/products/components/ProductUpdatePage/index.ts b/src/products/components/ProductUpdatePage/index.ts new file mode 100644 index 000000000..0eb59fe6a --- /dev/null +++ b/src/products/components/ProductUpdatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductUpdatePage"; +export * from "./ProductUpdatePage"; diff --git a/src/products/components/ProductVariantAttributes/ProductVariantAttributes.tsx b/src/products/components/ProductVariantAttributes/ProductVariantAttributes.tsx new file mode 100644 index 000000000..06a49a06c --- /dev/null +++ b/src/products/components/ProductVariantAttributes/ProductVariantAttributes.tsx @@ -0,0 +1,139 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import SingleAutocompleteSelectField from "@saleor/components/SingleAutocompleteSelectField"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { ProductVariant_attributes_attribute } from "../../types/ProductVariant"; + +const styles = (theme: Theme) => + createStyles({ + card: { + overflow: "visible" + }, + grid: { + display: "grid", + gridColumnGap: `${theme.spacing.unit * 2}px`, + gridRowGap: `${theme.spacing.unit * 3}px`, + gridTemplateColumns: "1fr 1fr" + } + }); + +interface ProductVariantAttributesProps extends WithStyles { + attributes?: ProductVariant_attributes_attribute[]; + data: { + attributes?: Array<{ + slug: string; + value: string; + }>; + }; + disabled: boolean; + onChange: ( + event: React.ChangeEvent<{ + name: string; + value: Array<{ + slug: string; + value: string; + }>; + }> + ) => void; +} + +const ProductVariantAttributes = withStyles(styles, { + name: "ProductVariantAttributes" +})( + ({ + attributes, + classes, + data, + disabled, + onChange + }: ProductVariantAttributesProps) => { + return ( + + + + {attributes === undefined ? ( + + ) : ( + attributes.map((item, index) => { + const getAttributeValue = (slug: string) => { + const valueMatches = attributes.filter(a => a.slug === slug); + if (valueMatches.length > 0) { + const value = data.attributes.filter(a => a.slug === slug)[0] + .value; + const labelMatches = valueMatches[0].values.filter( + v => v.slug === value + ); + const label = + labelMatches.length > 0 ? labelMatches[0].name : value; + return { + label, + value + }; + } + return { + label: "", + value: "" + }; + }; + const getAttributeValues = (slug: string) => { + const matches = attributes.filter(a => a.slug === slug); + return matches.length > 0 + ? matches[0].values.map(v => ({ + label: v.name, + value: v.slug + })) + : []; + }; + const handleAttributeValueSelect = ( + event: React.ChangeEvent<{ + name: string; + value: { + label: string; + value: string; + }; + }> + ) => + onChange({ + ...(event as any), + target: { + ...event.target, + name: "attributes", + value: data.attributes.map(a => + a.slug === event.target.name + ? { slug: a.slug, value: event.target.value.value } + : a + ) + } + }); + + return ( + + ); + }) + )} + + + ); + } +); +ProductVariantAttributes.displayName = "ProductVariantAttributes"; +export default ProductVariantAttributes; diff --git a/src/products/components/ProductVariantAttributes/index.ts b/src/products/components/ProductVariantAttributes/index.ts new file mode 100644 index 000000000..e8ffccfe7 --- /dev/null +++ b/src/products/components/ProductVariantAttributes/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariantAttributes"; +export * from "./ProductVariantAttributes"; diff --git a/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx b/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx new file mode 100644 index 000000000..b865a7b3d --- /dev/null +++ b/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx @@ -0,0 +1,130 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { UserError } from "../../../types"; +import { ProductVariantCreateData_product } from "../../types/ProductVariantCreateData"; +import ProductVariantAttributes from "../ProductVariantAttributes"; +import ProductVariantNavigation from "../ProductVariantNavigation"; +import ProductVariantPrice from "../ProductVariantPrice"; +import ProductVariantStock from "../ProductVariantStock"; + +interface FormData { + attributes?: Array<{ + slug: string; + value: string; + }>; + costPrice?: string; + images?: string[]; + priceOverride?: string; + quantity?: number; + sku?: string; +} + +interface ProductVariantCreatePageProps { + currencySymbol: string; + errors: UserError[]; + header: string; + loading: boolean; + product: ProductVariantCreateData_product; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onSubmit: (data: FormData) => void; + onVariantClick: (variantId: string) => void; +} + +const ProductVariantCreatePage: React.StatelessComponent< + ProductVariantCreatePageProps +> = ({ + currencySymbol, + errors: formErrors, + loading, + header, + product, + saveButtonBarState, + onBack, + onSubmit, + onVariantClick +}) => { + const initialForm = { + attributes: maybe(() => + product.productType.variantAttributes.map(attribute => ({ + slug: attribute.slug, + value: "" + })) + ), + costPrice: "", + images: maybe(() => product.images.map(image => image.id)), + priceOverride: "", + quantity: 0, + sku: "" + }; + return ( +
    + {({ change, data, errors, hasChanged, submit }) => ( + + {maybe(() => product.name)} + + +
    + product.thumbnail.url)} + variants={maybe(() => product.variants)} + onRowClick={(variantId: string) => { + if (product && product.variants) { + return onVariantClick(variantId); + } + }} + /> +
    +
    + product.productType.variantAttributes)} + data={data} + disabled={loading} + onChange={change} + /> + + + + +
    +
    + +
    + )} +
    + ); +}; +ProductVariantCreatePage.displayName = "ProductVariantCreatePage"; +export default ProductVariantCreatePage; diff --git a/src/products/components/ProductVariantCreatePage/index.ts b/src/products/components/ProductVariantCreatePage/index.ts new file mode 100644 index 000000000..91493fd60 --- /dev/null +++ b/src/products/components/ProductVariantCreatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariantCreatePage"; +export * from "./ProductVariantCreatePage"; diff --git a/src/products/components/ProductVariantDeleteDialog/ProductVariantDeleteDialog.tsx b/src/products/components/ProductVariantDeleteDialog/ProductVariantDeleteDialog.tsx new file mode 100644 index 000000000..73569e58e --- /dev/null +++ b/src/products/components/ProductVariantDeleteDialog/ProductVariantDeleteDialog.tsx @@ -0,0 +1,82 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + deleteButton: { + "&:hover": { + backgroundColor: theme.palette.error.main + }, + backgroundColor: theme.palette.error.main, + color: theme.palette.error.contrastText + } + }); + +export interface ProductVariantDeleteDialogProps + extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + open: boolean; + name: string; + onClose?(); + onConfirm?(); +} + +const ProductVariantDeleteDialog = withStyles(styles, { + name: "ProductVariantDeleteDialog" +})( + ({ + classes, + confirmButtonState, + name, + open, + onConfirm, + onClose + }: ProductVariantDeleteDialogProps) => ( + + + {i18n.t("Delete variant", { context: "title" })} + + + {{name}}?", + { name } + ) + }} + /> + + + + + {i18n.t("Delete variant", { context: "button" })} + + + + ) +); +ProductVariantDeleteDialog.displayName = "ProductVariantDeleteDialog"; +export default ProductVariantDeleteDialog; diff --git a/src/products/components/ProductVariantDeleteDialog/index.ts b/src/products/components/ProductVariantDeleteDialog/index.ts new file mode 100644 index 000000000..2310ca8b9 --- /dev/null +++ b/src/products/components/ProductVariantDeleteDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariantDeleteDialog"; +export * from "./ProductVariantDeleteDialog"; diff --git a/src/products/components/ProductVariantImageSelectDialog/ProductVariantImageSelectDialog.tsx b/src/products/components/ProductVariantImageSelectDialog/ProductVariantImageSelectDialog.tsx new file mode 100644 index 000000000..19c5bde55 --- /dev/null +++ b/src/products/components/ProductVariantImageSelectDialog/ProductVariantImageSelectDialog.tsx @@ -0,0 +1,107 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as classNames from "classnames"; +import * as React from "react"; + +import i18n from "../../../i18n"; +import { ProductImage } from "../../types/ProductImage"; + +const styles = (theme: Theme) => + createStyles({ + image: { + height: "100%", + objectFit: "contain", + userSelect: "none", + width: "100%" + }, + imageContainer: { + background: "#ffffff", + border: "1px solid #eaeaea", + borderRadius: theme.spacing.unit, + cursor: "pointer", + height: theme.spacing.unit * 21.5, + overflow: "hidden", + padding: theme.spacing.unit * 2, + position: "relative", + transitionDuration: theme.transitions.duration.standard + "ms" + }, + root: { + display: "grid", + gridColumnGap: `${theme.spacing.unit * 2}px`, + gridRowGap: `${theme.spacing.unit * 2}px`, + gridTemplateColumns: "repeat(3, 1fr)", + maxWidth: "100%", + width: theme.breakpoints.values.lg, + [theme.breakpoints.down("sm")]: { + gridTemplateColumns: "repeat(2, 1fr)" + } + }, + selectedImageContainer: { + borderColor: theme.palette.primary.main + } + }); + +interface ProductVariantImageSelectDialogProps + extends WithStyles { + images?: ProductImage[]; + selectedImages?: string[]; + open: boolean; + onClose(); + onImageSelect(id: string); +} + +const ProductVariantImageSelectDialog = withStyles(styles, { + name: "ProductVariantImageSelectDialog" +})( + ({ + classes, + images, + open, + selectedImages, + onClose, + onImageSelect + }: ProductVariantImageSelectDialogProps) => ( + + + {i18n.t("Image selection", { context: "title" })} + + +
    + {images + .sort((prev, next) => (prev.sortOrder > next.sortOrder ? 1 : -1)) + .map(tile => ( +
    + +
    + ))} +
    +
    + + + +
    + ) +); +ProductVariantImageSelectDialog.displayName = "ProductVariantImageSelectDialog"; +export default ProductVariantImageSelectDialog; diff --git a/src/products/components/ProductVariantImageSelectDialog/index.ts b/src/products/components/ProductVariantImageSelectDialog/index.ts new file mode 100644 index 000000000..91232d9cb --- /dev/null +++ b/src/products/components/ProductVariantImageSelectDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariantImageSelectDialog"; +export * from "./ProductVariantImageSelectDialog"; diff --git a/src/products/components/ProductVariantImages/ProductVariantImages.tsx b/src/products/components/ProductVariantImages/ProductVariantImages.tsx new file mode 100644 index 000000000..b111281cb --- /dev/null +++ b/src/products/components/ProductVariantImages/ProductVariantImages.tsx @@ -0,0 +1,94 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { ProductImage } from "../../types/ProductImage"; + +const styles = (theme: Theme) => + createStyles({ + gridElement: { + "& img": { + width: "100%" + } + }, + helpText: { + gridColumnEnd: "span 4" + }, + image: { + height: "100%", + objectFit: "contain", + width: "100%" + }, + imageContainer: { + background: "#ffffff", + border: "1px solid #eaeaea", + borderRadius: theme.spacing.unit, + height: theme.spacing.unit * 17.5, + marginBottom: theme.spacing.unit * 2, + padding: theme.spacing.unit * 2 + }, + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: "repeat(4, 1fr)" + } + }); + +interface ProductVariantImagesProps extends WithStyles { + images?: ProductImage[]; + placeholderImage?: string; + disabled: boolean; + onImageAdd(); +} + +export const ProductVariantImages = withStyles(styles, { + name: "ProductVariantImages" +})(({ classes, disabled, images, onImageAdd }: ProductVariantImagesProps) => ( + + + {i18n.t("Choose photos")} + + } + /> + +
    + {images === undefined || images === null ? ( + + ) : images.length > 0 ? ( + images + .sort((prev, next) => (prev.sortOrder > next.sortOrder ? 1 : -1)) + .map(tile => ( +
    + +
    + )) + ) : ( + + {i18n.t("Select a specific variant image from product images")} + + )} +
    +
    +
    +)); +ProductVariantImages.displayName = "ProductVariantImages"; +export default ProductVariantImages; diff --git a/src/products/components/ProductVariantImages/index.ts b/src/products/components/ProductVariantImages/index.ts new file mode 100644 index 000000000..cd0ac0f9f --- /dev/null +++ b/src/products/components/ProductVariantImages/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariantImages"; +export * from "./ProductVariantImages"; diff --git a/src/products/components/ProductVariantNavigation/ProductVariantNavigation.tsx b/src/products/components/ProductVariantNavigation/ProductVariantNavigation.tsx new file mode 100644 index 000000000..34efe0235 --- /dev/null +++ b/src/products/components/ProductVariantNavigation/ProductVariantNavigation.tsx @@ -0,0 +1,122 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import * as classNames from "classnames"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ProductVariantCreateData_product_variants } from "../../types/ProductVariantCreateData"; +import { ProductVariantDetails_productVariant } from "../../types/ProductVariantDetails"; + +const styles = (theme: Theme) => + createStyles({ + link: { + cursor: "pointer" + }, + tabActive: { + "&:before": { + background: theme.palette.primary.main, + content: '""', + height: "100%", + left: 0, + position: "absolute", + top: 0, + width: 2 + }, + position: "relative" + }, + textLeft: { + textAlign: [["left"], "!important"] as any + } + }); + +interface ProductVariantNavigationProps extends WithStyles { + current?: string; + fallbackThumbnail: string; + variants: + | ProductVariantDetails_productVariant[] + | ProductVariantCreateData_product_variants[]; + onAdd?: () => void; + onRowClick: (variantId: string) => void; +} + +const ProductVariantNavigation = withStyles(styles, { + name: "ProductVariantNavigation" +})( + ({ + classes, + current, + fallbackThumbnail, + variants, + onAdd, + onRowClick + }: ProductVariantNavigationProps) => ( + + + + + {renderCollection( + variants, + variant => ( + onRowClick(variant.id) : undefined} + > + variant.images[0].url, + fallbackThumbnail + )} + /> + + {variant ? variant.name || variant.sku : } + + + ), + () => ( + + {i18n.t("This product has no variants")} + + ) + )} + {onAdd ? ( + + + + + + ) : ( + + + + {i18n.t("New Variant")} + + + )} + +
    +
    + ) +); +ProductVariantNavigation.displayName = "ProductVariantNavigation"; +export default ProductVariantNavigation; diff --git a/src/products/components/ProductVariantNavigation/index.ts b/src/products/components/ProductVariantNavigation/index.ts new file mode 100644 index 000000000..00e2930d8 --- /dev/null +++ b/src/products/components/ProductVariantNavigation/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariantNavigation"; +export * from "./ProductVariantNavigation"; diff --git a/src/products/components/ProductVariantPage/ProductVariantPage.tsx b/src/products/components/ProductVariantPage/ProductVariantPage.tsx new file mode 100644 index 000000000..90caa1290 --- /dev/null +++ b/src/products/components/ProductVariantPage/ProductVariantPage.tsx @@ -0,0 +1,183 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import { maybe } from "../../../misc"; +import { UserError } from "../../../types"; +import { ProductVariant } from "../../types/ProductVariant"; +import ProductVariantAttributes from "../ProductVariantAttributes"; +import ProductVariantImages from "../ProductVariantImages"; +import ProductVariantImageSelectDialog from "../ProductVariantImageSelectDialog"; +import ProductVariantNavigation from "../ProductVariantNavigation"; +import ProductVariantPrice from "../ProductVariantPrice"; +import ProductVariantStock from "../ProductVariantStock"; + +interface ProductVariantPageProps { + variant?: ProductVariant; + errors: UserError[]; + saveButtonBarState: ConfirmButtonTransitionState; + loading?: boolean; + placeholderImage?: string; + header: string; + onAdd(); + onBack(); + onDelete(); + onSubmit(data: any); + onImageSelect(id: string); + onVariantClick(variantId: string); +} + +const ProductVariantPage: React.StatelessComponent = ({ + errors: formErrors, + loading, + header, + placeholderImage, + saveButtonBarState, + variant, + onAdd, + onBack, + onDelete, + onImageSelect, + onSubmit, + onVariantClick +}) => { + const [isModalOpened, setModalStatus] = React.useState(false); + const toggleModal = () => setModalStatus(!isModalOpened); + + const variantImages = variant ? variant.images.map(image => image.id) : []; + const productImages = variant + ? variant.product.images.sort((prev, next) => + prev.sortOrder > next.sortOrder ? 1 : -1 + ) + : undefined; + const images = productImages + ? productImages + .filter(image => variantImages.indexOf(image.id) !== -1) + .sort((prev, next) => (prev.sortOrder > next.sortOrder ? 1 : -1)) + : undefined; + return ( + <> + + + {maybe(() => variant.product.name)} + + +
    ({ + slug: a.attribute.slug, + value: a.value.slug + })) + : [], + costPrice: + variant && variant.costPrice + ? variant.costPrice.amount.toString() + : null, + priceOverride: + variant && variant.priceOverride + ? variant.priceOverride.amount.toString() + : null, + quantity: variant && variant.quantity ? variant.quantity : "", + sku: variant && variant.sku + }} + errors={formErrors} + onSubmit={onSubmit} + confirmLeave + > + {({ change, data, errors, hasChanged, submit }) => ( + <> + +
    + variant.product.thumbnail.url + )} + variants={maybe(() => variant.product.variants)} + onAdd={onAdd} + onRowClick={(variantId: string) => { + if (variant) { + return onVariantClick(variantId); + } + }} + /> +
    +
    + a.attribute) + : undefined + } + data={data} + disabled={loading} + onChange={change} + /> + + + + + + +
    +
    + + + )} + +
    + {variant && ( + variant.images.map(image => image.id))} + /> + )} + + ); +}; +ProductVariantPage.displayName = "ProductVariantPage"; +export default ProductVariantPage; diff --git a/src/products/components/ProductVariantPage/index.ts b/src/products/components/ProductVariantPage/index.ts new file mode 100644 index 000000000..3e9311e1d --- /dev/null +++ b/src/products/components/ProductVariantPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariantPage"; +export * from "./ProductVariantPage"; diff --git a/src/products/components/ProductVariantPrice/ProductVariantPrice.tsx b/src/products/components/ProductVariantPrice/ProductVariantPrice.tsx new file mode 100644 index 000000000..7166242bf --- /dev/null +++ b/src/products/components/ProductVariantPrice/ProductVariantPrice.tsx @@ -0,0 +1,81 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import PriceField from "@saleor/components/PriceField"; +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + grid: { + display: "grid", + gridColumnGap: `${theme.spacing.unit * 2}px`, + gridTemplateColumns: "1fr 1fr" + } + }); + +interface ProductVariantPriceProps extends WithStyles { + currencySymbol?: string; + priceOverride?: string; + costPrice?: string; + errors: { [key: string]: string }; + loading?: boolean; + onChange(event: any); +} + +const ProductVariantPrice = withStyles(styles, { name: "ProductVariantPrice" })( + ({ + classes, + currencySymbol, + costPrice, + errors, + priceOverride, + loading, + onChange + }: ProductVariantPriceProps) => ( + + + +
    +
    + +
    +
    + +
    +
    +
    +
    + ) +); +ProductVariantPrice.displayName = "ProductVariantPrice"; +export default ProductVariantPrice; diff --git a/src/products/components/ProductVariantPrice/index.ts b/src/products/components/ProductVariantPrice/index.ts new file mode 100644 index 000000000..104957ff1 --- /dev/null +++ b/src/products/components/ProductVariantPrice/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariantPrice"; +export * from "./ProductVariantPrice"; diff --git a/src/products/components/ProductVariantStock/ProductVariantStock.tsx b/src/products/components/ProductVariantStock/ProductVariantStock.tsx new file mode 100644 index 000000000..9e07de8b6 --- /dev/null +++ b/src/products/components/ProductVariantStock/ProductVariantStock.tsx @@ -0,0 +1,89 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; + +const styles = (theme: Theme) => + createStyles({ + grid: { + display: "grid", + gridColumnGap: `${theme.spacing.unit * 2}px`, + gridTemplateColumns: "1fr 1fr" + } + }); + +interface ProductVariantStockProps extends WithStyles { + errors: { + quantity?: string; + sku?: string; + }; + sku: string; + quantity: number; + stockAllocated?: number; + loading?: boolean; + onChange(event: any); +} + +const ProductVariantStock = withStyles(styles, { name: "ProductVariantStock" })( + ({ + classes, + errors, + sku, + quantity, + stockAllocated, + loading, + onChange + }: ProductVariantStockProps) => ( + + + +
    +
    + +
    +
    + +
    +
    +
    +
    + ) +); +ProductVariantStock.displayName = "ProductVariantStock"; +export default ProductVariantStock; diff --git a/src/products/components/ProductVariantStock/index.ts b/src/products/components/ProductVariantStock/index.ts new file mode 100644 index 000000000..0cb07fabd --- /dev/null +++ b/src/products/components/ProductVariantStock/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariantStock"; +export * from "./ProductVariantStock"; diff --git a/src/products/components/ProductVariants/ProductVariants.tsx b/src/products/components/ProductVariants/ProductVariants.tsx new file mode 100644 index 000000000..389834ac2 --- /dev/null +++ b/src/products/components/ProductVariants/ProductVariants.tsx @@ -0,0 +1,203 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Hidden from "@material-ui/core/Hidden"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Checkbox from "@saleor/components/Checkbox"; +import Money from "@saleor/components/Money"; +import Skeleton from "@saleor/components/Skeleton"; +import StatusLabel from "@saleor/components/StatusLabel"; +import TableHead from "@saleor/components/TableHead"; +import i18n from "../../../i18n"; +import { renderCollection } from "../../../misc"; +import { ListActions } from "../../../types"; +import { ProductDetails_product_variants } from "../../types/ProductDetails"; +import { ProductVariant_costPrice } from "../../types/ProductVariant"; + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colName: {}, + colPrice: { + width: 200 + }, + colSku: { + width: 250 + }, + colStatus: { + width: 200 + } + }, + colName: {}, + colPrice: { + textAlign: "right" + }, + colSku: {}, + colStatus: {}, + denseTable: { + "& td, & th": { + paddingRight: theme.spacing.unit * 3 + } + }, + link: { + cursor: "pointer" + }, + textLeft: { + textAlign: "left" as "left" + }, + textRight: { + textAlign: "right" as "right" + } + }); + +interface ProductVariantsProps extends ListActions, WithStyles { + disabled: boolean; + variants: ProductDetails_product_variants[]; + fallbackPrice?: ProductVariant_costPrice; + onAttributesEdit: () => void; + onRowClick: (id: string) => () => void; + onVariantAdd?(); +} + +export const ProductVariants = withStyles(styles, { name: "ProductVariants" })( + ({ + classes, + disabled, + variants, + fallbackPrice, + onAttributesEdit, + onRowClick, + onVariantAdd, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: ProductVariantsProps) => ( + + + + + + } + /> + + + {i18n.t( + "Use variants for products that come in a variety of versions for example different sizes or colors" + )} + + + + + {i18n.t("Name")} + + {i18n.t("Status")} + + {i18n.t("SKU")} + + + {i18n.t("Price")} + + + + + {renderCollection( + variants, + variant => { + const isSelected = variant ? isChecked(variant.id) : false; + + return ( + + + toggle(variant.id)} + /> + + + {variant ? variant.name || variant.sku : } + + + {variant ? ( + 0 ? "success" : "error"} + label={ + variant.stockQuantity > 0 + ? i18n.t("Available") + : i18n.t("Unavailable") + } + /> + ) : ( + + )} + + + {variant ? variant.sku : } + + + + {variant ? ( + variant.priceOverride ? ( + + ) : fallbackPrice ? ( + + ) : ( + + ) + ) : ( + + )} + + + + ); + }, + () => ( + + + {i18n.t("This product has no variants")} + + + ) + )} + +
    +
    + ) +); +ProductVariants.displayName = "ProductVariants"; +export default ProductVariants; diff --git a/src/products/components/ProductVariants/index.ts b/src/products/components/ProductVariants/index.ts new file mode 100644 index 000000000..f62aea928 --- /dev/null +++ b/src/products/components/ProductVariants/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductVariants"; +export * from "./ProductVariants"; diff --git a/src/products/containers/ProductImagesReorder.tsx b/src/products/containers/ProductImagesReorder.tsx new file mode 100644 index 000000000..3a9cd2d7b --- /dev/null +++ b/src/products/containers/ProductImagesReorder.tsx @@ -0,0 +1,57 @@ +import * as React from "react"; + +import { TypedMutationInnerProps } from "../../mutations"; +import { TypedProductImagesReorder } from "../mutations"; +import { + ProductImageReorder, + ProductImageReorderVariables +} from "../types/ProductImageReorder"; + +interface ProductImagesReorderProviderProps + extends TypedMutationInnerProps< + ProductImageReorder, + ProductImageReorderVariables + > { + productId: string; + productImages: Array<{ + id: string; + url: string; + }>; +} + +const ProductImagesReorderProvider: React.StatelessComponent< + ProductImagesReorderProviderProps +> = ({ children, productId, productImages, ...mutationProps }) => ( + + {(mutate, mutationResult) => + children(opts => { + const productImagesMap = productImages.reduce((prev, curr) => { + prev[curr.id] = curr; + return prev; + }, {}); + const newProductImages = opts.variables.imagesIds.map((id, index) => ({ + __typename: "ProductImage", + ...productImagesMap[id], + sortOrder: index + })); + const optimisticResponse: typeof mutationResult["data"] = { + productImageReorder: { + __typename: "ProductImageReorder", + errors: null, + product: { + __typename: "Product", + id: productId, + images: newProductImages + } + } + }; + return mutate({ + ...opts, + optimisticResponse + }); + }, mutationResult) + } + +); + +export default ProductImagesReorderProvider; diff --git a/src/products/containers/ProductUpdateOperations.tsx b/src/products/containers/ProductUpdateOperations.tsx new file mode 100644 index 000000000..e00558c41 --- /dev/null +++ b/src/products/containers/ProductUpdateOperations.tsx @@ -0,0 +1,155 @@ +import * as React from "react"; + +import { getMutationProviderData, maybe } from "../../misc"; +import { PartialMutationProviderOutput } from "../../types"; +import { + TypedProductDeleteMutation, + TypedProductImageCreateMutation, + TypedProductImageDeleteMutation, + TypedProductUpdateMutation, + TypedProductVariantBulkDeleteMutation, + TypedSimpleProductUpdateMutation +} from "../mutations"; +import { ProductDelete, ProductDeleteVariables } from "../types/ProductDelete"; +import { ProductDetails_product } from "../types/ProductDetails"; +import { + ProductImageCreate, + ProductImageCreateVariables +} from "../types/ProductImageCreate"; +import { + ProductImageDelete, + ProductImageDeleteVariables +} from "../types/ProductImageDelete"; +import { + ProductImageReorder, + ProductImageReorderVariables +} from "../types/ProductImageReorder"; +import { ProductUpdate, ProductUpdateVariables } from "../types/ProductUpdate"; +import { + ProductVariantBulkDelete, + ProductVariantBulkDeleteVariables +} from "../types/ProductVariantBulkDelete"; +import { + SimpleProductUpdate, + SimpleProductUpdateVariables +} from "../types/SimpleProductUpdate"; +import ProductImagesReorderProvider from "./ProductImagesReorder"; + +interface ProductUpdateOperationsProps { + product: ProductDetails_product; + children: (props: { + bulkProductVariantDelete: PartialMutationProviderOutput< + ProductVariantBulkDelete, + ProductVariantBulkDeleteVariables + >; + createProductImage: PartialMutationProviderOutput< + ProductImageCreate, + ProductImageCreateVariables + >; + deleteProduct: PartialMutationProviderOutput< + ProductDelete, + ProductDeleteVariables + >; + deleteProductImage: PartialMutationProviderOutput< + ProductImageDelete, + ProductImageDeleteVariables + >; + reorderProductImages: PartialMutationProviderOutput< + ProductImageReorder, + ProductImageReorderVariables + >; + updateProduct: PartialMutationProviderOutput< + ProductUpdate, + ProductUpdateVariables + >; + updateSimpleProduct: PartialMutationProviderOutput< + SimpleProductUpdate, + SimpleProductUpdateVariables + >; + }) => React.ReactNode; + onBulkProductVariantDelete?: (data: ProductVariantBulkDelete) => void; + onDelete?: (data: ProductDelete) => void; + onImageCreate?: (data: ProductImageCreate) => void; + onImageDelete?: (data: ProductImageDelete) => void; + onImageReorder?: (data: ProductImageReorder) => void; + onUpdate?: (data: ProductUpdate) => void; +} + +const ProductUpdateOperations: React.StatelessComponent< + ProductUpdateOperationsProps +> = ({ + product, + children, + onBulkProductVariantDelete, + onDelete, + onImageDelete, + onImageCreate, + onImageReorder, + onUpdate +}) => { + const productId = product ? product.id : ""; + return ( + + {(...updateProduct) => ( + product.images, [])} + onCompleted={onImageReorder} + > + {(...reorderProductImages) => ( + + {(...createProductImage) => ( + + {(...deleteProduct) => ( + + {(...deleteProductImage) => ( + + {(...updateSimpleProduct) => ( + + {(...bulkProductVariantDelete) => + children({ + bulkProductVariantDelete: getMutationProviderData( + ...bulkProductVariantDelete + ), + createProductImage: getMutationProviderData( + ...createProductImage + ), + deleteProduct: getMutationProviderData( + ...deleteProduct + ), + deleteProductImage: getMutationProviderData( + ...deleteProductImage + ), + reorderProductImages: getMutationProviderData( + ...reorderProductImages + ), + updateProduct: getMutationProviderData( + ...updateProduct + ), + updateSimpleProduct: getMutationProviderData( + ...updateSimpleProduct + ) + }) + } + + )} + + )} + + )} + + )} + + )} + + )} + + ); +}; +export default ProductUpdateOperations; diff --git a/src/products/containers/ProductVariantOperations.tsx b/src/products/containers/ProductVariantOperations.tsx new file mode 100644 index 000000000..a636ac989 --- /dev/null +++ b/src/products/containers/ProductVariantOperations.tsx @@ -0,0 +1,77 @@ +import * as React from "react"; + +import { getMutationProviderData } from "../../misc"; +import { PartialMutationProviderOutput } from "../../types"; +import { + TypedVariantDeleteMutation, + TypedVariantImageAssignMutation, + TypedVariantImageUnassignMutation, + TypedVariantUpdateMutation +} from "../mutations"; +import { VariantDelete, VariantDeleteVariables } from "../types/VariantDelete"; +import { + VariantImageAssign, + VariantImageAssignVariables +} from "../types/VariantImageAssign"; +import { + VariantImageUnassign, + VariantImageUnassignVariables +} from "../types/VariantImageUnassign"; +import { VariantUpdate, VariantUpdateVariables } from "../types/VariantUpdate"; + +interface VariantDeleteOperationsProps { + children: ( + props: { + deleteVariant: PartialMutationProviderOutput< + VariantDelete, + VariantDeleteVariables + >; + updateVariant: PartialMutationProviderOutput< + VariantUpdate, + VariantUpdateVariables + >; + assignImage: PartialMutationProviderOutput< + VariantImageAssign, + VariantImageAssignVariables + >; + unassignImage: PartialMutationProviderOutput< + VariantImageUnassign, + VariantImageUnassignVariables + >; + } + ) => React.ReactNode; + onDelete?: (data: VariantDelete) => void; + onImageAssign?: (data: VariantImageAssign) => void; + onImageUnassign?: (data: VariantImageUnassign) => void; + onUpdate?: (data: VariantUpdate) => void; +} + +const VariantUpdateOperations: React.StatelessComponent< + VariantDeleteOperationsProps +> = ({ children, onDelete, onUpdate, onImageAssign, onImageUnassign }) => { + return ( + + {(...assignImage) => ( + + {(...unassignImage) => ( + + {(...updateVariant) => ( + + {(...deleteVariant) => + children({ + assignImage: getMutationProviderData(...assignImage), + deleteVariant: getMutationProviderData(...deleteVariant), + unassignImage: getMutationProviderData(...unassignImage), + updateVariant: getMutationProviderData(...updateVariant) + }) + } + + )} + + )} + + )} + + ); +}; +export default VariantUpdateOperations; diff --git a/src/products/fixtures.ts b/src/products/fixtures.ts new file mode 100644 index 000000000..2fc48bc95 --- /dev/null +++ b/src/products/fixtures.ts @@ -0,0 +1,2424 @@ +import { content } from "../storybook/stories/components/RichTextEditor"; +import { ProductDetails_product } from "./types/ProductDetails"; +import { ProductVariant } from "./types/ProductVariant"; +import { ProductVariantCreateData_product } from "./types/ProductVariantCreateData"; + +export const product: ( + placeholderImage: string +) => ProductDetails_product & + ProductVariantCreateData_product = placeholderImage => ({ + __typename: "Product", + attributes: [ + { + __typename: "SelectedAttribute", + attribute: { + __typename: "Attribute", + id: "pta18161", + name: "Borders", + slug: "Borders", + sortNumber: 0, + values: [ + { + __typename: "AttributeValue", + id: "ptav47282", + name: "portals", + slug: "portals", + sortNumber: 0 + }, + { + __typename: "AttributeValue", + id: "ptav17253", + name: "Baht", + slug: "Baht", + sortNumber: 1 + } + ] + }, + value: { + __typename: "AttributeValue", + id: "ptav47282", + name: "portals", + slug: "portals", + sortNumber: 0 + } + }, + { + __typename: "SelectedAttribute", + attribute: { + __typename: "Attribute", + id: "pta22785", + name: "Legacy", + slug: "Legacy", + sortNumber: 1, + values: [ + { + __typename: "AttributeValue", + id: "ptav31282", + name: "payment", + slug: "payment", + sortNumber: 0 + }, + { + __typename: "AttributeValue", + id: "ptav14907", + name: "Auto Loan Account", + slug: "Auto-Loan-Account", + sortNumber: 1 + }, + { + __typename: "AttributeValue", + id: "ptav27366", + name: "Garden", + slug: "Garden", + sortNumber: 2 + }, + { + __typename: "AttributeValue", + id: "ptav11873", + name: "override", + slug: "override", + sortNumber: 3 + } + ] + }, + value: { + __typename: "AttributeValue", + id: "ptav14907", + name: "Auto Loan Account", + slug: "Auto-Loan-Account", + sortNumber: 1 + } + } + ], + basePrice: { + __typename: "Money", + amount: 339.39, + currency: "NZD", + localized: "339.39 NZD" + }, + category: { __typename: "Category", id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + chargeTaxes: true, + collections: [ + { + __typename: "Collection", + id: "Q29sbGVjdGlvbjoy", + name: "Winter sale" + } + ], + descriptionJson: JSON.stringify(content), + id: "p10171", + images: [ + { + __typename: "ProductImage", + alt: "Id sit dolores adipisci", + id: "UHJvZHVjdEltYWdlOjE=", + sortOrder: 0, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Id sit dolores adipisci", + id: "UHJvZHVjdEltYWdlOaE=", + sortOrder: 2, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Id sit dolores adipisci", + id: "UPJvZHVjdEltYWdlOjV=", + sortOrder: 1, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Id sit dolores adipisci", + id: "UHJvZHVjdEltYHdlOjX=", + sortOrder: 3, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Id sit dolores adipisci", + id: "UHJvZHVjdIlnYWdlOjX=", + sortOrder: 4, + url: placeholderImage + } + ], + isAvailable: false, + isFeatured: false, + isPublished: true, + margin: { __typename: "Margin", start: 2, stop: 7 }, + name: "Ergonomic Plastic Bacon", + pricing: { + __typename: "ProductPricingInfo", + priceRange: { + __typename: "TaxedMoneyRange", + start: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 12.3, + currency: "USD" + }, + net: { + __typename: "Money", + amount: 10, + currency: "USD" + } + }, + stop: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 24.6, + currency: "USD" + }, + net: { + __typename: "Money", + amount: 20, + currency: "USD" + } + } + } + }, + productType: { + __typename: "ProductType", + hasVariants: true, + id: "pt76406", + name: "Versatile", + seoDescription: "Omnis rerum ea. Fugit dignissimos modi est rerum", + seoTitle: "Ergonomic Plastic Bacon", + variantAttributes: [ + { + __typename: "Attribute", + id: "pta18161", + name: "Color", + slug: "color", + sortOrder: 0, + values: [ + { + __typename: "AttributeValue", + id: "ptvav47282", + name: "Black", + slug: "black", + sortOrder: 0 + }, + { + __typename: "AttributeValue", + id: "ptvav17253", + name: "White", + slug: "white", + sortOrder: 1 + } + ] + } + ] + }, + publicationDate: "2018-08-25T18:45:54.125Z", + purchaseCost: { + __typename: "MoneyRange", + start: { + __typename: "Money", + amount: 339.39, + currency: "NZD", + localized: "339.39 NZD" + }, + stop: { + __typename: "Money", + amount: 678.78, + currency: "NZD", + localized: "678.78 NZD" + } + }, + seoDescription: "Seo description", + seoTitle: "Seo title", + sku: "59661-34207", + thumbnail: { __typename: "Image", url: placeholderImage }, + url: "/example-url", + variants: [ + { + __typename: "ProductVariant", + id: "pv75934", + images: [ + { + __typename: "ProductImage", + id: "pi92837", + url: placeholderImage + }, + { + __typename: "ProductImage", + id: "pi92838", + url: placeholderImage + } + ], + margin: 2, + name: "Cordoba Oro", + priceOverride: { + __typename: "Money", + amount: 678.78, + currency: "USD" + }, + quantity: 12, + quantityAllocated: 1, + sku: "87192-94370", + stockQuantity: 48 + }, + { + __typename: "ProductVariant", + id: "pv68615", + images: [ + { + __typename: "ProductImage", + id: "pi81234", + url: placeholderImage + }, + { + __typename: "ProductImage", + id: "pi1236912", + url: placeholderImage + } + ], + margin: 7, + name: "silver", + priceOverride: null, + quantity: 12, + quantityAllocated: 1, + sku: "69055-15190", + stockQuantity: 14 + } + ] +}); +export const products = (placeholderImage: string) => [ + { + attributes: [ + { + attribute: { + id: "pta37372", + name: "expedite", + slug: "expedite", + sortOrder: 0, + values: [ + { id: "ptav84718", name: "violet", slug: "violet", sortOrder: 0 }, + { id: "ptav4189", name: "virtual", slug: "virtual", sortOrder: 1 }, + { + id: "ptav39406", + name: "supply-chains", + slug: "supply-chains", + sortOrder: 2 + }, + { + id: "ptav57910", + name: "Implementation", + slug: "Implementation", + sortOrder: 3 + } + ] + }, + value: { + id: "ptav4189", + name: "virtual", + slug: "virtual", + sortOrder: 1 + } + }, + { + attribute: { + id: "pta3183", + name: "system", + slug: "system", + sortOrder: 1, + values: [ + { + id: "ptav83133", + name: "turn-key", + slug: "turn-key", + sortOrder: 0 + }, + { id: "ptav60236", name: "red", slug: "red", sortOrder: 1 }, + { id: "ptav99015", name: "Fort", slug: "Fort", sortOrder: 2 }, + { id: "ptav98580", name: "Borders", slug: "Borders", sortOrder: 3 }, + { id: "ptav34875", name: "Guam", slug: "Guam", sortOrder: 4 } + ] + }, + value: { + id: "ptav98580", + name: "Borders", + slug: "Borders", + sortOrder: 3 + } + }, + { + attribute: { + id: "pta47147", + name: "interactive", + slug: "interactive", + sortOrder: 2, + values: [ + { + id: "ptav67400", + name: "fault-tolerant", + slug: "fault-tolerant", + sortOrder: 0 + } + ] + }, + value: { + id: "ptav67400", + name: "fault-tolerant", + slug: "fault-tolerant", + sortOrder: 0 + } + }, + { + attribute: { + id: "pta34499", + name: "deposit", + slug: "deposit", + sortOrder: 3, + values: [ + { id: "ptav11679", name: "silver", slug: "silver", sortOrder: 0 }, + { + id: "ptav12539", + name: "Iranian Rial", + slug: "Iranian-Rial", + sortOrder: 1 + }, + { + id: "ptav93140", + name: "Gorgeous Cotton Tuna", + slug: "Gorgeous-Cotton-Tuna", + sortOrder: 2 + }, + { id: "ptav7930", name: "hybrid", slug: "hybrid", sortOrder: 3 }, + { + id: "ptav75590", + name: "navigating", + slug: "navigating", + sortOrder: 4 + } + ] + }, + value: { + id: "ptav75590", + name: "navigating", + slug: "navigating", + sortOrder: 4 + } + } + ], + basePrice: { amount: 274.99389477595827, currency: "XAG" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Autem odit tempora nesciunt quaerat enim reprehenderit eius. Excepturi nemo quos veritatis laboriosam aperiam atque natus soluta. Quos enim illo eum explicabo sapiente voluptates. Ad et fugiat alias. Perspiciatis quod tenetur ex aspernatur nesciunt ab veritatis perspiciatis. A numquam odio aperiam nobis consequatur voluptatum id. Culpa excepturi et voluptate dolore sint esse voluptate optio ut. Sit quis consequatur quo quia praesentium accusamus quia reiciendis repellendus.", + id: "p25557", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: true, + isFeatured: false, + isPublished: false, + margin: { start: 6, stop: 18 }, + name: "Gorgeous Frozen Chips", + productType: { + hasVariants: true, + id: "pt41284", + name: "Awesome Wooden Pizza" + }, + publicationDate: null, + purchaseCost: { + start: { amount: 274.99389477595827, currency: "XAG" }, + stop: { amount: 274.99389477595827, currency: "XAG" } + }, + seoDescription: + "Autem odit tempora nesciunt quaerat enim reprehenderit eius. Excepturi nemo quos veritatis laboriosam aperiam atque natus soluta", + seoTitle: "Generic Rubber Pants", + sku: "57599-97473", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv44405", + margin: 18, + name: "Minnesota", + priceOverride: null, + quantity: 42, + sku: "26012-49906" + } + }, + { + node: { + id: "pv27827", + margin: 6, + name: "Specialist", + priceOverride: null, + quantity: 45, + sku: "12278-95926" + } + } + ] + } + }, + { + attributes: [ + { + attribute: { + id: "pta1529", + name: "Granite", + slug: "Granite", + sortOrder: 0, + values: [ + { + id: "ptav30634", + name: "multi-byte", + slug: "multi-byte", + sortOrder: 0 + }, + { id: "ptav77390", name: "Soft", slug: "Soft", sortOrder: 1 }, + { + id: "ptav42995", + name: "navigating", + slug: "navigating", + sortOrder: 2 + } + ] + }, + value: { + id: "ptav30634", + name: "multi-byte", + slug: "multi-byte", + sortOrder: 0 + } + }, + { + attribute: { + id: "pta44120", + name: "wireless", + slug: "wireless", + sortOrder: 1, + values: [ + { + id: "ptav89151", + name: "Tasty Wooden Shirt", + slug: "Tasty-Wooden-Shirt", + sortOrder: 0 + }, + { id: "ptav69476", name: "monitor", slug: "monitor", sortOrder: 1 }, + { + id: "ptav71380", + name: "Operative", + slug: "Operative", + sortOrder: 2 + }, + { + id: "ptav73557", + name: "vertical", + slug: "vertical", + sortOrder: 3 + }, + { id: "ptav61047", name: "Managed", slug: "Managed", sortOrder: 4 } + ] + }, + value: { + id: "ptav73557", + name: "vertical", + slug: "vertical", + sortOrder: 3 + } + }, + { + attribute: { + id: "pta83114", + name: "6th generation", + slug: "6th-generation", + sortOrder: 2, + values: [ + { + id: "ptav42344", + name: "Division", + slug: "Division", + sortOrder: 0 + }, + { + id: "ptav76960", + name: "sky blue", + slug: "sky-blue", + sortOrder: 1 + } + ] + }, + value: { + id: "ptav76960", + name: "sky blue", + slug: "sky-blue", + sortOrder: 1 + } + } + ], + basePrice: { amount: 432.2991706153576, currency: "ZWL" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Cumque sed vero velit. Quas autem ipsam aperiam assumenda autem. Voluptatum et similique consequatur. Ipsum praesentium omnis eveniet veritatis possimus perspiciatis. Quae sint perferendis quia ut reiciendis magnam qui dolorum impedit. Ut placeat quod doloribus est hic error doloremque amet sint. Ut esse ex explicabo culpa ab eaque adipisci ut. Esse rerum et asperiores libero.", + id: "p59567", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: true, + isFeatured: false, + isPublished: true, + margin: { start: 4, stop: 19 }, + name: "Handcrafted Wooden Towels", + productType: { hasVariants: false, id: "pt29020", name: "Future" }, + publicationDate: null, + purchaseCost: { + start: { amount: 432.2991706153576, currency: "ZWL" }, + stop: { amount: 8213.684241691793, currency: "ZWL" } + }, + seoDescription: "enim est recusandae soluta aperiam", + seoTitle: "Handcrafted Wooden Towels", + sku: "6526-89350", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv21736", + margin: 19, + name: "Plain", + priceOverride: 8213.684241691793, + quantity: 19, + sku: "28237-88009" + } + }, + { + node: { + id: "pv51132", + margin: 4, + name: "secured line", + priceOverride: null, + quantity: 38, + sku: "94362-46644" + } + }, + { + node: { + id: "pv43456", + margin: 18, + name: "compressing", + priceOverride: 7781.385071076436, + quantity: 47, + sku: "29140-85285" + } + }, + { + node: { + id: "pv274", + margin: 6, + name: "Sports", + priceOverride: null, + quantity: 0, + sku: "61813-6435" + } + }, + { + node: { + id: "pv7724", + margin: 16, + name: "copy", + priceOverride: 6916.786729845721, + quantity: 42, + sku: "68556-81832" + } + } + ] + } + }, + { + attributes: [ + { + attribute: { + id: "pta40940", + name: "monitor", + slug: "monitor", + sortOrder: 0, + values: [ + { + id: "ptav64256", + name: "alliance", + slug: "alliance", + sortOrder: 0 + }, + { + id: "ptav9644", + name: "content-based", + slug: "content-based", + sortOrder: 1 + }, + { + id: "ptav27621", + name: "East Caribbean Dollar", + slug: "East-Caribbean-Dollar", + sortOrder: 2 + }, + { + id: "ptav21347", + name: "Licensed", + slug: "Licensed", + sortOrder: 3 + }, + { + id: "ptav94604", + name: "client-server", + slug: "client-server", + sortOrder: 4 + } + ] + }, + value: { + id: "ptav21347", + name: "Licensed", + slug: "Licensed", + sortOrder: 3 + } + }, + { + attribute: { + id: "pta33894", + name: "Assurance", + slug: "Assurance", + sortOrder: 1, + values: [ + { id: "ptav28890", name: "exploit", slug: "exploit", sortOrder: 0 }, + { + id: "ptav4427", + name: "Team-oriented", + slug: "Team-oriented", + sortOrder: 1 + }, + { + id: "ptav16612", + name: "Money Market Account", + slug: "Money-Market-Account", + sortOrder: 2 + }, + { id: "ptav61387", name: "monitor", slug: "monitor", sortOrder: 3 }, + { + id: "ptav51902", + name: "synthesize", + slug: "synthesize", + sortOrder: 4 + } + ] + }, + value: { + id: "ptav16612", + name: "Money Market Account", + slug: "Money-Market-Account", + sortOrder: 2 + } + }, + { + attribute: { + id: "pta35528", + name: "Function-based", + slug: "Function-based", + sortOrder: 2, + values: [ + { + id: "ptav77876", + name: "generating", + slug: "generating", + sortOrder: 0 + } + ] + }, + value: { + id: "ptav77876", + name: "generating", + slug: "generating", + sortOrder: 0 + } + } + ], + basePrice: { amount: 688.3543328975433, currency: "XDR" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Ut iusto iusto minus odio. Id sunt dolores esse. Asperiores minima nihil et vel id hic possimus temporibus. Ut dolor soluta et eum. Qui ut quaerat deserunt voluptas corporis consequatur saepe. Quo possimus qui laborum. Nesciunt quos dolore dolor consectetur dolor. Qui autem voluptatem.", + id: "p92172", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: false, + isFeatured: false, + isPublished: true, + margin: { start: 3, stop: 18 }, + name: "Handcrafted Metal Cheese", + productType: { hasVariants: true, id: "pt23508", name: "SMS" }, + publicationDate: null, + purchaseCost: { + start: { amount: 688.3543328975433, currency: "XDR" }, + stop: { amount: 3441.7716644877164, currency: "XDR" } + }, + seoDescription: "quas minima error repudiandae corrupti", + seoTitle: "Handcrafted Metal Cheese", + sku: "9937-5954", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv34161", + margin: 3, + name: "Iraq", + priceOverride: 2065.0629986926297, + quantity: 21, + sku: "92335-9731" + } + }, + { + node: { + id: "pv43741", + margin: 5, + name: "invoice", + priceOverride: 3441.7716644877164, + quantity: 47, + sku: "91798-87295" + } + }, + { + node: { + id: "pv52463", + margin: 18, + name: "fuchsia", + priceOverride: null, + quantity: 40, + sku: "71687-8488" + } + }, + { + node: { + id: "pv93602", + margin: 5, + name: "lime", + priceOverride: 3441.7716644877164, + quantity: 8, + sku: "95750-91626" + } + } + ] + } + }, + { + attributes: [ + { + attribute: { + id: "pta58079", + name: "Cotton", + slug: "Cotton", + sortOrder: 0, + values: [ + { id: "ptav12741", name: "Table", slug: "Table", sortOrder: 0 }, + { id: "ptav24310", name: "Salad", slug: "Salad", sortOrder: 1 }, + { id: "ptav98446", name: "Hawaii", slug: "Hawaii", sortOrder: 2 }, + { + id: "ptav18267", + name: "Assurance", + slug: "Assurance", + sortOrder: 3 + }, + { id: "ptav57428", name: "Liberia", slug: "Liberia", sortOrder: 4 } + ] + }, + value: { + id: "ptav57428", + name: "Liberia", + slug: "Liberia", + sortOrder: 4 + } + }, + { + attribute: { + id: "pta51731", + name: "Assistant", + slug: "Assistant", + sortOrder: 1, + values: [ + { id: "ptav85577", name: "black", slug: "black", sortOrder: 0 } + ] + }, + value: { id: "ptav85577", name: "black", slug: "black", sortOrder: 0 } + }, + { + attribute: { + id: "pta53013", + name: "target", + slug: "target", + sortOrder: 2, + values: [ + { id: "ptav1569", name: "Tuna", slug: "Tuna", sortOrder: 0 }, + { + id: "ptav99901", + name: "quantify", + slug: "quantify", + sortOrder: 1 + }, + { + id: "ptav77006", + name: "Saudi Riyal", + slug: "Saudi-Riyal", + sortOrder: 2 + }, + { + id: "ptav74813", + name: "New Hampshire", + slug: "New-Hampshire", + sortOrder: 3 + } + ] + }, + value: { + id: "ptav99901", + name: "quantify", + slug: "quantify", + sortOrder: 1 + } + }, + { + attribute: { + id: "pta98307", + name: "Brand", + slug: "Brand", + sortOrder: 3, + values: [ + { + id: "ptav93905", + name: "Clothing", + slug: "Clothing", + sortOrder: 0 + } + ] + }, + value: { + id: "ptav93905", + name: "Clothing", + slug: "Clothing", + sortOrder: 0 + } + }, + { + attribute: { + id: "pta52191", + name: "invoice", + slug: "invoice", + sortOrder: 4, + values: [ + { + id: "ptav74932", + name: "Implementation", + slug: "Implementation", + sortOrder: 0 + }, + { + id: "ptav68802", + name: "Berkshire", + slug: "Berkshire", + sortOrder: 1 + }, + { + id: "ptav89987", + name: "Generic Rubber Gloves", + slug: "Generic-Rubber-Gloves", + sortOrder: 2 + }, + { id: "ptav60428", name: "HDD", slug: "HDD", sortOrder: 3 } + ] + }, + value: { id: "ptav60428", name: "HDD", slug: "HDD", sortOrder: 3 } + } + ], + basePrice: { amount: 540.3817687240911, currency: "SLL" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Veniam quasi temporibus ab similique. Praesentium vero repudiandae. Tempora facilis perspiciatis minus et. Ea soluta reiciendis ipsum facilis architecto alias voluptatem molestiae. Enim nam velit accusantium. Aut vitae voluptas sint rerum laborum. Voluptatem quod provident possimus voluptatem illum. Dignissimos saepe et.", + id: "p89786", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: false, + isFeatured: true, + isPublished: true, + margin: { start: 4, stop: 19 }, + name: "Refined Rubber Keyboard", + productType: { hasVariants: false, id: "pt20625", name: "Virtual" }, + publicationDate: null, + purchaseCost: { + start: { amount: 540.3817687240911, currency: "SLL" }, + stop: { amount: 4863.43591851682, currency: "SLL" } + }, + seoDescription: + "Veniam quasi temporibus ab similique. Praesentium vero repudiandae", + seoTitle: "Awesome Granite Car", + sku: "96777-48145", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv92097", + margin: 6, + name: "productize", + priceOverride: null, + quantity: 48, + sku: "6312-11173" + } + }, + { + node: { + id: "pv56701", + margin: 19, + name: "bifurcated", + priceOverride: null, + quantity: 30, + sku: "93662-14792" + } + }, + { + node: { + id: "pv98872", + margin: 9, + name: "multimedia", + priceOverride: 4863.43591851682, + quantity: 21, + sku: "89986-48759" + } + }, + { + node: { + id: "pv92133", + margin: 8, + name: "paradigm", + priceOverride: 4323.054149792729, + quantity: 5, + sku: "15410-64401" + } + }, + { + node: { + id: "pv24205", + margin: 12, + name: "Squares", + priceOverride: null, + quantity: 5, + sku: "51743-88427" + } + }, + { + node: { + id: "pv33740", + margin: 6, + name: "invoice", + priceOverride: null, + quantity: 42, + sku: "35615-85883" + } + }, + { + node: { + id: "pv4519", + margin: 4, + name: "Arizona", + priceOverride: null, + quantity: 1, + sku: "56452-53097" + } + } + ] + } + }, + { + attributes: [ + { + attribute: { + id: "pta96115", + name: "Officer", + slug: "Officer", + sortOrder: 0, + values: [ + { id: "ptav14754", name: "Rubber", slug: "Rubber", sortOrder: 0 } + ] + }, + value: { id: "ptav14754", name: "Rubber", slug: "Rubber", sortOrder: 0 } + }, + { + attribute: { + id: "pta74440", + name: "driver", + slug: "driver", + sortOrder: 1, + values: [ + { id: "ptav84649", name: "FTP", slug: "FTP", sortOrder: 0 }, + { id: "ptav82177", name: "parse", slug: "parse", sortOrder: 1 }, + { + id: "ptav4221", + name: "Executive", + slug: "Executive", + sortOrder: 2 + }, + { id: "ptav44337", name: "Gateway", slug: "Gateway", sortOrder: 3 } + ] + }, + value: { id: "ptav84649", name: "FTP", slug: "FTP", sortOrder: 0 } + }, + { + attribute: { + id: "pta95292", + name: "SDD", + slug: "SDD", + sortOrder: 2, + values: [ + { + id: "ptav61506", + name: "forecast", + slug: "forecast", + sortOrder: 0 + }, + { + id: "ptav33698", + name: "Virginia", + slug: "Virginia", + sortOrder: 1 + } + ] + }, + value: { + id: "ptav33698", + name: "Virginia", + slug: "Virginia", + sortOrder: 1 + } + }, + { + attribute: { + id: "pta28064", + name: "firewall", + slug: "firewall", + sortOrder: 3, + values: [ + { + id: "ptav56676", + name: "initiative", + slug: "initiative", + sortOrder: 0 + }, + { id: "ptav77667", name: "Web", slug: "Web", sortOrder: 1 } + ] + }, + value: { id: "ptav77667", name: "Web", slug: "Web", sortOrder: 1 } + }, + { + attribute: { + id: "pta90527", + name: "Jamaica", + slug: "Jamaica", + sortOrder: 4, + values: [ + { id: "ptav52878", name: "Burgs", slug: "Burgs", sortOrder: 0 }, + { + id: "ptav772", + name: "workforce", + slug: "workforce", + sortOrder: 1 + }, + { id: "ptav82565", name: "Human", slug: "Human", sortOrder: 2 }, + { + id: "ptav46804", + name: "cross-platform", + slug: "cross-platform", + sortOrder: 3 + } + ] + }, + value: { id: "ptav52878", name: "Burgs", slug: "Burgs", sortOrder: 0 } + } + ], + basePrice: { amount: 4.359138839276078, currency: "AMD" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Minima quaerat error incidunt qui quis vitae maxime. Est ab et. Optio animi corporis tempore possimus facere. Qui voluptatem fuga at reprehenderit id molestias voluptate. Et consectetur odit at. Nemo sed nulla nemo non et dicta tenetur. Omnis in fugiat. Ex ea commodi minus sed sint.", + id: "p67851", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: true, + isFeatured: false, + isPublished: false, + margin: { start: 6, stop: 17 }, + name: "Gorgeous Metal Gloves", + productType: { hasVariants: true, id: "pt91547", name: "Vermont" }, + publicationDate: null, + purchaseCost: { + start: { amount: 4.359138839276078, currency: "AMD" }, + stop: { amount: 74.10536026769333, currency: "AMD" } + }, + seoDescription: + "Minima quaerat error incidunt qui quis vitae maxime. Est ab et", + seoTitle: "Gorgeous Metal Gloves", + sku: "60799-40023", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv10610", + margin: 17, + name: "Data", + priceOverride: 74.10536026769333, + quantity: 15, + sku: "70713-29057" + } + }, + { + node: { + id: "pv35325", + margin: 11, + name: "CSS", + priceOverride: null, + quantity: 16, + sku: "85366-83000" + } + }, + { + node: { + id: "pv56132", + margin: 10, + name: "compressing", + priceOverride: null, + quantity: 16, + sku: "94401-90694" + } + }, + { + node: { + id: "pv7891", + margin: 12, + name: "hacking", + priceOverride: null, + quantity: 23, + sku: "75089-16931" + } + }, + { + node: { + id: "pv90884", + margin: 15, + name: "Assimilated", + priceOverride: null, + quantity: 18, + sku: "44872-68830" + } + }, + { + node: { + id: "pv19605", + margin: 15, + name: "Arkansas", + priceOverride: null, + quantity: 32, + sku: "69686-14483" + } + }, + { + node: { + id: "pv45238", + margin: 6, + name: "deliverables", + priceOverride: null, + quantity: 23, + sku: "81817-51892" + } + }, + { + node: { + id: "pv67414", + margin: 8, + name: "Cambridgeshire", + priceOverride: null, + quantity: 25, + sku: "23890-14998" + } + } + ] + } + }, + { + attributes: [ + { + attribute: { + id: "pta77866", + name: "well-modulated", + slug: "well-modulated", + sortOrder: 0, + values: [ + { id: "ptav48728", name: "Group", slug: "Group", sortOrder: 0 }, + { id: "ptav45439", name: "Rubber", slug: "Rubber", sortOrder: 1 }, + { + id: "ptav80318", + name: "Handmade Steel Chips", + slug: "Handmade-Steel-Chips", + sortOrder: 2 + }, + { id: "ptav55820", name: "yellow", slug: "yellow", sortOrder: 3 }, + { id: "ptav46550", name: "bypass", slug: "bypass", sortOrder: 4 } + ] + }, + value: { id: "ptav45439", name: "Rubber", slug: "Rubber", sortOrder: 1 } + }, + { + attribute: { + id: "pta46984", + name: "magenta", + slug: "magenta", + sortOrder: 1, + values: [ + { + id: "ptav95090", + name: "Credit Card Account", + slug: "Credit-Card-Account", + sortOrder: 0 + } + ] + }, + value: { + id: "ptav95090", + name: "Credit Card Account", + slug: "Credit-Card-Account", + sortOrder: 0 + } + }, + { + attribute: { + id: "pta58329", + name: "District", + slug: "District", + sortOrder: 2, + values: [ + { + id: "ptav38516", + name: "Home Loan Account", + slug: "Home-Loan-Account", + sortOrder: 0 + }, + { id: "ptav42626", name: "panel", slug: "panel", sortOrder: 1 } + ] + }, + value: { + id: "ptav38516", + name: "Home Loan Account", + slug: "Home-Loan-Account", + sortOrder: 0 + } + }, + { + attribute: { + id: "pta24725", + name: "payment", + slug: "payment", + sortOrder: 3, + values: [ + { + id: "ptav37397", + name: "firmware", + slug: "firmware", + sortOrder: 0 + }, + { id: "ptav29524", name: "Music", slug: "Music", sortOrder: 1 }, + { + id: "ptav66933", + name: "Team-oriented", + slug: "Team-oriented", + sortOrder: 2 + }, + { + id: "ptav94930", + name: "Singapore Dollar", + slug: "Singapore-Dollar", + sortOrder: 3 + } + ] + }, + value: { + id: "ptav94930", + name: "Singapore Dollar", + slug: "Singapore-Dollar", + sortOrder: 3 + } + }, + { + attribute: { + id: "pta20828", + name: "functionalities", + slug: "functionalities", + sortOrder: 4, + values: [ + { + id: "ptav75959", + name: "Buckinghamshire", + slug: "Buckinghamshire", + sortOrder: 0 + }, + { id: "ptav76195", name: "Idaho", slug: "Idaho", sortOrder: 1 }, + { id: "ptav91880", name: "systems", slug: "systems", sortOrder: 2 }, + { id: "ptav2568", name: "SMS", slug: "SMS", sortOrder: 3 }, + { + id: "ptav29590", + name: "convergence", + slug: "convergence", + sortOrder: 4 + } + ] + }, + value: { + id: "ptav29590", + name: "convergence", + slug: "convergence", + sortOrder: 4 + } + } + ], + basePrice: { amount: 538.0974149450597, currency: "GMD" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Esse quia voluptates veniam eveniet. Velit laborum possimus eveniet consequuntur magnam eveniet provident et voluptatem. Exercitationem magni quas aliquid unde voluptatibus hic ut et quam. Quia a cumque iusto delectus aut et inventore vero. Qui mollitia qui. Dolores quos quas est quidem aut ab aut vel et. Repellendus suscipit ut iure quis cupiditate. Sapiente ut rerum impedit mollitia quam quos provident.", + id: "p54272", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: false, + isFeatured: false, + isPublished: false, + margin: { start: 1, stop: 15 }, + name: "Small Cotton Shirt", + productType: { hasVariants: false, id: "pt69941", name: "Gorgeous" }, + publicationDate: null, + purchaseCost: { + start: { amount: 538.0974149450597, currency: "GMD" }, + stop: { amount: 6457.168979340716, currency: "GMD" } + }, + seoDescription: + "Esse quia voluptates veniam eveniet. Velit laborum possimus eveniet consequuntur magnam eveniet provident et voluptatem", + seoTitle: "Unbranded Rubber Ball", + sku: "2840-48373", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv95364", + margin: 9, + name: "Security", + priceOverride: null, + quantity: 48, + sku: "22565-57147" + } + }, + { + node: { + id: "pv15691", + margin: 1, + name: "auxiliary", + priceOverride: 538.0974149450597, + quantity: 49, + sku: "53060-31227" + } + }, + { + node: { + id: "pv4077", + margin: 15, + name: "Representative", + priceOverride: null, + quantity: 21, + sku: "23136-18988" + } + }, + { + node: { + id: "pv44826", + margin: 12, + name: "Licensed Cotton Chair", + priceOverride: 6457.168979340716, + quantity: 2, + sku: "2124-66425" + } + }, + { + node: { + id: "pv46723", + margin: 13, + name: "evolve", + priceOverride: null, + quantity: 30, + sku: "73188-73743" + } + }, + { + node: { + id: "pv34683", + margin: 12, + name: "Generic", + priceOverride: null, + quantity: 45, + sku: "98860-41086" + } + }, + { + node: { + id: "pv83082", + margin: 15, + name: "copying", + priceOverride: null, + quantity: 39, + sku: "1132-39166" + } + }, + { + node: { + id: "pv4635", + margin: 2, + name: "Ville", + priceOverride: null, + quantity: 18, + sku: "38968-44206" + } + } + ] + } + }, + { + attributes: [ + { + attribute: { + id: "pta66889", + name: "Compatible", + slug: "Compatible", + sortOrder: 0, + values: [ + { + id: "ptav34671", + name: "Minnesota", + slug: "Minnesota", + sortOrder: 0 + }, + { + id: "ptav83835", + name: "networks", + slug: "networks", + sortOrder: 1 + }, + { + id: "ptav25230", + name: "Generic Frozen Bike", + slug: "Generic-Frozen-Bike", + sortOrder: 2 + }, + { + id: "ptav76000", + name: "withdrawal", + slug: "withdrawal", + sortOrder: 3 + } + ] + }, + value: { + id: "ptav83835", + name: "networks", + slug: "networks", + sortOrder: 1 + } + }, + { + attribute: { + id: "pta85893", + name: "program", + slug: "program", + sortOrder: 1, + values: [ + { id: "ptav70505", name: "Avon", slug: "Avon", sortOrder: 0 }, + { id: "ptav49968", name: "Analyst", slug: "Analyst", sortOrder: 1 }, + { + id: "ptav43009", + name: "Computer", + slug: "Computer", + sortOrder: 2 + }, + { + id: "ptav29188", + name: "composite", + slug: "composite", + sortOrder: 3 + }, + { + id: "ptav95526", + name: "Norwegian Krone", + slug: "Norwegian-Krone", + sortOrder: 4 + } + ] + }, + value: { id: "ptav70505", name: "Avon", slug: "Avon", sortOrder: 0 } + } + ], + basePrice: { amount: 56.90596710694962, currency: "CVE" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Sed tempore autem voluptas voluptas aut sit et. Molestiae rem quo cupiditate consectetur. Dolorum quidem exercitationem sed placeat explicabo adipisci culpa. Sunt et soluta dolor sit nihil incidunt est. Nisi expedita ipsam ducimus quibusdam sed aspernatur. Atque voluptas perferendis ut soluta. Voluptatem aliquid ex quis alias molestiae in voluptatum. Aut ut sapiente tenetur asperiores et voluptatem assumenda.", + id: "p63346", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: false, + isFeatured: false, + isPublished: false, + margin: { start: 0, stop: 4 }, + name: "Fantastic Cotton Tuna", + productType: { hasVariants: true, id: "pt41677", name: "TCP" }, + publicationDate: null, + purchaseCost: { + start: { amount: 56.90596710694962, currency: "CVE" }, + stop: { amount: 227.62386842779847, currency: "CVE" } + }, + seoDescription: + "Sed tempore autem voluptas voluptas aut sit et. Molestiae rem quo cupiditate consectetur", + seoTitle: "Fantastic Cotton Tuna", + sku: "63913-27946", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv79408", + margin: 4, + name: "Multi-tiered", + priceOverride: 227.62386842779847, + quantity: 9, + sku: "28000-61818" + } + }, + { + node: { + id: "pv64466", + margin: 4, + name: "Solutions", + priceOverride: null, + quantity: 22, + sku: "57287-58162" + } + }, + { + node: { + id: "pv33325", + margin: 0, + name: "zero administration", + priceOverride: 0, + quantity: 31, + sku: "45268-79894" + } + }, + { + node: { + id: "pv1168", + margin: 2, + name: "world-class", + priceOverride: null, + quantity: 24, + sku: "43680-57669" + } + } + ] + } + }, + { + attributes: [ + { + attribute: { + id: "pta3756", + name: "directional", + slug: "directional", + sortOrder: 0, + values: [ + { id: "ptav98940", name: "silver", slug: "silver", sortOrder: 0 }, + { + id: "ptav67536", + name: "navigate", + slug: "navigate", + sortOrder: 1 + }, + { + id: "ptav58905", + name: "structure", + slug: "structure", + sortOrder: 2 + }, + { id: "ptav25008", name: "mobile", slug: "mobile", sortOrder: 3 } + ] + }, + value: { id: "ptav98940", name: "silver", slug: "silver", sortOrder: 0 } + } + ], + basePrice: { amount: 981.0598640464501, currency: "XAG" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Voluptatem veniam aut rerum. Illum veniam asperiores ut et iusto enim vel sapiente quia. Numquam non et aliquid dolores qui quis non assumenda at. Aut magni iusto qui nihil neque suscipit dolore incidunt. Debitis id sunt. Eius eum et quia nobis molestias placeat reprehenderit. Qui consequatur deserunt dolor quos quasi numquam quibusdam non. Nihil numquam vel eveniet.", + id: "p67185", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: false, + isFeatured: false, + isPublished: true, + margin: { start: 0, stop: 18 }, + name: "Tasty Steel Pants", + productType: { hasVariants: true, id: "pt93233", name: "Buckinghamshire" }, + publicationDate: null, + purchaseCost: { + start: { amount: 981.0598640464501, currency: "XAG" }, + stop: { amount: 16678.017688789652, currency: "XAG" } + }, + seoDescription: + "Voluptatem veniam aut rerum. Illum veniam asperiores ut et iusto enim vel sapiente quia", + seoTitle: "Tasty Steel Pants", + sku: "4110-47925", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv34567", + margin: 0, + name: "value-added", + priceOverride: 0, + quantity: 38, + sku: "53179-25529" + } + }, + { + node: { + id: "pv47783", + margin: 17, + name: "Internal", + priceOverride: 16678.017688789652, + quantity: 4, + sku: "8483-38189" + } + }, + { + node: { + id: "pv63369", + margin: 0, + name: "connecting", + priceOverride: 0, + quantity: 41, + sku: "44970-77755" + } + }, + { + node: { + id: "pv62179", + margin: 18, + name: "Oklahoma", + priceOverride: null, + quantity: 42, + sku: "66847-73235" + } + }, + { + node: { + id: "pv4122", + margin: 11, + name: "open-source", + priceOverride: 10791.658504510951, + quantity: 19, + sku: "62633-56792" + } + }, + { + node: { + id: "pv50156", + margin: 7, + name: "Wisconsin", + priceOverride: 6867.4190483251505, + quantity: 32, + sku: "49819-59437" + } + }, + { + node: { + id: "pv7095", + margin: 10, + name: "Somali Shilling", + priceOverride: null, + quantity: 22, + sku: "37034-79128" + } + } + ] + } + }, + { + attributes: [ + { + attribute: { + id: "pta93061", + name: "Cotton", + slug: "Cotton", + sortOrder: 0, + values: [ + { id: "ptav30744", name: "USB", slug: "USB", sortOrder: 0 }, + { + id: "ptav64622", + name: "Developer", + slug: "Developer", + sortOrder: 1 + }, + { id: "ptav26323", name: "Squares", slug: "Squares", sortOrder: 2 }, + { id: "ptav91686", name: "Group", slug: "Group", sortOrder: 3 }, + { + id: "ptav95456", + name: "out-of-the-box", + slug: "out-of-the-box", + sortOrder: 4 + } + ] + }, + value: { + id: "ptav64622", + name: "Developer", + slug: "Developer", + sortOrder: 1 + } + }, + { + attribute: { + id: "pta58822", + name: "Shore", + slug: "Shore", + sortOrder: 1, + values: [ + { id: "ptav38761", name: "RSS", slug: "RSS", sortOrder: 0 }, + { id: "ptav9858", name: "Metal", slug: "Metal", sortOrder: 1 }, + { id: "ptav84091", name: "JBOD", slug: "JBOD", sortOrder: 2 } + ] + }, + value: { id: "ptav84091", name: "JBOD", slug: "JBOD", sortOrder: 2 } + }, + { + attribute: { + id: "pta33738", + name: "Communications", + slug: "Communications", + sortOrder: 2, + values: [ + { id: "ptav75637", name: "uniform", slug: "uniform", sortOrder: 0 }, + { + id: "ptav65428", + name: "Administrator", + slug: "Administrator", + sortOrder: 1 + } + ] + }, + value: { + id: "ptav75637", + name: "uniform", + slug: "uniform", + sortOrder: 0 + } + }, + { + attribute: { + id: "pta46618", + name: "Credit Card Account", + slug: "Credit-Card-Account", + sortOrder: 3, + values: [ + { + id: "ptav2397", + name: "Intranet", + slug: "Intranet", + sortOrder: 0 + }, + { id: "ptav77181", name: "orchid", slug: "orchid", sortOrder: 1 }, + { + id: "ptav29222", + name: "Sleek Concrete Keyboard", + slug: "Sleek-Concrete-Keyboard", + sortOrder: 2 + }, + { id: "ptav10489", name: "24/365", slug: "24365", sortOrder: 3 } + ] + }, + value: { id: "ptav77181", name: "orchid", slug: "orchid", sortOrder: 1 } + } + ], + basePrice: { amount: 449.93166054829857, currency: "WST" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Sapiente qui error. Placeat hic nulla repudiandae delectus et. Est aut veniam vitae dolor et aut ut. Eligendi sit maxime dolorem fuga porro quo. Culpa aut possimus voluptatibus. Illum tenetur reprehenderit. Nihil dolor repudiandae natus et consectetur error. Aut qui sint in reprehenderit voluptate et sed ratione.", + id: "p8161", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: true, + isFeatured: false, + isPublished: true, + margin: { start: 0, stop: 11 }, + name: "Ergonomic Cotton Shoes", + productType: { hasVariants: true, id: "pt53386", name: "Jewelery" }, + publicationDate: null, + purchaseCost: { + start: { amount: 449.93166054829857, currency: "WST" }, + stop: { amount: 4949.248266031284, currency: "WST" } + }, + seoDescription: + "Sapiente qui error. Placeat hic nulla repudiandae delectus et", + seoTitle: "Ergonomic Cotton Shoes", + sku: "9207-4523", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv45430", + margin: 2, + name: "maximize", + priceOverride: null, + quantity: 7, + sku: "43154-53177" + } + }, + { + node: { + id: "pv65956", + margin: 0, + name: "Engineer", + priceOverride: null, + quantity: 11, + sku: "67562-61106" + } + }, + { + node: { + id: "pv64710", + margin: 11, + name: "navigate", + priceOverride: null, + quantity: 41, + sku: "27307-67723" + } + }, + { + node: { + id: "pv2452", + margin: 11, + name: "Bedfordshire", + priceOverride: 4949.248266031284, + quantity: 37, + sku: "65824-26057" + } + }, + { + node: { + id: "pv69865", + margin: 10, + name: "Money Market Account", + priceOverride: 4499.316605482985, + quantity: 40, + sku: "94712-89379" + } + }, + { + node: { + id: "pv98755", + margin: 4, + name: "Home", + priceOverride: null, + quantity: 14, + sku: "89314-44273" + } + } + ] + } + }, + { + attributes: [ + { + attribute: { + id: "pta1842", + name: "Small", + slug: "Small", + sortOrder: 0, + values: [ + { + id: "ptav67439", + name: "Function-based", + slug: "Function-based", + sortOrder: 0 + }, + { + id: "ptav66687", + name: "Savings Account", + slug: "Savings-Account", + sortOrder: 1 + } + ] + }, + value: { + id: "ptav66687", + name: "Savings Account", + slug: "Savings-Account", + sortOrder: 1 + } + } + ], + basePrice: { amount: 590.5928694420302, currency: "MGA" }, + category: { id: "Q2F0ZWdvcnk6MQ==", name: "Apparel" }, + collections: { + edges: [{ node: { id: "Q29sbGVjdGlvbjoy", name: "Winter sale" } }] + }, + description: + "Id ut molestiae. Rerum ut aliquid quas consectetur minima eos. Eum assumenda voluptas dolores perferendis. Accusantium unde sit velit aliquam sed rerum voluptas corrupti. Deleniti dolorem ullam qui dolorem voluptatum suscipit qui nihil voluptatibus. Ipsum iusto et sed tempora est voluptas quis voluptatum aliquid. Ab et ipsum facilis qui asperiores numquam. Sunt suscipit provident quam vero accusantium facilis.", + id: "p34578", + images: { + edges: [ + { + node: { + id: "UHJvZHVjdEltYWdlOjE=", + image: placeholderImage, + sortOrder: 0, + url: placeholderImage + } + } + ] + }, + isAvailable: false, + isFeatured: false, + isPublished: true, + margin: { start: 4, stop: 17 }, + name: "Unbranded Steel Tuna", + productType: { hasVariants: true, id: "pt48315", name: "Agent" }, + publicationDate: null, + purchaseCost: { + start: { amount: 590.5928694420302, currency: "MGA" }, + stop: { amount: 590.5928694420302, currency: "MGA" } + }, + seoDescription: "adipisci laboriosam autem vel soluta", + seoTitle: "Unbranded Steel Tuna", + sku: "84653-71539", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: { + edges: [ + { + node: { + id: "pv60683", + margin: 17, + name: "solid state", + priceOverride: null, + quantity: 27, + sku: "95378-52353" + } + }, + { + node: { + id: "pv52655", + margin: 4, + name: "Officer", + priceOverride: null, + quantity: 26, + sku: "75748-57597" + } + }, + { + node: { + id: "pv6216", + margin: 6, + name: "Trace", + priceOverride: null, + quantity: 12, + sku: "84820-87762" + } + }, + { + node: { + id: "pv89371", + margin: 4, + name: "deposit", + priceOverride: null, + quantity: 14, + sku: "72976-95755" + } + }, + { + node: { + id: "pv38613", + margin: 9, + name: "primary", + priceOverride: null, + quantity: 8, + sku: "85693-86731" + } + } + ] + } + } +]; +export const variant = (placeholderImage: string): ProductVariant => ({ + __typename: "ProductVariant", + attributes: [ + { + __typename: "SelectedAttribute", + attribute: { + __typename: "Attribute", + id: "pta18161", + name: "Borders", + slug: "Borders", + values: [ + { + __typename: "AttributeValue", + id: "ptav47282", + name: "portals", + slug: "portals" + }, + { + __typename: "AttributeValue", + id: "ptav17253", + name: "Baht", + slug: "Baht" + } + ] + }, + value: { + __typename: "AttributeValue", + id: "ptav47282", + name: "portals", + slug: "portals" + } + }, + { + __typename: "SelectedAttribute", + attribute: { + __typename: "Attribute", + id: "pta22785", + name: "Legacy", + slug: "Legacy", + values: [ + { + __typename: "AttributeValue", + id: "ptav31282", + name: "payment", + slug: "payment" + }, + { + __typename: "AttributeValue", + id: "ptav14907", + name: "Auto Loan Account", + slug: "Auto-Loan-Account" + }, + { + __typename: "AttributeValue", + id: "ptav27366", + name: "Garden", + slug: "Garden" + }, + { + __typename: "AttributeValue", + id: "ptav11873", + name: "override", + slug: "override" + } + ] + }, + value: { + __typename: "AttributeValue", + id: "ptav14907", + name: "Auto Loan Account", + slug: "Auto-Loan-Account" + } + } + ], + costPrice: { + __typename: "Money", + amount: 12, + currency: "USD" + }, + id: "var1", + images: [ + { + __typename: "ProductImage", + id: "img1", + url: placeholderImage + }, + { + __typename: "ProductImage", + id: "img2", + url: placeholderImage + }, + { + __typename: "ProductImage", + id: "img7", + url: placeholderImage + }, + { + __typename: "ProductImage", + id: "img8", + url: placeholderImage + } + ], + name: "Extended Hard", + priceOverride: { + __typename: "Money", + amount: 100, + currency: "USD" + }, + product: { + __typename: "Product", + id: "prod1", + images: [ + { + __typename: "ProductImage", + alt: "Front", + id: "img1", + sortOrder: 1, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Back", + id: "img2", + sortOrder: 4, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Right side", + id: "img3", + sortOrder: 2, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Left side", + id: "img4", + sortOrder: 3, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Paper", + id: "img5", + sortOrder: 0, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Hard cover", + id: "img6", + sortOrder: 1, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Extended version", + id: "img7", + sortOrder: 0, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Cut version", + id: "img8", + sortOrder: 2, + url: placeholderImage + }, + { + __typename: "ProductImage", + alt: "Soft cover", + id: "img9", + sortOrder: 2, + url: placeholderImage + } + ], + name: "Our Awesome Book", + thumbnail: { __typename: "Image", url: placeholderImage }, + variants: [ + { + __typename: "ProductVariant", + id: "var1", + images: [ + { + __typename: "ProductImage", + id: "23123", + url: placeholderImage + } + ], + name: "Extended Hard", + sku: "13-1337" + }, + { + __typename: "ProductVariant", + id: "var2", + images: [ + { + __typename: "ProductImage", + id: "23123", + url: placeholderImage + } + ], + name: "Extended Soft", + sku: "13-1338" + }, + { + __typename: "ProductVariant", + id: "var3", + images: [ + { + __typename: "ProductImage", + id: "23123", + url: placeholderImage + } + ], + name: "Normal Hard", + sku: "13-1339" + }, + { + __typename: "ProductVariant", + id: "var4", + images: [ + { + __typename: "ProductImage", + id: "23123", + url: placeholderImage + } + ], + name: "Normal Soft", + sku: "13-1340" + } + ] + }, + quantity: 19, + quantityAllocated: 12, + sku: "1230959124123" +}); +export const variantImages = (placeholderImage: string) => + variant(placeholderImage).images; +export const variantProductImages = (placeholderImage: string) => + variant(placeholderImage).product.images; +export const variantSiblings = (placeholderImage: string) => + variant(placeholderImage).product.variants; diff --git a/src/products/index.tsx b/src/products/index.tsx new file mode 100644 index 000000000..d5023e58f --- /dev/null +++ b/src/products/index.tsx @@ -0,0 +1,113 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { + productAddPath, + productImagePath, + ProductImageUrlQueryParams, + productListPath, + ProductListUrlQueryParams, + productPath, + ProductUrlQueryParams, + productVariantAddPath, + productVariantEditPath, + ProductVariantEditUrlQueryParams +} from "./urls"; +import ProductCreate from "./views/ProductCreate"; +import ProductImageComponent from "./views/ProductImage"; +import ProductListComponent from "./views/ProductList"; +import ProductUpdateComponent from "./views/ProductUpdate"; +import ProductVariantComponent from "./views/ProductVariant"; +import ProductVariantCreateComponent from "./views/ProductVariantCreate"; + +const ProductList: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: ProductListUrlQueryParams = qs; + return ; +}; + +const ProductUpdate: React.StatelessComponent> = ({ + match +}) => { + const qs = parseQs(location.search.substr(1)); + const params: ProductUrlQueryParams = qs; + + return ( + + ); +}; + +const ProductVariant: React.StatelessComponent> = ({ + match +}) => { + const qs = parseQs(location.search.substr(1)); + const params: ProductVariantEditUrlQueryParams = qs; + + return ( + + ); +}; + +const ProductImage: React.StatelessComponent> = ({ + location, + match +}) => { + const qs = parseQs(location.search.substr(1)); + const params: ProductImageUrlQueryParams = qs; + + return ( + + ); +}; + +const ProductVariantCreate: React.StatelessComponent< + RouteComponentProps +> = ({ match }) => { + return ( + + ); +}; + +const Component = () => ( + <> + + + + + + + + + + +); + +export default Component; diff --git a/src/products/mutations.ts b/src/products/mutations.ts new file mode 100644 index 000000000..b8845d331 --- /dev/null +++ b/src/products/mutations.ts @@ -0,0 +1,468 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { ProductCreate, ProductCreateVariables } from "./types/ProductCreate"; +import { ProductDelete, ProductDeleteVariables } from "./types/ProductDelete"; +import { + ProductImageCreate, + ProductImageCreateVariables +} from "./types/ProductImageCreate"; +import { + ProductImageDelete, + ProductImageDeleteVariables +} from "./types/ProductImageDelete"; +import { + ProductImageReorder, + ProductImageReorderVariables +} from "./types/ProductImageReorder"; +import { + ProductImageUpdate, + ProductImageUpdateVariables +} from "./types/ProductImageUpdate"; +import { ProductUpdate, ProductUpdateVariables } from "./types/ProductUpdate"; +import { + SimpleProductUpdate, + SimpleProductUpdateVariables +} from "./types/SimpleProductUpdate"; +import { VariantCreate, VariantCreateVariables } from "./types/VariantCreate"; +import { VariantDelete, VariantDeleteVariables } from "./types/VariantDelete"; +import { + VariantImageAssign, + VariantImageAssignVariables +} from "./types/VariantImageAssign"; +import { + VariantImageUnassign, + VariantImageUnassignVariables +} from "./types/VariantImageUnassign"; +import { VariantUpdate, VariantUpdateVariables } from "./types/VariantUpdate"; + +import { fragmentVariant, productFragmentDetails } from "./queries"; +import { + productBulkDelete, + productBulkDeleteVariables +} from "./types/productBulkDelete"; +import { + productBulkPublish, + productBulkPublishVariables +} from "./types/productBulkPublish"; +import { + ProductVariantBulkDelete, + ProductVariantBulkDeleteVariables +} from "./types/ProductVariantBulkDelete"; + +export const productImageCreateMutation = gql` + ${productFragmentDetails} + mutation ProductImageCreate($product: ID!, $image: Upload!, $alt: String) { + productImageCreate(input: { alt: $alt, image: $image, product: $product }) { + errors { + field + message + } + product { + ...Product + } + } + } +`; +export const TypedProductImageCreateMutation = TypedMutation< + ProductImageCreate, + ProductImageCreateVariables +>(productImageCreateMutation); + +export const productDeleteMutation = gql` + mutation ProductDelete($id: ID!) { + productDelete(id: $id) { + errors { + field + message + } + product { + id + } + } + } +`; +export const TypedProductDeleteMutation = TypedMutation< + ProductDelete, + ProductDeleteVariables +>(productDeleteMutation); + +export const productImagesReorder = gql` + mutation ProductImageReorder($productId: ID!, $imagesIds: [ID]!) { + productImageReorder(productId: $productId, imagesIds: $imagesIds) { + errors { + field + message + } + product { + id + images { + id + alt + sortOrder + url + } + } + } + } +`; +export const TypedProductImagesReorder = TypedMutation< + ProductImageReorder, + ProductImageReorderVariables +>(productImagesReorder); + +export const productUpdateMutation = gql` + ${productFragmentDetails} + mutation ProductUpdate( + $id: ID! + $attributes: [AttributeValueInput] + $publicationDate: Date + $category: ID + $chargeTaxes: Boolean! + $collections: [ID] + $descriptionJson: JSONString + $isPublished: Boolean! + $name: String + $basePrice: Decimal + ) { + productUpdate( + id: $id + input: { + attributes: $attributes + publicationDate: $publicationDate + category: $category + chargeTaxes: $chargeTaxes + collections: $collections + descriptionJson: $descriptionJson + isPublished: $isPublished + name: $name + basePrice: $basePrice + } + ) { + errors { + field + message + } + product { + ...Product + } + } + } +`; +export const TypedProductUpdateMutation = TypedMutation< + ProductUpdate, + ProductUpdateVariables +>(productUpdateMutation); + +export const simpleProductUpdateMutation = gql` + ${productFragmentDetails} + ${fragmentVariant} + mutation SimpleProductUpdate( + $id: ID! + $attributes: [AttributeValueInput] + $publicationDate: Date + $category: ID + $chargeTaxes: Boolean! + $collections: [ID] + $descriptionJson: JSONString + $isPublished: Boolean! + $name: String + $basePrice: Decimal + $productVariantId: ID! + $productVariantInput: ProductVariantInput! + ) { + productUpdate( + id: $id + input: { + attributes: $attributes + publicationDate: $publicationDate + category: $category + chargeTaxes: $chargeTaxes + collections: $collections + descriptionJson: $descriptionJson + isPublished: $isPublished + name: $name + basePrice: $basePrice + } + ) { + errors { + field + message + } + product { + ...Product + } + } + productVariantUpdate(id: $productVariantId, input: $productVariantInput) { + errors { + field + message + } + productVariant { + ...ProductVariant + } + } + } +`; +export const TypedSimpleProductUpdateMutation = TypedMutation< + SimpleProductUpdate, + SimpleProductUpdateVariables +>(simpleProductUpdateMutation); + +export const productCreateMutation = gql` + ${productFragmentDetails} + mutation ProductCreate( + $attributes: [AttributeValueInput] + $publicationDate: Date + $category: ID! + $chargeTaxes: Boolean! + $collections: [ID] + $descriptionJson: JSONString + $isPublished: Boolean! + $name: String! + $basePrice: Decimal + $productType: ID! + $sku: String + $stockQuantity: Int + ) { + productCreate( + input: { + attributes: $attributes + publicationDate: $publicationDate + category: $category + chargeTaxes: $chargeTaxes + collections: $collections + descriptionJson: $descriptionJson + isPublished: $isPublished + name: $name + basePrice: $basePrice + productType: $productType + sku: $sku + quantity: $stockQuantity + } + ) { + errors { + field + message + } + product { + ...Product + } + } + } +`; +export const TypedProductCreateMutation = TypedMutation< + ProductCreate, + ProductCreateVariables +>(productCreateMutation); + +export const variantDeleteMutation = gql` + mutation VariantDelete($id: ID!) { + productVariantDelete(id: $id) { + errors { + field + message + } + productVariant { + id + } + } + } +`; +export const TypedVariantDeleteMutation = TypedMutation< + VariantDelete, + VariantDeleteVariables +>(variantDeleteMutation); + +export const variantUpdateMutation = gql` + ${fragmentVariant} + mutation VariantUpdate( + $id: ID! + $attributes: [AttributeValueInput] + $costPrice: Decimal + $priceOverride: Decimal + $sku: String + $quantity: Int + $trackInventory: Boolean! + ) { + productVariantUpdate( + id: $id + input: { + attributes: $attributes + costPrice: $costPrice + priceOverride: $priceOverride + sku: $sku + quantity: $quantity + trackInventory: $trackInventory + } + ) { + errors { + field + message + } + productVariant { + ...ProductVariant + } + } + } +`; +export const TypedVariantUpdateMutation = TypedMutation< + VariantUpdate, + VariantUpdateVariables +>(variantUpdateMutation); + +export const variantCreateMutation = gql` + ${fragmentVariant} + mutation VariantCreate( + $attributes: [AttributeValueInput]! + $costPrice: Decimal + $priceOverride: Decimal + $product: ID! + $sku: String + $quantity: Int + $trackInventory: Boolean! + ) { + productVariantCreate( + input: { + attributes: $attributes + costPrice: $costPrice + priceOverride: $priceOverride + product: $product + sku: $sku + quantity: $quantity + trackInventory: $trackInventory + } + ) { + errors { + field + message + } + productVariant { + ...ProductVariant + } + } + } +`; +export const TypedVariantCreateMutation = TypedMutation< + VariantCreate, + VariantCreateVariables +>(variantCreateMutation); + +export const productImageDeleteMutation = gql` + mutation ProductImageDelete($id: ID!) { + productImageDelete(id: $id) { + product { + id + images { + id + } + } + } + } +`; +export const TypedProductImageDeleteMutation = TypedMutation< + ProductImageDelete, + ProductImageDeleteVariables +>(productImageDeleteMutation); + +export const productImageUpdateMutation = gql` + ${productFragmentDetails} + mutation ProductImageUpdate($id: ID!, $alt: String!) { + productImageUpdate(id: $id, input: { alt: $alt }) { + errors { + field + message + } + product { + ...Product + } + } + } +`; +export const TypedProductImageUpdateMutation = TypedMutation< + ProductImageUpdate, + ProductImageUpdateVariables +>(productImageUpdateMutation); + +export const variantImageAssignMutation = gql` + ${fragmentVariant} + mutation VariantImageAssign($variantId: ID!, $imageId: ID!) { + variantImageAssign(variantId: $variantId, imageId: $imageId) { + errors { + field + message + } + productVariant { + ...ProductVariant + } + } + } +`; +export const TypedVariantImageAssignMutation = TypedMutation< + VariantImageAssign, + VariantImageAssignVariables +>(variantImageAssignMutation); + +export const variantImageUnassignMutation = gql` + ${fragmentVariant} + mutation VariantImageUnassign($variantId: ID!, $imageId: ID!) { + variantImageUnassign(variantId: $variantId, imageId: $imageId) { + errors { + field + message + } + productVariant { + ...ProductVariant + } + } + } +`; +export const TypedVariantImageUnassignMutation = TypedMutation< + VariantImageUnassign, + VariantImageUnassignVariables +>(variantImageUnassignMutation); + +export const productBulkDeleteMutation = gql` + mutation productBulkDelete($ids: [ID!]!) { + productBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedProductBulkDeleteMutation = TypedMutation< + productBulkDelete, + productBulkDeleteVariables +>(productBulkDeleteMutation); + +export const productBulkPublishMutation = gql` + mutation productBulkPublish($ids: [ID!]!, $isPublished: Boolean!) { + productBulkPublish(ids: $ids, isPublished: $isPublished) { + errors { + field + message + } + } + } +`; +export const TypedProductBulkPublishMutation = TypedMutation< + productBulkPublish, + productBulkPublishVariables +>(productBulkPublishMutation); + +export const ProductVariantBulkDeleteMutation = gql` + mutation ProductVariantBulkDelete($ids: [ID!]!) { + productVariantBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedProductVariantBulkDeleteMutation = TypedMutation< + ProductVariantBulkDelete, + ProductVariantBulkDeleteVariables +>(ProductVariantBulkDeleteMutation); diff --git a/src/products/queries.ts b/src/products/queries.ts new file mode 100644 index 000000000..84c3c345d --- /dev/null +++ b/src/products/queries.ts @@ -0,0 +1,358 @@ +import gql from "graphql-tag"; + +import { TypedQuery } from "../queries"; +import { ProductCreateData } from "./types/ProductCreateData"; +import { + ProductDetails, + ProductDetailsVariables +} from "./types/ProductDetails"; +import { + ProductImageById, + ProductImageByIdVariables +} from "./types/ProductImageById"; +import { ProductList, ProductListVariables } from "./types/ProductList"; +import { + ProductVariantCreateData, + ProductVariantCreateDataVariables +} from "./types/ProductVariantCreateData"; +import { + ProductVariantDetails, + ProductVariantDetailsVariables +} from "./types/ProductVariantDetails"; + +export const fragmentMoney = gql` + fragment Money on Money { + amount + currency + } +`; + +export const fragmentProductImage = gql` + fragment ProductImageFragment on ProductImage { + id + alt + sortOrder + url + } +`; + +export const productFragment = gql` + ${fragmentMoney} + fragment ProductFragment on Product { + id + name + thumbnail { + url + } + isAvailable + basePrice { + ...Money + } + productType { + id + name + } + } +`; +export const productFragmentDetails = gql` + ${fragmentProductImage} + ${fragmentMoney} + fragment Product on Product { + id + name + descriptionJson + seoTitle + seoDescription + category { + id + name + } + collections { + id + name + } + basePrice { + ...Money + } + margin { + start + stop + } + purchaseCost { + start { + ...Money + } + stop { + ...Money + } + } + isAvailable + isPublished + chargeTaxes + publicationDate + attributes { + attribute { + id + slug + name + values { + name + slug + } + } + value { + id + name + slug + } + } + pricing { + priceRange { + start { + net { + ...Money + } + } + stop { + net { + ...Money + } + } + } + } + images { + ...ProductImageFragment + } + variants { + id + sku + name + priceOverride { + ...Money + } + margin + quantity + quantityAllocated + stockQuantity + } + productType { + id + name + hasVariants + } + url + } +`; + +export const fragmentVariant = gql` + ${fragmentMoney} + ${fragmentProductImage} + fragment ProductVariant on ProductVariant { + id + attributes { + attribute { + id + name + slug + values { + id + name + slug + } + } + value { + id + name + slug + } + } + costPrice { + ...Money + } + images { + id + url + } + name + priceOverride { + ...Money + } + product { + id + images { + ...ProductImageFragment + } + name + thumbnail { + url + } + variants { + id + name + sku + images { + id + url + } + } + } + sku + quantity + quantityAllocated + } +`; + +const productListQuery = gql` + ${productFragment} + query ProductList( + $first: Int + $after: String + $last: Int + $before: String + $filter: ProductFilterInput + ) { + products( + before: $before + after: $after + first: $first + last: $last + filter: $filter + ) { + edges { + node { + ...ProductFragment + } + } + pageInfo { + hasPreviousPage + hasNextPage + startCursor + endCursor + } + } + } +`; +export const TypedProductListQuery = TypedQuery< + ProductList, + ProductListVariables +>(productListQuery); + +const productDetailsQuery = gql` + ${productFragmentDetails} + query ProductDetails($id: ID!) { + product(id: $id) { + ...Product + } + } +`; +export const TypedProductDetailsQuery = TypedQuery< + ProductDetails, + ProductDetailsVariables +>(productDetailsQuery); + +const productVariantQuery = gql` + ${fragmentVariant} + query ProductVariantDetails($id: ID!) { + productVariant(id: $id) { + ...ProductVariant + } + } +`; +export const TypedProductVariantQuery = TypedQuery< + ProductVariantDetails, + ProductVariantDetailsVariables +>(productVariantQuery); + +const productCreateQuery = gql` + query ProductCreateData { + productTypes(first: 20) { + edges { + node { + id + name + hasVariants + productAttributes { + id + slug + name + values { + id + sortOrder + name + slug + } + } + } + } + } + } +`; +export const TypedProductCreateQuery = TypedQuery( + productCreateQuery +); + +const productVariantCreateQuery = gql` + query ProductVariantCreateData($id: ID!) { + product(id: $id) { + id + images { + id + sortOrder + url + } + name + productType { + id + variantAttributes { + id + slug + name + values { + id + sortOrder + name + slug + } + } + } + thumbnail { + url + } + variants { + id + name + sku + images { + id + url + } + } + } + } +`; +export const TypedProductVariantCreateQuery = TypedQuery< + ProductVariantCreateData, + ProductVariantCreateDataVariables +>(productVariantCreateQuery); + +const productImageQuery = gql` + query ProductImageById($productId: ID!, $imageId: ID!) { + product(id: $productId) { + id + name + mainImage: imageById(id: $imageId) { + id + alt + url + } + images { + id + url(size: 48) + } + } + } +`; +export const TypedProductImageQuery = TypedQuery< + ProductImageById, + ProductImageByIdVariables +>(productImageQuery); diff --git a/src/products/types/Money.ts b/src/products/types/Money.ts new file mode 100644 index 000000000..f48f8fa9d --- /dev/null +++ b/src/products/types/Money.ts @@ -0,0 +1,13 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: Money +// ==================================================== + +export interface Money { + __typename: "Money"; + amount: number; + currency: string; +} diff --git a/src/products/types/Product.ts b/src/products/types/Product.ts new file mode 100644 index 000000000..2396b200b --- /dev/null +++ b/src/products/types/Product.ts @@ -0,0 +1,166 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: Product +// ==================================================== + +export interface Product_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface Product_collections { + __typename: "Collection"; + id: string; + name: string; +} + +export interface Product_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface Product_margin { + __typename: "Margin"; + start: number | null; + stop: number | null; +} + +export interface Product_purchaseCost_start { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface Product_purchaseCost_stop { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface Product_purchaseCost { + __typename: "MoneyRange"; + start: Product_purchaseCost_start | null; + stop: Product_purchaseCost_stop | null; +} + +export interface Product_attributes_attribute_values { + __typename: "AttributeValue"; + name: string | null; + slug: string | null; +} + +export interface Product_attributes_attribute { + __typename: "Attribute"; + id: string; + slug: string | null; + name: string | null; + values: (Product_attributes_attribute_values | null)[] | null; +} + +export interface Product_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface Product_attributes { + __typename: "SelectedAttribute"; + attribute: Product_attributes_attribute; + value: Product_attributes_value; +} + +export interface Product_pricing_priceRange_start_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface Product_pricing_priceRange_start { + __typename: "TaxedMoney"; + net: Product_pricing_priceRange_start_net; +} + +export interface Product_pricing_priceRange_stop_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface Product_pricing_priceRange_stop { + __typename: "TaxedMoney"; + net: Product_pricing_priceRange_stop_net; +} + +export interface Product_pricing_priceRange { + __typename: "TaxedMoneyRange"; + start: Product_pricing_priceRange_start | null; + stop: Product_pricing_priceRange_stop | null; +} + +export interface Product_pricing { + __typename: "ProductPricingInfo"; + priceRange: Product_pricing_priceRange | null; +} + +export interface Product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface Product_variants_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface Product_variants { + __typename: "ProductVariant"; + id: string; + sku: string; + name: string; + priceOverride: Product_variants_priceOverride | null; + margin: number | null; + quantity: number; + quantityAllocated: number; + stockQuantity: number; +} + +export interface Product_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; +} + +export interface Product { + __typename: "Product"; + id: string; + name: string; + descriptionJson: any; + seoTitle: string | null; + seoDescription: string | null; + category: Product_category; + collections: (Product_collections | null)[] | null; + basePrice: Product_basePrice | null; + margin: Product_margin | null; + purchaseCost: Product_purchaseCost | null; + isAvailable: boolean | null; + isPublished: boolean; + chargeTaxes: boolean; + publicationDate: any | null; + attributes: Product_attributes[]; + pricing: Product_pricing | null; + images: (Product_images | null)[] | null; + variants: (Product_variants | null)[] | null; + productType: Product_productType; + url: string; +} diff --git a/src/products/types/ProductCreate.ts b/src/products/types/ProductCreate.ts new file mode 100644 index 000000000..2ea047957 --- /dev/null +++ b/src/products/types/ProductCreate.ts @@ -0,0 +1,199 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AttributeValueInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: ProductCreate +// ==================================================== + +export interface ProductCreate_productCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductCreate_productCreate_product_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface ProductCreate_productCreate_product_collections { + __typename: "Collection"; + id: string; + name: string; +} + +export interface ProductCreate_productCreate_product_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductCreate_productCreate_product_margin { + __typename: "Margin"; + start: number | null; + stop: number | null; +} + +export interface ProductCreate_productCreate_product_purchaseCost_start { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductCreate_productCreate_product_purchaseCost_stop { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductCreate_productCreate_product_purchaseCost { + __typename: "MoneyRange"; + start: ProductCreate_productCreate_product_purchaseCost_start | null; + stop: ProductCreate_productCreate_product_purchaseCost_stop | null; +} + +export interface ProductCreate_productCreate_product_attributes_attribute_values { + __typename: "AttributeValue"; + name: string | null; + slug: string | null; +} + +export interface ProductCreate_productCreate_product_attributes_attribute { + __typename: "Attribute"; + id: string; + slug: string | null; + name: string | null; + values: (ProductCreate_productCreate_product_attributes_attribute_values | null)[] | null; +} + +export interface ProductCreate_productCreate_product_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductCreate_productCreate_product_attributes { + __typename: "SelectedAttribute"; + attribute: ProductCreate_productCreate_product_attributes_attribute; + value: ProductCreate_productCreate_product_attributes_value; +} + +export interface ProductCreate_productCreate_product_pricing_priceRange_start_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductCreate_productCreate_product_pricing_priceRange_start { + __typename: "TaxedMoney"; + net: ProductCreate_productCreate_product_pricing_priceRange_start_net; +} + +export interface ProductCreate_productCreate_product_pricing_priceRange_stop_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductCreate_productCreate_product_pricing_priceRange_stop { + __typename: "TaxedMoney"; + net: ProductCreate_productCreate_product_pricing_priceRange_stop_net; +} + +export interface ProductCreate_productCreate_product_pricing_priceRange { + __typename: "TaxedMoneyRange"; + start: ProductCreate_productCreate_product_pricing_priceRange_start | null; + stop: ProductCreate_productCreate_product_pricing_priceRange_stop | null; +} + +export interface ProductCreate_productCreate_product_pricing { + __typename: "ProductPricingInfo"; + priceRange: ProductCreate_productCreate_product_pricing_priceRange | null; +} + +export interface ProductCreate_productCreate_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface ProductCreate_productCreate_product_variants_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductCreate_productCreate_product_variants { + __typename: "ProductVariant"; + id: string; + sku: string; + name: string; + priceOverride: ProductCreate_productCreate_product_variants_priceOverride | null; + margin: number | null; + quantity: number; + quantityAllocated: number; + stockQuantity: number; +} + +export interface ProductCreate_productCreate_product_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; +} + +export interface ProductCreate_productCreate_product { + __typename: "Product"; + id: string; + name: string; + descriptionJson: any; + seoTitle: string | null; + seoDescription: string | null; + category: ProductCreate_productCreate_product_category; + collections: (ProductCreate_productCreate_product_collections | null)[] | null; + basePrice: ProductCreate_productCreate_product_basePrice | null; + margin: ProductCreate_productCreate_product_margin | null; + purchaseCost: ProductCreate_productCreate_product_purchaseCost | null; + isAvailable: boolean | null; + isPublished: boolean; + chargeTaxes: boolean; + publicationDate: any | null; + attributes: ProductCreate_productCreate_product_attributes[]; + pricing: ProductCreate_productCreate_product_pricing | null; + images: (ProductCreate_productCreate_product_images | null)[] | null; + variants: (ProductCreate_productCreate_product_variants | null)[] | null; + productType: ProductCreate_productCreate_product_productType; + url: string; +} + +export interface ProductCreate_productCreate { + __typename: "ProductCreate"; + errors: ProductCreate_productCreate_errors[] | null; + product: ProductCreate_productCreate_product | null; +} + +export interface ProductCreate { + productCreate: ProductCreate_productCreate | null; +} + +export interface ProductCreateVariables { + attributes?: (AttributeValueInput | null)[] | null; + publicationDate?: any | null; + category: string; + chargeTaxes: boolean; + collections?: (string | null)[] | null; + descriptionJson?: any | null; + isPublished: boolean; + name: string; + basePrice?: any | null; + productType: string; + sku?: string | null; + stockQuantity?: number | null; +} diff --git a/src/products/types/ProductCreateData.ts b/src/products/types/ProductCreateData.ts new file mode 100644 index 000000000..a19865341 --- /dev/null +++ b/src/products/types/ProductCreateData.ts @@ -0,0 +1,45 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: ProductCreateData +// ==================================================== + +export interface ProductCreateData_productTypes_edges_node_productAttributes_values { + __typename: "AttributeValue"; + id: string; + sortOrder: number | null; + name: string | null; + slug: string | null; +} + +export interface ProductCreateData_productTypes_edges_node_productAttributes { + __typename: "Attribute"; + id: string; + slug: string | null; + name: string | null; + values: (ProductCreateData_productTypes_edges_node_productAttributes_values | null)[] | null; +} + +export interface ProductCreateData_productTypes_edges_node { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; + productAttributes: (ProductCreateData_productTypes_edges_node_productAttributes | null)[] | null; +} + +export interface ProductCreateData_productTypes_edges { + __typename: "ProductTypeCountableEdge"; + node: ProductCreateData_productTypes_edges_node; +} + +export interface ProductCreateData_productTypes { + __typename: "ProductTypeCountableConnection"; + edges: ProductCreateData_productTypes_edges[]; +} + +export interface ProductCreateData { + productTypes: ProductCreateData_productTypes | null; +} diff --git a/src/products/types/ProductDelete.ts b/src/products/types/ProductDelete.ts new file mode 100644 index 000000000..d5efb26f1 --- /dev/null +++ b/src/products/types/ProductDelete.ts @@ -0,0 +1,32 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: ProductDelete +// ==================================================== + +export interface ProductDelete_productDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductDelete_productDelete_product { + __typename: "Product"; + id: string; +} + +export interface ProductDelete_productDelete { + __typename: "ProductDelete"; + errors: ProductDelete_productDelete_errors[] | null; + product: ProductDelete_productDelete_product | null; +} + +export interface ProductDelete { + productDelete: ProductDelete_productDelete | null; +} + +export interface ProductDeleteVariables { + id: string; +} diff --git a/src/products/types/ProductDetails.ts b/src/products/types/ProductDetails.ts new file mode 100644 index 000000000..4e0326d16 --- /dev/null +++ b/src/products/types/ProductDetails.ts @@ -0,0 +1,174 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: ProductDetails +// ==================================================== + +export interface ProductDetails_product_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface ProductDetails_product_collections { + __typename: "Collection"; + id: string; + name: string; +} + +export interface ProductDetails_product_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductDetails_product_margin { + __typename: "Margin"; + start: number | null; + stop: number | null; +} + +export interface ProductDetails_product_purchaseCost_start { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductDetails_product_purchaseCost_stop { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductDetails_product_purchaseCost { + __typename: "MoneyRange"; + start: ProductDetails_product_purchaseCost_start | null; + stop: ProductDetails_product_purchaseCost_stop | null; +} + +export interface ProductDetails_product_attributes_attribute_values { + __typename: "AttributeValue"; + name: string | null; + slug: string | null; +} + +export interface ProductDetails_product_attributes_attribute { + __typename: "Attribute"; + id: string; + slug: string | null; + name: string | null; + values: (ProductDetails_product_attributes_attribute_values | null)[] | null; +} + +export interface ProductDetails_product_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductDetails_product_attributes { + __typename: "SelectedAttribute"; + attribute: ProductDetails_product_attributes_attribute; + value: ProductDetails_product_attributes_value; +} + +export interface ProductDetails_product_pricing_priceRange_start_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductDetails_product_pricing_priceRange_start { + __typename: "TaxedMoney"; + net: ProductDetails_product_pricing_priceRange_start_net; +} + +export interface ProductDetails_product_pricing_priceRange_stop_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductDetails_product_pricing_priceRange_stop { + __typename: "TaxedMoney"; + net: ProductDetails_product_pricing_priceRange_stop_net; +} + +export interface ProductDetails_product_pricing_priceRange { + __typename: "TaxedMoneyRange"; + start: ProductDetails_product_pricing_priceRange_start | null; + stop: ProductDetails_product_pricing_priceRange_stop | null; +} + +export interface ProductDetails_product_pricing { + __typename: "ProductPricingInfo"; + priceRange: ProductDetails_product_pricing_priceRange | null; +} + +export interface ProductDetails_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface ProductDetails_product_variants_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductDetails_product_variants { + __typename: "ProductVariant"; + id: string; + sku: string; + name: string; + priceOverride: ProductDetails_product_variants_priceOverride | null; + margin: number | null; + quantity: number; + quantityAllocated: number; + stockQuantity: number; +} + +export interface ProductDetails_product_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; +} + +export interface ProductDetails_product { + __typename: "Product"; + id: string; + name: string; + descriptionJson: any; + seoTitle: string | null; + seoDescription: string | null; + category: ProductDetails_product_category; + collections: (ProductDetails_product_collections | null)[] | null; + basePrice: ProductDetails_product_basePrice | null; + margin: ProductDetails_product_margin | null; + purchaseCost: ProductDetails_product_purchaseCost | null; + isAvailable: boolean | null; + isPublished: boolean; + chargeTaxes: boolean; + publicationDate: any | null; + attributes: ProductDetails_product_attributes[]; + pricing: ProductDetails_product_pricing | null; + images: (ProductDetails_product_images | null)[] | null; + variants: (ProductDetails_product_variants | null)[] | null; + productType: ProductDetails_product_productType; + url: string; +} + +export interface ProductDetails { + product: ProductDetails_product | null; +} + +export interface ProductDetailsVariables { + id: string; +} diff --git a/src/products/types/ProductFragment.ts b/src/products/types/ProductFragment.ts new file mode 100644 index 000000000..7187a9791 --- /dev/null +++ b/src/products/types/ProductFragment.ts @@ -0,0 +1,34 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: ProductFragment +// ==================================================== + +export interface ProductFragment_thumbnail { + __typename: "Image"; + url: string; +} + +export interface ProductFragment_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductFragment_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface ProductFragment { + __typename: "Product"; + id: string; + name: string; + thumbnail: ProductFragment_thumbnail | null; + isAvailable: boolean | null; + basePrice: ProductFragment_basePrice | null; + productType: ProductFragment_productType; +} diff --git a/src/products/types/ProductImage.ts b/src/products/types/ProductImage.ts new file mode 100644 index 000000000..8a5b981af --- /dev/null +++ b/src/products/types/ProductImage.ts @@ -0,0 +1,14 @@ +/* tslint:disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: ProductImage +// ==================================================== + +export interface ProductImage { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number; + url: string; +} diff --git a/src/products/types/ProductImageById.ts b/src/products/types/ProductImageById.ts new file mode 100644 index 000000000..d5fc6ef97 --- /dev/null +++ b/src/products/types/ProductImageById.ts @@ -0,0 +1,37 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: ProductImageById +// ==================================================== + +export interface ProductImageById_product_mainImage { + __typename: "ProductImage"; + id: string; + alt: string; + url: string; +} + +export interface ProductImageById_product_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface ProductImageById_product { + __typename: "Product"; + id: string; + name: string; + mainImage: ProductImageById_product_mainImage | null; + images: (ProductImageById_product_images | null)[] | null; +} + +export interface ProductImageById { + product: ProductImageById_product | null; +} + +export interface ProductImageByIdVariables { + productId: string; + imageId: string; +} diff --git a/src/products/types/ProductImageCreate.ts b/src/products/types/ProductImageCreate.ts new file mode 100644 index 000000000..1e4baa729 --- /dev/null +++ b/src/products/types/ProductImageCreate.ts @@ -0,0 +1,188 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: ProductImageCreate +// ==================================================== + +export interface ProductImageCreate_productImageCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductImageCreate_productImageCreate_product_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface ProductImageCreate_productImageCreate_product_collections { + __typename: "Collection"; + id: string; + name: string; +} + +export interface ProductImageCreate_productImageCreate_product_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageCreate_productImageCreate_product_margin { + __typename: "Margin"; + start: number | null; + stop: number | null; +} + +export interface ProductImageCreate_productImageCreate_product_purchaseCost_start { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageCreate_productImageCreate_product_purchaseCost_stop { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageCreate_productImageCreate_product_purchaseCost { + __typename: "MoneyRange"; + start: ProductImageCreate_productImageCreate_product_purchaseCost_start | null; + stop: ProductImageCreate_productImageCreate_product_purchaseCost_stop | null; +} + +export interface ProductImageCreate_productImageCreate_product_attributes_attribute_values { + __typename: "AttributeValue"; + name: string | null; + slug: string | null; +} + +export interface ProductImageCreate_productImageCreate_product_attributes_attribute { + __typename: "Attribute"; + id: string; + slug: string | null; + name: string | null; + values: (ProductImageCreate_productImageCreate_product_attributes_attribute_values | null)[] | null; +} + +export interface ProductImageCreate_productImageCreate_product_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductImageCreate_productImageCreate_product_attributes { + __typename: "SelectedAttribute"; + attribute: ProductImageCreate_productImageCreate_product_attributes_attribute; + value: ProductImageCreate_productImageCreate_product_attributes_value; +} + +export interface ProductImageCreate_productImageCreate_product_pricing_priceRange_start_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageCreate_productImageCreate_product_pricing_priceRange_start { + __typename: "TaxedMoney"; + net: ProductImageCreate_productImageCreate_product_pricing_priceRange_start_net; +} + +export interface ProductImageCreate_productImageCreate_product_pricing_priceRange_stop_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageCreate_productImageCreate_product_pricing_priceRange_stop { + __typename: "TaxedMoney"; + net: ProductImageCreate_productImageCreate_product_pricing_priceRange_stop_net; +} + +export interface ProductImageCreate_productImageCreate_product_pricing_priceRange { + __typename: "TaxedMoneyRange"; + start: ProductImageCreate_productImageCreate_product_pricing_priceRange_start | null; + stop: ProductImageCreate_productImageCreate_product_pricing_priceRange_stop | null; +} + +export interface ProductImageCreate_productImageCreate_product_pricing { + __typename: "ProductPricingInfo"; + priceRange: ProductImageCreate_productImageCreate_product_pricing_priceRange | null; +} + +export interface ProductImageCreate_productImageCreate_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface ProductImageCreate_productImageCreate_product_variants_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageCreate_productImageCreate_product_variants { + __typename: "ProductVariant"; + id: string; + sku: string; + name: string; + priceOverride: ProductImageCreate_productImageCreate_product_variants_priceOverride | null; + margin: number | null; + quantity: number; + quantityAllocated: number; + stockQuantity: number; +} + +export interface ProductImageCreate_productImageCreate_product_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; +} + +export interface ProductImageCreate_productImageCreate_product { + __typename: "Product"; + id: string; + name: string; + descriptionJson: any; + seoTitle: string | null; + seoDescription: string | null; + category: ProductImageCreate_productImageCreate_product_category; + collections: (ProductImageCreate_productImageCreate_product_collections | null)[] | null; + basePrice: ProductImageCreate_productImageCreate_product_basePrice | null; + margin: ProductImageCreate_productImageCreate_product_margin | null; + purchaseCost: ProductImageCreate_productImageCreate_product_purchaseCost | null; + isAvailable: boolean | null; + isPublished: boolean; + chargeTaxes: boolean; + publicationDate: any | null; + attributes: ProductImageCreate_productImageCreate_product_attributes[]; + pricing: ProductImageCreate_productImageCreate_product_pricing | null; + images: (ProductImageCreate_productImageCreate_product_images | null)[] | null; + variants: (ProductImageCreate_productImageCreate_product_variants | null)[] | null; + productType: ProductImageCreate_productImageCreate_product_productType; + url: string; +} + +export interface ProductImageCreate_productImageCreate { + __typename: "ProductImageCreate"; + errors: ProductImageCreate_productImageCreate_errors[] | null; + product: ProductImageCreate_productImageCreate_product | null; +} + +export interface ProductImageCreate { + productImageCreate: ProductImageCreate_productImageCreate | null; +} + +export interface ProductImageCreateVariables { + product: string; + image: any; + alt?: string | null; +} diff --git a/src/products/types/ProductImageDelete.ts b/src/products/types/ProductImageDelete.ts new file mode 100644 index 000000000..4d55c57a8 --- /dev/null +++ b/src/products/types/ProductImageDelete.ts @@ -0,0 +1,31 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: ProductImageDelete +// ==================================================== + +export interface ProductImageDelete_productImageDelete_product_images { + __typename: "ProductImage"; + id: string; +} + +export interface ProductImageDelete_productImageDelete_product { + __typename: "Product"; + id: string; + images: (ProductImageDelete_productImageDelete_product_images | null)[] | null; +} + +export interface ProductImageDelete_productImageDelete { + __typename: "ProductImageDelete"; + product: ProductImageDelete_productImageDelete_product | null; +} + +export interface ProductImageDelete { + productImageDelete: ProductImageDelete_productImageDelete | null; +} + +export interface ProductImageDeleteVariables { + id: string; +} diff --git a/src/products/types/ProductImageFragment.ts b/src/products/types/ProductImageFragment.ts new file mode 100644 index 000000000..de4e5b5ca --- /dev/null +++ b/src/products/types/ProductImageFragment.ts @@ -0,0 +1,15 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: ProductImageFragment +// ==================================================== + +export interface ProductImageFragment { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} diff --git a/src/products/types/ProductImageReorder.ts b/src/products/types/ProductImageReorder.ts new file mode 100644 index 000000000..4e5960389 --- /dev/null +++ b/src/products/types/ProductImageReorder.ts @@ -0,0 +1,42 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: ProductImageReorder +// ==================================================== + +export interface ProductImageReorder_productImageReorder_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductImageReorder_productImageReorder_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface ProductImageReorder_productImageReorder_product { + __typename: "Product"; + id: string; + images: (ProductImageReorder_productImageReorder_product_images | null)[] | null; +} + +export interface ProductImageReorder_productImageReorder { + __typename: "ProductImageReorder"; + errors: ProductImageReorder_productImageReorder_errors[] | null; + product: ProductImageReorder_productImageReorder_product | null; +} + +export interface ProductImageReorder { + productImageReorder: ProductImageReorder_productImageReorder | null; +} + +export interface ProductImageReorderVariables { + productId: string; + imagesIds: (string | null)[]; +} diff --git a/src/products/types/ProductImageUpdate.ts b/src/products/types/ProductImageUpdate.ts new file mode 100644 index 000000000..bd2a9d178 --- /dev/null +++ b/src/products/types/ProductImageUpdate.ts @@ -0,0 +1,187 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: ProductImageUpdate +// ==================================================== + +export interface ProductImageUpdate_productImageUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductImageUpdate_productImageUpdate_product_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface ProductImageUpdate_productImageUpdate_product_collections { + __typename: "Collection"; + id: string; + name: string; +} + +export interface ProductImageUpdate_productImageUpdate_product_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageUpdate_productImageUpdate_product_margin { + __typename: "Margin"; + start: number | null; + stop: number | null; +} + +export interface ProductImageUpdate_productImageUpdate_product_purchaseCost_start { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageUpdate_productImageUpdate_product_purchaseCost_stop { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageUpdate_productImageUpdate_product_purchaseCost { + __typename: "MoneyRange"; + start: ProductImageUpdate_productImageUpdate_product_purchaseCost_start | null; + stop: ProductImageUpdate_productImageUpdate_product_purchaseCost_stop | null; +} + +export interface ProductImageUpdate_productImageUpdate_product_attributes_attribute_values { + __typename: "AttributeValue"; + name: string | null; + slug: string | null; +} + +export interface ProductImageUpdate_productImageUpdate_product_attributes_attribute { + __typename: "Attribute"; + id: string; + slug: string | null; + name: string | null; + values: (ProductImageUpdate_productImageUpdate_product_attributes_attribute_values | null)[] | null; +} + +export interface ProductImageUpdate_productImageUpdate_product_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductImageUpdate_productImageUpdate_product_attributes { + __typename: "SelectedAttribute"; + attribute: ProductImageUpdate_productImageUpdate_product_attributes_attribute; + value: ProductImageUpdate_productImageUpdate_product_attributes_value; +} + +export interface ProductImageUpdate_productImageUpdate_product_pricing_priceRange_start_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageUpdate_productImageUpdate_product_pricing_priceRange_start { + __typename: "TaxedMoney"; + net: ProductImageUpdate_productImageUpdate_product_pricing_priceRange_start_net; +} + +export interface ProductImageUpdate_productImageUpdate_product_pricing_priceRange_stop_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageUpdate_productImageUpdate_product_pricing_priceRange_stop { + __typename: "TaxedMoney"; + net: ProductImageUpdate_productImageUpdate_product_pricing_priceRange_stop_net; +} + +export interface ProductImageUpdate_productImageUpdate_product_pricing_priceRange { + __typename: "TaxedMoneyRange"; + start: ProductImageUpdate_productImageUpdate_product_pricing_priceRange_start | null; + stop: ProductImageUpdate_productImageUpdate_product_pricing_priceRange_stop | null; +} + +export interface ProductImageUpdate_productImageUpdate_product_pricing { + __typename: "ProductPricingInfo"; + priceRange: ProductImageUpdate_productImageUpdate_product_pricing_priceRange | null; +} + +export interface ProductImageUpdate_productImageUpdate_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface ProductImageUpdate_productImageUpdate_product_variants_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductImageUpdate_productImageUpdate_product_variants { + __typename: "ProductVariant"; + id: string; + sku: string; + name: string; + priceOverride: ProductImageUpdate_productImageUpdate_product_variants_priceOverride | null; + margin: number | null; + quantity: number; + quantityAllocated: number; + stockQuantity: number; +} + +export interface ProductImageUpdate_productImageUpdate_product_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; +} + +export interface ProductImageUpdate_productImageUpdate_product { + __typename: "Product"; + id: string; + name: string; + descriptionJson: any; + seoTitle: string | null; + seoDescription: string | null; + category: ProductImageUpdate_productImageUpdate_product_category; + collections: (ProductImageUpdate_productImageUpdate_product_collections | null)[] | null; + basePrice: ProductImageUpdate_productImageUpdate_product_basePrice | null; + margin: ProductImageUpdate_productImageUpdate_product_margin | null; + purchaseCost: ProductImageUpdate_productImageUpdate_product_purchaseCost | null; + isAvailable: boolean | null; + isPublished: boolean; + chargeTaxes: boolean; + publicationDate: any | null; + attributes: ProductImageUpdate_productImageUpdate_product_attributes[]; + pricing: ProductImageUpdate_productImageUpdate_product_pricing | null; + images: (ProductImageUpdate_productImageUpdate_product_images | null)[] | null; + variants: (ProductImageUpdate_productImageUpdate_product_variants | null)[] | null; + productType: ProductImageUpdate_productImageUpdate_product_productType; + url: string; +} + +export interface ProductImageUpdate_productImageUpdate { + __typename: "ProductImageUpdate"; + errors: ProductImageUpdate_productImageUpdate_errors[] | null; + product: ProductImageUpdate_productImageUpdate_product | null; +} + +export interface ProductImageUpdate { + productImageUpdate: ProductImageUpdate_productImageUpdate | null; +} + +export interface ProductImageUpdateVariables { + id: string; + alt: string; +} diff --git a/src/products/types/ProductList.ts b/src/products/types/ProductList.ts new file mode 100644 index 000000000..075889875 --- /dev/null +++ b/src/products/types/ProductList.ts @@ -0,0 +1,67 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ProductFilterInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: ProductList +// ==================================================== + +export interface ProductList_products_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface ProductList_products_edges_node_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductList_products_edges_node_productType { + __typename: "ProductType"; + id: string; + name: string; +} + +export interface ProductList_products_edges_node { + __typename: "Product"; + id: string; + name: string; + thumbnail: ProductList_products_edges_node_thumbnail | null; + isAvailable: boolean | null; + basePrice: ProductList_products_edges_node_basePrice | null; + productType: ProductList_products_edges_node_productType; +} + +export interface ProductList_products_edges { + __typename: "ProductCountableEdge"; + node: ProductList_products_edges_node; +} + +export interface ProductList_products_pageInfo { + __typename: "PageInfo"; + hasPreviousPage: boolean; + hasNextPage: boolean; + startCursor: string | null; + endCursor: string | null; +} + +export interface ProductList_products { + __typename: "ProductCountableConnection"; + edges: ProductList_products_edges[]; + pageInfo: ProductList_products_pageInfo; +} + +export interface ProductList { + products: ProductList_products | null; +} + +export interface ProductListVariables { + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; + filter?: ProductFilterInput | null; +} diff --git a/src/products/types/ProductUpdate.ts b/src/products/types/ProductUpdate.ts new file mode 100644 index 000000000..0b8795836 --- /dev/null +++ b/src/products/types/ProductUpdate.ts @@ -0,0 +1,197 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AttributeValueInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: ProductUpdate +// ==================================================== + +export interface ProductUpdate_productUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductUpdate_productUpdate_product_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface ProductUpdate_productUpdate_product_collections { + __typename: "Collection"; + id: string; + name: string; +} + +export interface ProductUpdate_productUpdate_product_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductUpdate_productUpdate_product_margin { + __typename: "Margin"; + start: number | null; + stop: number | null; +} + +export interface ProductUpdate_productUpdate_product_purchaseCost_start { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductUpdate_productUpdate_product_purchaseCost_stop { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductUpdate_productUpdate_product_purchaseCost { + __typename: "MoneyRange"; + start: ProductUpdate_productUpdate_product_purchaseCost_start | null; + stop: ProductUpdate_productUpdate_product_purchaseCost_stop | null; +} + +export interface ProductUpdate_productUpdate_product_attributes_attribute_values { + __typename: "AttributeValue"; + name: string | null; + slug: string | null; +} + +export interface ProductUpdate_productUpdate_product_attributes_attribute { + __typename: "Attribute"; + id: string; + slug: string | null; + name: string | null; + values: (ProductUpdate_productUpdate_product_attributes_attribute_values | null)[] | null; +} + +export interface ProductUpdate_productUpdate_product_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductUpdate_productUpdate_product_attributes { + __typename: "SelectedAttribute"; + attribute: ProductUpdate_productUpdate_product_attributes_attribute; + value: ProductUpdate_productUpdate_product_attributes_value; +} + +export interface ProductUpdate_productUpdate_product_pricing_priceRange_start_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductUpdate_productUpdate_product_pricing_priceRange_start { + __typename: "TaxedMoney"; + net: ProductUpdate_productUpdate_product_pricing_priceRange_start_net; +} + +export interface ProductUpdate_productUpdate_product_pricing_priceRange_stop_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductUpdate_productUpdate_product_pricing_priceRange_stop { + __typename: "TaxedMoney"; + net: ProductUpdate_productUpdate_product_pricing_priceRange_stop_net; +} + +export interface ProductUpdate_productUpdate_product_pricing_priceRange { + __typename: "TaxedMoneyRange"; + start: ProductUpdate_productUpdate_product_pricing_priceRange_start | null; + stop: ProductUpdate_productUpdate_product_pricing_priceRange_stop | null; +} + +export interface ProductUpdate_productUpdate_product_pricing { + __typename: "ProductPricingInfo"; + priceRange: ProductUpdate_productUpdate_product_pricing_priceRange | null; +} + +export interface ProductUpdate_productUpdate_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface ProductUpdate_productUpdate_product_variants_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductUpdate_productUpdate_product_variants { + __typename: "ProductVariant"; + id: string; + sku: string; + name: string; + priceOverride: ProductUpdate_productUpdate_product_variants_priceOverride | null; + margin: number | null; + quantity: number; + quantityAllocated: number; + stockQuantity: number; +} + +export interface ProductUpdate_productUpdate_product_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; +} + +export interface ProductUpdate_productUpdate_product { + __typename: "Product"; + id: string; + name: string; + descriptionJson: any; + seoTitle: string | null; + seoDescription: string | null; + category: ProductUpdate_productUpdate_product_category; + collections: (ProductUpdate_productUpdate_product_collections | null)[] | null; + basePrice: ProductUpdate_productUpdate_product_basePrice | null; + margin: ProductUpdate_productUpdate_product_margin | null; + purchaseCost: ProductUpdate_productUpdate_product_purchaseCost | null; + isAvailable: boolean | null; + isPublished: boolean; + chargeTaxes: boolean; + publicationDate: any | null; + attributes: ProductUpdate_productUpdate_product_attributes[]; + pricing: ProductUpdate_productUpdate_product_pricing | null; + images: (ProductUpdate_productUpdate_product_images | null)[] | null; + variants: (ProductUpdate_productUpdate_product_variants | null)[] | null; + productType: ProductUpdate_productUpdate_product_productType; + url: string; +} + +export interface ProductUpdate_productUpdate { + __typename: "ProductUpdate"; + errors: ProductUpdate_productUpdate_errors[] | null; + product: ProductUpdate_productUpdate_product | null; +} + +export interface ProductUpdate { + productUpdate: ProductUpdate_productUpdate | null; +} + +export interface ProductUpdateVariables { + id: string; + attributes?: (AttributeValueInput | null)[] | null; + publicationDate?: any | null; + category?: string | null; + chargeTaxes: boolean; + collections?: (string | null)[] | null; + descriptionJson?: any | null; + isPublished: boolean; + name?: string | null; + basePrice?: any | null; +} diff --git a/src/products/types/ProductVariant.ts b/src/products/types/ProductVariant.ts new file mode 100644 index 000000000..86239a599 --- /dev/null +++ b/src/products/types/ProductVariant.ts @@ -0,0 +1,103 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: ProductVariant +// ==================================================== + +export interface ProductVariant_attributes_attribute_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductVariant_attributes_attribute { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductVariant_attributes_attribute_values | null)[] | null; +} + +export interface ProductVariant_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductVariant_attributes { + __typename: "SelectedAttribute"; + attribute: ProductVariant_attributes_attribute; + value: ProductVariant_attributes_value; +} + +export interface ProductVariant_costPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductVariant_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface ProductVariant_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductVariant_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface ProductVariant_product_thumbnail { + __typename: "Image"; + url: string; +} + +export interface ProductVariant_product_variants_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface ProductVariant_product_variants { + __typename: "ProductVariant"; + id: string; + name: string; + sku: string; + images: (ProductVariant_product_variants_images | null)[] | null; +} + +export interface ProductVariant_product { + __typename: "Product"; + id: string; + images: (ProductVariant_product_images | null)[] | null; + name: string; + thumbnail: ProductVariant_product_thumbnail | null; + variants: (ProductVariant_product_variants | null)[] | null; +} + +export interface ProductVariant { + __typename: "ProductVariant"; + id: string; + attributes: ProductVariant_attributes[]; + costPrice: ProductVariant_costPrice | null; + images: (ProductVariant_images | null)[] | null; + name: string; + priceOverride: ProductVariant_priceOverride | null; + product: ProductVariant_product; + sku: string; + quantity: number; + quantityAllocated: number; +} diff --git a/src/products/types/ProductVariantBulkDelete.ts b/src/products/types/ProductVariantBulkDelete.ts new file mode 100644 index 000000000..d77fb6ca3 --- /dev/null +++ b/src/products/types/ProductVariantBulkDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: ProductVariantBulkDelete +// ==================================================== + +export interface ProductVariantBulkDelete_productVariantBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ProductVariantBulkDelete_productVariantBulkDelete { + __typename: "ProductVariantBulkDelete"; + errors: ProductVariantBulkDelete_productVariantBulkDelete_errors[] | null; +} + +export interface ProductVariantBulkDelete { + productVariantBulkDelete: ProductVariantBulkDelete_productVariantBulkDelete | null; +} + +export interface ProductVariantBulkDeleteVariables { + ids: string[]; +} diff --git a/src/products/types/ProductVariantCreateData.ts b/src/products/types/ProductVariantCreateData.ts new file mode 100644 index 000000000..956873a6a --- /dev/null +++ b/src/products/types/ProductVariantCreateData.ts @@ -0,0 +1,73 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: ProductVariantCreateData +// ==================================================== + +export interface ProductVariantCreateData_product_images { + __typename: "ProductImage"; + id: string; + sortOrder: number | null; + url: string; +} + +export interface ProductVariantCreateData_product_productType_variantAttributes_values { + __typename: "AttributeValue"; + id: string; + sortOrder: number | null; + name: string | null; + slug: string | null; +} + +export interface ProductVariantCreateData_product_productType_variantAttributes { + __typename: "Attribute"; + id: string; + slug: string | null; + name: string | null; + values: (ProductVariantCreateData_product_productType_variantAttributes_values | null)[] | null; +} + +export interface ProductVariantCreateData_product_productType { + __typename: "ProductType"; + id: string; + variantAttributes: (ProductVariantCreateData_product_productType_variantAttributes | null)[] | null; +} + +export interface ProductVariantCreateData_product_thumbnail { + __typename: "Image"; + url: string; +} + +export interface ProductVariantCreateData_product_variants_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface ProductVariantCreateData_product_variants { + __typename: "ProductVariant"; + id: string; + name: string; + sku: string; + images: (ProductVariantCreateData_product_variants_images | null)[] | null; +} + +export interface ProductVariantCreateData_product { + __typename: "Product"; + id: string; + images: (ProductVariantCreateData_product_images | null)[] | null; + name: string; + productType: ProductVariantCreateData_product_productType; + thumbnail: ProductVariantCreateData_product_thumbnail | null; + variants: (ProductVariantCreateData_product_variants | null)[] | null; +} + +export interface ProductVariantCreateData { + product: ProductVariantCreateData_product | null; +} + +export interface ProductVariantCreateDataVariables { + id: string; +} diff --git a/src/products/types/ProductVariantDetails.ts b/src/products/types/ProductVariantDetails.ts new file mode 100644 index 000000000..d7337cbac --- /dev/null +++ b/src/products/types/ProductVariantDetails.ts @@ -0,0 +1,111 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: ProductVariantDetails +// ==================================================== + +export interface ProductVariantDetails_productVariant_attributes_attribute_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductVariantDetails_productVariant_attributes_attribute { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (ProductVariantDetails_productVariant_attributes_attribute_values | null)[] | null; +} + +export interface ProductVariantDetails_productVariant_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface ProductVariantDetails_productVariant_attributes { + __typename: "SelectedAttribute"; + attribute: ProductVariantDetails_productVariant_attributes_attribute; + value: ProductVariantDetails_productVariant_attributes_value; +} + +export interface ProductVariantDetails_productVariant_costPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductVariantDetails_productVariant_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface ProductVariantDetails_productVariant_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ProductVariantDetails_productVariant_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface ProductVariantDetails_productVariant_product_thumbnail { + __typename: "Image"; + url: string; +} + +export interface ProductVariantDetails_productVariant_product_variants_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface ProductVariantDetails_productVariant_product_variants { + __typename: "ProductVariant"; + id: string; + name: string; + sku: string; + images: (ProductVariantDetails_productVariant_product_variants_images | null)[] | null; +} + +export interface ProductVariantDetails_productVariant_product { + __typename: "Product"; + id: string; + images: (ProductVariantDetails_productVariant_product_images | null)[] | null; + name: string; + thumbnail: ProductVariantDetails_productVariant_product_thumbnail | null; + variants: (ProductVariantDetails_productVariant_product_variants | null)[] | null; +} + +export interface ProductVariantDetails_productVariant { + __typename: "ProductVariant"; + id: string; + attributes: ProductVariantDetails_productVariant_attributes[]; + costPrice: ProductVariantDetails_productVariant_costPrice | null; + images: (ProductVariantDetails_productVariant_images | null)[] | null; + name: string; + priceOverride: ProductVariantDetails_productVariant_priceOverride | null; + product: ProductVariantDetails_productVariant_product; + sku: string; + quantity: number; + quantityAllocated: number; +} + +export interface ProductVariantDetails { + productVariant: ProductVariantDetails_productVariant | null; +} + +export interface ProductVariantDetailsVariables { + id: string; +} diff --git a/src/products/types/SimpleProductUpdate.ts b/src/products/types/SimpleProductUpdate.ts new file mode 100644 index 000000000..66563c9aa --- /dev/null +++ b/src/products/types/SimpleProductUpdate.ts @@ -0,0 +1,308 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AttributeValueInput, ProductVariantInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: SimpleProductUpdate +// ==================================================== + +export interface SimpleProductUpdate_productUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface SimpleProductUpdate_productUpdate_product_category { + __typename: "Category"; + id: string; + name: string; +} + +export interface SimpleProductUpdate_productUpdate_product_collections { + __typename: "Collection"; + id: string; + name: string; +} + +export interface SimpleProductUpdate_productUpdate_product_basePrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface SimpleProductUpdate_productUpdate_product_margin { + __typename: "Margin"; + start: number | null; + stop: number | null; +} + +export interface SimpleProductUpdate_productUpdate_product_purchaseCost_start { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface SimpleProductUpdate_productUpdate_product_purchaseCost_stop { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface SimpleProductUpdate_productUpdate_product_purchaseCost { + __typename: "MoneyRange"; + start: SimpleProductUpdate_productUpdate_product_purchaseCost_start | null; + stop: SimpleProductUpdate_productUpdate_product_purchaseCost_stop | null; +} + +export interface SimpleProductUpdate_productUpdate_product_attributes_attribute_values { + __typename: "AttributeValue"; + name: string | null; + slug: string | null; +} + +export interface SimpleProductUpdate_productUpdate_product_attributes_attribute { + __typename: "Attribute"; + id: string; + slug: string | null; + name: string | null; + values: (SimpleProductUpdate_productUpdate_product_attributes_attribute_values | null)[] | null; +} + +export interface SimpleProductUpdate_productUpdate_product_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface SimpleProductUpdate_productUpdate_product_attributes { + __typename: "SelectedAttribute"; + attribute: SimpleProductUpdate_productUpdate_product_attributes_attribute; + value: SimpleProductUpdate_productUpdate_product_attributes_value; +} + +export interface SimpleProductUpdate_productUpdate_product_pricing_priceRange_start_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface SimpleProductUpdate_productUpdate_product_pricing_priceRange_start { + __typename: "TaxedMoney"; + net: SimpleProductUpdate_productUpdate_product_pricing_priceRange_start_net; +} + +export interface SimpleProductUpdate_productUpdate_product_pricing_priceRange_stop_net { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface SimpleProductUpdate_productUpdate_product_pricing_priceRange_stop { + __typename: "TaxedMoney"; + net: SimpleProductUpdate_productUpdate_product_pricing_priceRange_stop_net; +} + +export interface SimpleProductUpdate_productUpdate_product_pricing_priceRange { + __typename: "TaxedMoneyRange"; + start: SimpleProductUpdate_productUpdate_product_pricing_priceRange_start | null; + stop: SimpleProductUpdate_productUpdate_product_pricing_priceRange_stop | null; +} + +export interface SimpleProductUpdate_productUpdate_product_pricing { + __typename: "ProductPricingInfo"; + priceRange: SimpleProductUpdate_productUpdate_product_pricing_priceRange | null; +} + +export interface SimpleProductUpdate_productUpdate_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface SimpleProductUpdate_productUpdate_product_variants_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface SimpleProductUpdate_productUpdate_product_variants { + __typename: "ProductVariant"; + id: string; + sku: string; + name: string; + priceOverride: SimpleProductUpdate_productUpdate_product_variants_priceOverride | null; + margin: number | null; + quantity: number; + quantityAllocated: number; + stockQuantity: number; +} + +export interface SimpleProductUpdate_productUpdate_product_productType { + __typename: "ProductType"; + id: string; + name: string; + hasVariants: boolean; +} + +export interface SimpleProductUpdate_productUpdate_product { + __typename: "Product"; + id: string; + name: string; + descriptionJson: any; + seoTitle: string | null; + seoDescription: string | null; + category: SimpleProductUpdate_productUpdate_product_category; + collections: (SimpleProductUpdate_productUpdate_product_collections | null)[] | null; + basePrice: SimpleProductUpdate_productUpdate_product_basePrice | null; + margin: SimpleProductUpdate_productUpdate_product_margin | null; + purchaseCost: SimpleProductUpdate_productUpdate_product_purchaseCost | null; + isAvailable: boolean | null; + isPublished: boolean; + chargeTaxes: boolean; + publicationDate: any | null; + attributes: SimpleProductUpdate_productUpdate_product_attributes[]; + pricing: SimpleProductUpdate_productUpdate_product_pricing | null; + images: (SimpleProductUpdate_productUpdate_product_images | null)[] | null; + variants: (SimpleProductUpdate_productUpdate_product_variants | null)[] | null; + productType: SimpleProductUpdate_productUpdate_product_productType; + url: string; +} + +export interface SimpleProductUpdate_productUpdate { + __typename: "ProductUpdate"; + errors: SimpleProductUpdate_productUpdate_errors[] | null; + product: SimpleProductUpdate_productUpdate_product | null; +} + +export interface SimpleProductUpdate_productVariantUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_attributes_attribute_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_attributes_attribute { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (SimpleProductUpdate_productVariantUpdate_productVariant_attributes_attribute_values | null)[] | null; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_attributes { + __typename: "SelectedAttribute"; + attribute: SimpleProductUpdate_productVariantUpdate_productVariant_attributes_attribute; + value: SimpleProductUpdate_productVariantUpdate_productVariant_attributes_value; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_costPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_product_thumbnail { + __typename: "Image"; + url: string; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_product_variants_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_product_variants { + __typename: "ProductVariant"; + id: string; + name: string; + sku: string; + images: (SimpleProductUpdate_productVariantUpdate_productVariant_product_variants_images | null)[] | null; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant_product { + __typename: "Product"; + id: string; + images: (SimpleProductUpdate_productVariantUpdate_productVariant_product_images | null)[] | null; + name: string; + thumbnail: SimpleProductUpdate_productVariantUpdate_productVariant_product_thumbnail | null; + variants: (SimpleProductUpdate_productVariantUpdate_productVariant_product_variants | null)[] | null; +} + +export interface SimpleProductUpdate_productVariantUpdate_productVariant { + __typename: "ProductVariant"; + id: string; + attributes: SimpleProductUpdate_productVariantUpdate_productVariant_attributes[]; + costPrice: SimpleProductUpdate_productVariantUpdate_productVariant_costPrice | null; + images: (SimpleProductUpdate_productVariantUpdate_productVariant_images | null)[] | null; + name: string; + priceOverride: SimpleProductUpdate_productVariantUpdate_productVariant_priceOverride | null; + product: SimpleProductUpdate_productVariantUpdate_productVariant_product; + sku: string; + quantity: number; + quantityAllocated: number; +} + +export interface SimpleProductUpdate_productVariantUpdate { + __typename: "ProductVariantUpdate"; + errors: SimpleProductUpdate_productVariantUpdate_errors[] | null; + productVariant: SimpleProductUpdate_productVariantUpdate_productVariant | null; +} + +export interface SimpleProductUpdate { + productUpdate: SimpleProductUpdate_productUpdate | null; + productVariantUpdate: SimpleProductUpdate_productVariantUpdate | null; +} + +export interface SimpleProductUpdateVariables { + id: string; + attributes?: (AttributeValueInput | null)[] | null; + publicationDate?: any | null; + category?: string | null; + chargeTaxes: boolean; + collections?: (string | null)[] | null; + descriptionJson?: any | null; + isPublished: boolean; + name?: string | null; + basePrice?: any | null; + productVariantId: string; + productVariantInput: ProductVariantInput; +} diff --git a/src/products/types/VariantCreate.ts b/src/products/types/VariantCreate.ts new file mode 100644 index 000000000..3c8d9f64c --- /dev/null +++ b/src/products/types/VariantCreate.ts @@ -0,0 +1,131 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AttributeValueInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: VariantCreate +// ==================================================== + +export interface VariantCreate_productVariantCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VariantCreate_productVariantCreate_productVariant_attributes_attribute_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface VariantCreate_productVariantCreate_productVariant_attributes_attribute { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (VariantCreate_productVariantCreate_productVariant_attributes_attribute_values | null)[] | null; +} + +export interface VariantCreate_productVariantCreate_productVariant_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface VariantCreate_productVariantCreate_productVariant_attributes { + __typename: "SelectedAttribute"; + attribute: VariantCreate_productVariantCreate_productVariant_attributes_attribute; + value: VariantCreate_productVariantCreate_productVariant_attributes_value; +} + +export interface VariantCreate_productVariantCreate_productVariant_costPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface VariantCreate_productVariantCreate_productVariant_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface VariantCreate_productVariantCreate_productVariant_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface VariantCreate_productVariantCreate_productVariant_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface VariantCreate_productVariantCreate_productVariant_product_thumbnail { + __typename: "Image"; + url: string; +} + +export interface VariantCreate_productVariantCreate_productVariant_product_variants_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface VariantCreate_productVariantCreate_productVariant_product_variants { + __typename: "ProductVariant"; + id: string; + name: string; + sku: string; + images: (VariantCreate_productVariantCreate_productVariant_product_variants_images | null)[] | null; +} + +export interface VariantCreate_productVariantCreate_productVariant_product { + __typename: "Product"; + id: string; + images: (VariantCreate_productVariantCreate_productVariant_product_images | null)[] | null; + name: string; + thumbnail: VariantCreate_productVariantCreate_productVariant_product_thumbnail | null; + variants: (VariantCreate_productVariantCreate_productVariant_product_variants | null)[] | null; +} + +export interface VariantCreate_productVariantCreate_productVariant { + __typename: "ProductVariant"; + id: string; + attributes: VariantCreate_productVariantCreate_productVariant_attributes[]; + costPrice: VariantCreate_productVariantCreate_productVariant_costPrice | null; + images: (VariantCreate_productVariantCreate_productVariant_images | null)[] | null; + name: string; + priceOverride: VariantCreate_productVariantCreate_productVariant_priceOverride | null; + product: VariantCreate_productVariantCreate_productVariant_product; + sku: string; + quantity: number; + quantityAllocated: number; +} + +export interface VariantCreate_productVariantCreate { + __typename: "ProductVariantCreate"; + errors: VariantCreate_productVariantCreate_errors[] | null; + productVariant: VariantCreate_productVariantCreate_productVariant | null; +} + +export interface VariantCreate { + productVariantCreate: VariantCreate_productVariantCreate | null; +} + +export interface VariantCreateVariables { + attributes: (AttributeValueInput | null)[]; + costPrice?: any | null; + priceOverride?: any | null; + product: string; + sku?: string | null; + quantity?: number | null; + trackInventory: boolean; +} diff --git a/src/products/types/VariantDelete.ts b/src/products/types/VariantDelete.ts new file mode 100644 index 000000000..7aceceb21 --- /dev/null +++ b/src/products/types/VariantDelete.ts @@ -0,0 +1,32 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: VariantDelete +// ==================================================== + +export interface VariantDelete_productVariantDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VariantDelete_productVariantDelete_productVariant { + __typename: "ProductVariant"; + id: string; +} + +export interface VariantDelete_productVariantDelete { + __typename: "ProductVariantDelete"; + errors: VariantDelete_productVariantDelete_errors[] | null; + productVariant: VariantDelete_productVariantDelete_productVariant | null; +} + +export interface VariantDelete { + productVariantDelete: VariantDelete_productVariantDelete | null; +} + +export interface VariantDeleteVariables { + id: string; +} diff --git a/src/products/types/VariantImageAssign.ts b/src/products/types/VariantImageAssign.ts new file mode 100644 index 000000000..dfc6bf05c --- /dev/null +++ b/src/products/types/VariantImageAssign.ts @@ -0,0 +1,124 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: VariantImageAssign +// ==================================================== + +export interface VariantImageAssign_variantImageAssign_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_attributes_attribute_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_attributes_attribute { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (VariantImageAssign_variantImageAssign_productVariant_attributes_attribute_values | null)[] | null; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_attributes { + __typename: "SelectedAttribute"; + attribute: VariantImageAssign_variantImageAssign_productVariant_attributes_attribute; + value: VariantImageAssign_variantImageAssign_productVariant_attributes_value; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_costPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_product_thumbnail { + __typename: "Image"; + url: string; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_product_variants_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_product_variants { + __typename: "ProductVariant"; + id: string; + name: string; + sku: string; + images: (VariantImageAssign_variantImageAssign_productVariant_product_variants_images | null)[] | null; +} + +export interface VariantImageAssign_variantImageAssign_productVariant_product { + __typename: "Product"; + id: string; + images: (VariantImageAssign_variantImageAssign_productVariant_product_images | null)[] | null; + name: string; + thumbnail: VariantImageAssign_variantImageAssign_productVariant_product_thumbnail | null; + variants: (VariantImageAssign_variantImageAssign_productVariant_product_variants | null)[] | null; +} + +export interface VariantImageAssign_variantImageAssign_productVariant { + __typename: "ProductVariant"; + id: string; + attributes: VariantImageAssign_variantImageAssign_productVariant_attributes[]; + costPrice: VariantImageAssign_variantImageAssign_productVariant_costPrice | null; + images: (VariantImageAssign_variantImageAssign_productVariant_images | null)[] | null; + name: string; + priceOverride: VariantImageAssign_variantImageAssign_productVariant_priceOverride | null; + product: VariantImageAssign_variantImageAssign_productVariant_product; + sku: string; + quantity: number; + quantityAllocated: number; +} + +export interface VariantImageAssign_variantImageAssign { + __typename: "VariantImageAssign"; + errors: VariantImageAssign_variantImageAssign_errors[] | null; + productVariant: VariantImageAssign_variantImageAssign_productVariant | null; +} + +export interface VariantImageAssign { + variantImageAssign: VariantImageAssign_variantImageAssign | null; +} + +export interface VariantImageAssignVariables { + variantId: string; + imageId: string; +} diff --git a/src/products/types/VariantImageUnassign.ts b/src/products/types/VariantImageUnassign.ts new file mode 100644 index 000000000..420d03223 --- /dev/null +++ b/src/products/types/VariantImageUnassign.ts @@ -0,0 +1,124 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: VariantImageUnassign +// ==================================================== + +export interface VariantImageUnassign_variantImageUnassign_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_attributes_attribute_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_attributes_attribute { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (VariantImageUnassign_variantImageUnassign_productVariant_attributes_attribute_values | null)[] | null; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_attributes { + __typename: "SelectedAttribute"; + attribute: VariantImageUnassign_variantImageUnassign_productVariant_attributes_attribute; + value: VariantImageUnassign_variantImageUnassign_productVariant_attributes_value; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_costPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_product_thumbnail { + __typename: "Image"; + url: string; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_product_variants_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_product_variants { + __typename: "ProductVariant"; + id: string; + name: string; + sku: string; + images: (VariantImageUnassign_variantImageUnassign_productVariant_product_variants_images | null)[] | null; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant_product { + __typename: "Product"; + id: string; + images: (VariantImageUnassign_variantImageUnassign_productVariant_product_images | null)[] | null; + name: string; + thumbnail: VariantImageUnassign_variantImageUnassign_productVariant_product_thumbnail | null; + variants: (VariantImageUnassign_variantImageUnassign_productVariant_product_variants | null)[] | null; +} + +export interface VariantImageUnassign_variantImageUnassign_productVariant { + __typename: "ProductVariant"; + id: string; + attributes: VariantImageUnassign_variantImageUnassign_productVariant_attributes[]; + costPrice: VariantImageUnassign_variantImageUnassign_productVariant_costPrice | null; + images: (VariantImageUnassign_variantImageUnassign_productVariant_images | null)[] | null; + name: string; + priceOverride: VariantImageUnassign_variantImageUnassign_productVariant_priceOverride | null; + product: VariantImageUnassign_variantImageUnassign_productVariant_product; + sku: string; + quantity: number; + quantityAllocated: number; +} + +export interface VariantImageUnassign_variantImageUnassign { + __typename: "VariantImageUnassign"; + errors: VariantImageUnassign_variantImageUnassign_errors[] | null; + productVariant: VariantImageUnassign_variantImageUnassign_productVariant | null; +} + +export interface VariantImageUnassign { + variantImageUnassign: VariantImageUnassign_variantImageUnassign | null; +} + +export interface VariantImageUnassignVariables { + variantId: string; + imageId: string; +} diff --git a/src/products/types/VariantUpdate.ts b/src/products/types/VariantUpdate.ts new file mode 100644 index 000000000..e979e4edf --- /dev/null +++ b/src/products/types/VariantUpdate.ts @@ -0,0 +1,131 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AttributeValueInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: VariantUpdate +// ==================================================== + +export interface VariantUpdate_productVariantUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_attributes_attribute_values { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_attributes_attribute { + __typename: "Attribute"; + id: string; + name: string | null; + slug: string | null; + values: (VariantUpdate_productVariantUpdate_productVariant_attributes_attribute_values | null)[] | null; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_attributes_value { + __typename: "AttributeValue"; + id: string; + name: string | null; + slug: string | null; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_attributes { + __typename: "SelectedAttribute"; + attribute: VariantUpdate_productVariantUpdate_productVariant_attributes_attribute; + value: VariantUpdate_productVariantUpdate_productVariant_attributes_value; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_costPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_priceOverride { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_product_images { + __typename: "ProductImage"; + id: string; + alt: string; + sortOrder: number | null; + url: string; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_product_thumbnail { + __typename: "Image"; + url: string; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_product_variants_images { + __typename: "ProductImage"; + id: string; + url: string; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_product_variants { + __typename: "ProductVariant"; + id: string; + name: string; + sku: string; + images: (VariantUpdate_productVariantUpdate_productVariant_product_variants_images | null)[] | null; +} + +export interface VariantUpdate_productVariantUpdate_productVariant_product { + __typename: "Product"; + id: string; + images: (VariantUpdate_productVariantUpdate_productVariant_product_images | null)[] | null; + name: string; + thumbnail: VariantUpdate_productVariantUpdate_productVariant_product_thumbnail | null; + variants: (VariantUpdate_productVariantUpdate_productVariant_product_variants | null)[] | null; +} + +export interface VariantUpdate_productVariantUpdate_productVariant { + __typename: "ProductVariant"; + id: string; + attributes: VariantUpdate_productVariantUpdate_productVariant_attributes[]; + costPrice: VariantUpdate_productVariantUpdate_productVariant_costPrice | null; + images: (VariantUpdate_productVariantUpdate_productVariant_images | null)[] | null; + name: string; + priceOverride: VariantUpdate_productVariantUpdate_productVariant_priceOverride | null; + product: VariantUpdate_productVariantUpdate_productVariant_product; + sku: string; + quantity: number; + quantityAllocated: number; +} + +export interface VariantUpdate_productVariantUpdate { + __typename: "ProductVariantUpdate"; + errors: VariantUpdate_productVariantUpdate_errors[] | null; + productVariant: VariantUpdate_productVariantUpdate_productVariant | null; +} + +export interface VariantUpdate { + productVariantUpdate: VariantUpdate_productVariantUpdate | null; +} + +export interface VariantUpdateVariables { + id: string; + attributes?: (AttributeValueInput | null)[] | null; + costPrice?: any | null; + priceOverride?: any | null; + sku?: string | null; + quantity?: number | null; + trackInventory: boolean; +} diff --git a/src/products/types/productBulkDelete.ts b/src/products/types/productBulkDelete.ts new file mode 100644 index 000000000..51f2e1870 --- /dev/null +++ b/src/products/types/productBulkDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: productBulkDelete +// ==================================================== + +export interface productBulkDelete_productBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface productBulkDelete_productBulkDelete { + __typename: "ProductBulkDelete"; + errors: productBulkDelete_productBulkDelete_errors[] | null; +} + +export interface productBulkDelete { + productBulkDelete: productBulkDelete_productBulkDelete | null; +} + +export interface productBulkDeleteVariables { + ids: string[]; +} diff --git a/src/products/types/productBulkPublish.ts b/src/products/types/productBulkPublish.ts new file mode 100644 index 000000000..2fc358588 --- /dev/null +++ b/src/products/types/productBulkPublish.ts @@ -0,0 +1,27 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: productBulkPublish +// ==================================================== + +export interface productBulkPublish_productBulkPublish_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface productBulkPublish_productBulkPublish { + __typename: "ProductBulkPublish"; + errors: productBulkPublish_productBulkPublish_errors[] | null; +} + +export interface productBulkPublish { + productBulkPublish: productBulkPublish_productBulkPublish | null; +} + +export interface productBulkPublishVariables { + ids: string[]; + isPublished: boolean; +} diff --git a/src/products/urls.ts b/src/products/urls.ts new file mode 100644 index 000000000..7f9fa09ce --- /dev/null +++ b/src/products/urls.ts @@ -0,0 +1,73 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { ActiveTab, BulkAction, Dialog, Filters, Pagination } from "../types"; + +const productSection = "/products/"; + +export const productAddPath = urlJoin(productSection, "add"); +export const productAddUrl = productAddPath; + +export const productListPath = productSection; +export type ProductListUrlDialog = + | "publish" + | "unpublish" + | "delete" + | "save-search" + | "delete-search"; +export enum ProductListUrlFiltersEnum { + isPublished = "isPublished", + priceFrom = "priceFrom", + priceTo = "priceTo", + status = "status", + query = "query" +} +export type ProductListUrlFilters = Filters; +export type ProductListUrlQueryParams = BulkAction & + Dialog & + ProductListUrlFilters & + Pagination & + ActiveTab; +export const productListUrl = (params?: ProductListUrlQueryParams): string => + productListPath + "?" + stringifyQs(params); + +export const productPath = (id: string) => urlJoin(productSection + id); +export type ProductUrlDialog = "remove"; +export type ProductUrlQueryParams = BulkAction & + Dialog<"remove" | "remove-variants">; +export const productUrl = (id: string, params?: ProductUrlQueryParams) => + productPath(encodeURIComponent(id)) + "?" + stringifyQs(params); + +export const productVariantEditPath = (productId: string, variantId: string) => + urlJoin(productSection, productId, "variant", variantId); +export type ProductVariantEditUrlDialog = "remove"; +export type ProductVariantEditUrlQueryParams = Dialog<"remove">; +export const productVariantEditUrl = ( + productId: string, + variantId: string, + params?: ProductVariantEditUrlQueryParams +) => + productVariantEditPath( + encodeURIComponent(productId), + encodeURIComponent(variantId) + ) + + "?" + + stringifyQs(params); + +export const productVariantAddPath = (productId: string) => + urlJoin(productSection, productId, "variant/add"); +export const productVariantAddUrl = (productId: string) => + productVariantAddPath(encodeURIComponent(productId)); + +export const productImagePath = (productId: string, imageId: string) => + urlJoin(productSection, productId, "image", imageId); +export type ProductImageUrlDialog = "remove"; +export type ProductImageUrlQueryParams = Dialog<"remove">; +export const productImageUrl = ( + productId: string, + imageId: string, + params?: ProductImageUrlQueryParams +) => + productImagePath(encodeURIComponent(productId), encodeURIComponent(imageId)) + + "?" + + stringifyQs(params); diff --git a/src/products/views/ProductCreate.tsx b/src/products/views/ProductCreate.tsx new file mode 100644 index 000000000..7a996113a --- /dev/null +++ b/src/products/views/ProductCreate.tsx @@ -0,0 +1,136 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import useShop from "@saleor/hooks/useShop"; +import { DEFAULT_INITIAL_SEARCH_DATA } from "../../config"; +import SearchCategories from "../../containers/SearchCategories"; +import SearchCollections from "../../containers/SearchCollections"; +import i18n from "../../i18n"; +import { decimal, getMutationState, maybe } from "../../misc"; +import ProductCreatePage, { FormData } from "../components/ProductCreatePage"; +import { TypedProductCreateMutation } from "../mutations"; +import { TypedProductCreateQuery } from "../queries"; +import { ProductCreate } from "../types/ProductCreate"; +import { productListUrl, productUrl } from "../urls"; + +interface ProductUpdateProps { + id: string; +} + +export const ProductUpdate: React.StatelessComponent< + ProductUpdateProps +> = () => { + const navigate = useNavigator(); + const notify = useNotifier(); + const shop = useShop(); + + const handleAttributesEdit = undefined; + const handleBack = () => navigate(productListUrl()); + + return ( + + {({ search: searchCategory, result: searchCategoryOpts }) => ( + + {({ search: searchCollection, result: searchCollectionOpts }) => ( + + {({ data, loading }) => { + const handleSuccess = (data: ProductCreate) => { + if (data.productCreate.errors.length === 0) { + notify({ + text: i18n.t("Product created") + }); + navigate(productUrl(data.productCreate.product.id)); + } + }; + + return ( + + {( + productCreate, + { + called: productCreateCalled, + data: productCreateData, + loading: productCreateDataLoading + } + ) => { + const handleSubmit = (formData: FormData) => { + productCreate({ + variables: { + attributes: formData.attributes, + basePrice: decimal(formData.basePrice), + category: formData.category.value, + chargeTaxes: formData.chargeTaxes, + collections: formData.collections.map( + collection => collection.value + ), + descriptionJson: JSON.stringify( + formData.description + ), + isPublished: formData.isPublished, + name: formData.name, + productType: formData.productType.value.id, + publicationDate: + formData.publicationDate !== "" + ? formData.publicationDate + : null, + sku: formData.sku, + stockQuantity: + formData.stockQuantity !== null + ? formData.stockQuantity + : 0 + } + }); + }; + + const disabled = loading || productCreateDataLoading; + + const formTransitionState = getMutationState( + productCreateCalled, + productCreateDataLoading, + maybe(() => productCreateData.productCreate.errors) + ); + return ( + <> + + shop.defaultCurrency)} + categories={maybe( + () => searchCategoryOpts.data.categories.edges, + [] + ).map(edge => edge.node)} + collections={maybe( + () => searchCollectionOpts.data.collections.edges, + [] + ).map(edge => edge.node)} + disabled={disabled} + errors={maybe( + () => productCreateData.productCreate.errors, + [] + )} + fetchCategories={searchCategory} + fetchCollections={searchCollection} + header={i18n.t("New Product")} + productTypes={maybe(() => + data.productTypes.edges.map(edge => edge.node) + )} + onAttributesEdit={handleAttributesEdit} + onBack={handleBack} + onSubmit={handleSubmit} + saveButtonBarState={formTransitionState} + /> + + ); + }} + + ); + }} + + )} + + )} + + ); +}; +export default ProductUpdate; diff --git a/src/products/views/ProductImage.tsx b/src/products/views/ProductImage.tsx new file mode 100644 index 000000000..e2c6601bc --- /dev/null +++ b/src/products/views/ProductImage.tsx @@ -0,0 +1,132 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import ProductImagePage from "../components/ProductImagePage"; +import { + TypedProductImageDeleteMutation, + TypedProductImageUpdateMutation +} from "../mutations"; +import { TypedProductImageQuery } from "../queries"; +import { ProductImageUpdate } from "../types/ProductImageUpdate"; +import { + productImageUrl, + ProductImageUrlQueryParams, + productUrl +} from "../urls"; + +interface ProductImageProps { + imageId: string; + productId: string; + params: ProductImageUrlQueryParams; +} + +export const ProductImage: React.StatelessComponent = ({ + imageId, + productId, + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const handleBack = () => navigate(productUrl(productId)); + const handleUpdateSuccess = (data: ProductImageUpdate) => { + if (data.productImageUpdate.errors.length === 0) { + notify({ text: "Saved changes" }); + } + }; + return ( + + {({ data, loading }) => { + return ( + + {(updateImage, updateResult) => ( + + {(deleteImage, deleteResult) => { + const handleDelete = () => + deleteImage({ variables: { id: imageId } }); + const handleImageClick = (id: string) => () => + navigate(productImageUrl(productId, id)); + const handleUpdate = (formData: { description: string }) => { + updateImage({ + variables: { + alt: formData.description, + id: imageId + } + }); + }; + const image = data && data.product && data.product.mainImage; + + const formTransitionState = getMutationState( + updateResult.called, + updateResult.loading, + maybe(() => updateResult.data.productImageUpdate.errors) + ); + const deleteTransitionState = getMutationState( + deleteResult.called, + deleteResult.loading, + [] + ); + return ( + <> + data.product.name)} + image={image || null} + images={maybe(() => data.product.images)} + onBack={handleBack} + onDelete={() => + navigate( + productImageUrl(productId, imageId, { + action: "remove" + }) + ) + } + onRowClick={handleImageClick} + onSubmit={handleUpdate} + saveButtonBarState={formTransitionState} + /> + + navigate(productImageUrl(productId, imageId), true) + } + onConfirm={handleDelete} + open={params.action === "remove"} + title={i18n.t("Remove image", { + context: "modal title" + })} + variant="delete" + confirmButtonState={deleteTransitionState} + > + + {i18n.t( + "Are you sure you want to remove this image?", + { + context: "modal content" + } + )} + + + + ); + }} + + )} + + ); + }} + + ); +}; +export default ProductImage; diff --git a/src/products/views/ProductList/ProductList.tsx b/src/products/views/ProductList/ProductList.tsx new file mode 100644 index 000000000..ad411bf24 --- /dev/null +++ b/src/products/views/ProductList/ProductList.tsx @@ -0,0 +1,363 @@ +import Button from "@material-ui/core/Button"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import DeleteFilterTabDialog from "@saleor/components/DeleteFilterTabDialog"; +import SaveFilterTabDialog, { + SaveFilterTabDialogFormData +} from "@saleor/components/SaveFilterTabDialog"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useLocale from "@saleor/hooks/useLocale"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import useShop from "@saleor/hooks/useShop"; +import { PAGINATE_BY } from "../../../config"; +import i18n from "../../../i18n"; +import { getMutationState, maybe } from "../../../misc"; +import ProductListCard from "../../components/ProductListCard"; +import { + TypedProductBulkDeleteMutation, + TypedProductBulkPublishMutation +} from "../../mutations"; +import { TypedProductListQuery } from "../../queries"; +import { productBulkDelete } from "../../types/productBulkDelete"; +import { productBulkPublish } from "../../types/productBulkPublish"; +import { + productAddUrl, + productListUrl, + ProductListUrlDialog, + ProductListUrlFilters, + ProductListUrlQueryParams, + productUrl +} from "../../urls"; +import { + areFiltersApplied, + createFilter, + createFilterChips, + deleteFilterTab, + getActiveFilters, + getFilterTabs, + getFilterVariables, + saveFilterTab +} from "./filters"; + +interface ProductListProps { + params: ProductListUrlQueryParams; +} + +export const ProductList: React.StatelessComponent = ({ + params +}) => { + const locale = useLocale(); + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const shop = useShop(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const tabs = getFilterTabs(); + + const currentTab = + params.activeTab === undefined + ? areFiltersApplied(params) + ? tabs.length + 1 + : 0 + : parseInt(params.activeTab, 0); + + const closeModal = () => + navigate( + productListUrl({ + ...params, + action: undefined, + ids: undefined + }), + true + ); + + const changeFilters = (filters: ProductListUrlFilters) => { + reset(); + navigate(productListUrl(filters)); + }; + + const changeFilterField = (filter: ProductListUrlFilters) => { + reset(); + navigate( + productListUrl({ + ...getActiveFilters(params), + ...filter, + activeTab: undefined + }) + ); + }; + + const openModal = (action: ProductListUrlDialog, ids?: string[]) => + navigate( + productListUrl({ + ...params, + action, + ids + }) + ); + + const handleTabChange = (tab: number) => { + reset(); + navigate( + productListUrl({ + activeTab: tab.toString(), + ...getFilterTabs()[tab - 1].data + }) + ); + }; + + const handleFilterTabDelete = () => { + deleteFilterTab(currentTab); + reset(); + navigate(productListUrl()); + }; + + const handleFilterTabSave = (data: SaveFilterTabDialogFormData) => { + saveFilterTab(data.name, getActiveFilters(params)); + handleTabChange(tabs.length + 1); + }; + + const paginationState = createPaginationState(PAGINATE_BY, params); + const currencySymbol = maybe(() => shop.defaultCurrency, "USD"); + const queryVariables = React.useMemo( + () => ({ + ...paginationState, + filter: getFilterVariables(params) + }), + [params] + ); + + return ( + + {({ data, loading, refetch }) => { + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.products.pageInfo), + paginationState, + params + ); + + const handleBulkDelete = (data: productBulkDelete) => { + if (data.productBulkDelete.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Products removed") + }); + reset(); + refetch(); + } + }; + + const handleBulkPublish = (data: productBulkPublish) => { + if (data.productBulkPublish.errors.length === 0) { + closeModal(); + notify({ + text: i18n.t("Changed publication status") + }); + reset(); + refetch(); + } + }; + + return ( + + {(productBulkDelete, productBulkDeleteOpts) => ( + + {(productBulkPublish, productBulkPublishOpts) => { + const bulkDeleteMutationState = getMutationState( + productBulkDeleteOpts.called, + productBulkDeleteOpts.loading, + maybe( + () => productBulkDeleteOpts.data.productBulkDelete.errors + ) + ); + + const bulkPublishMutationState = getMutationState( + productBulkPublishOpts.called, + productBulkPublishOpts.loading, + maybe( + () => + productBulkPublishOpts.data.productBulkPublish.errors + ) + ); + + return ( + <> + navigate(productAddUrl)} + disabled={loading} + products={maybe(() => + data.products.edges.map(edge => edge.node) + )} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + pageInfo={pageInfo} + onRowClick={id => () => navigate(productUrl(id))} + onAll={() => + changeFilters({ + status: undefined + }) + } + toolbar={ + <> + + + openModal("delete", listElements)} + > + + + + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + onSearchChange={query => changeFilterField({ query })} + onFilterAdd={filter => + changeFilterField(createFilter(filter)) + } + onFilterSave={() => openModal("save-search")} + onFilterDelete={() => openModal("delete-search")} + onTabChange={handleTabChange} + initialSearch={params.query || ""} + filterTabs={getFilterTabs()} + /> + + productBulkDelete({ variables: { ids: params.ids } }) + } + title={i18n.t("Remove products")} + variant="delete" + > + {{ number }} products?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + productBulkPublish({ + variables: { + ids: params.ids, + isPublished: true + } + }) + } + title={i18n.t("Publish products")} + > + {{ number }} products?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + productBulkPublish({ + variables: { + ids: params.ids, + isPublished: false + } + }) + } + title={i18n.t("Unpublish products")} + > + {{ number }} products?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + tabs[currentTab - 1].name, "...")} + /> + + ); + }} + + )} + + ); + }} + + ); +}; +export default ProductList; diff --git a/src/products/views/ProductList/filters.ts b/src/products/views/ProductList/filters.ts new file mode 100644 index 000000000..79f6ab112 --- /dev/null +++ b/src/products/views/ProductList/filters.ts @@ -0,0 +1,190 @@ +import { FilterContentSubmitData } from "../../../components/Filter"; +import { Filter } from "../../../components/TableFilter"; +import i18n from "../../../i18n"; +import { + ProductFilterInput, + StockAvailability +} from "../../../types/globalTypes"; +import { + createFilterTabUtils, + createFilterUtils +} from "../../../utils/filters"; +import { ProductFilterKeys } from "../../components/ProductListFilter"; +import { + ProductListUrlFilters, + ProductListUrlFiltersEnum, + ProductListUrlQueryParams +} from "../../urls"; + +export const PRODUCT_FILTERS_KEY = "productFilters"; + +export function getFilterVariables( + params: ProductListUrlFilters +): ProductFilterInput { + return { + isPublished: + params.isPublished !== undefined ? params.isPublished === "true" : null, + price: { + gte: parseFloat(params.priceFrom), + lte: parseFloat(params.priceTo) + }, + search: params.query, + stockAvailability: StockAvailability[params.status] + }; +} + +export function createFilter( + filter: FilterContentSubmitData +): ProductListUrlFilters { + const filterName = filter.name; + if (filterName === ProductFilterKeys.priceEqual.toString()) { + const value = filter.value as string; + return { + priceFrom: value, + priceTo: value + }; + } else if (filterName === ProductFilterKeys.priceRange.toString()) { + const { value } = filter; + return { + priceFrom: value[0], + priceTo: value[1] + }; + } else if (filterName === ProductFilterKeys.published.toString()) { + return { + isPublished: filter.value as string + }; + } else if (filterName === ProductFilterKeys.stock.toString()) { + const value = filter.value as string; + return { + status: StockAvailability[value] + }; + } +} + +interface ProductListChipFormatData { + currencySymbol: string; + locale: string; +} +export function createFilterChips( + filters: ProductListUrlFilters, + formatData: ProductListChipFormatData, + onFilterDelete: (filters: ProductListUrlFilters) => void +): Filter[] { + let filterChips: Filter[] = []; + + if (!!filters.priceFrom || !!filters.priceTo) { + if (filters.priceFrom === filters.priceTo) { + filterChips = [ + ...filterChips, + { + label: i18n.t("Price is {{ price }}", { + price: parseFloat(filters.priceFrom).toLocaleString( + formatData.locale, + { + currency: formatData.currencySymbol, + style: "currency" + } + ) + }), + onClick: () => + onFilterDelete({ + ...filters, + priceFrom: undefined, + priceTo: undefined + }) + } + ]; + } else { + if (!!filters.priceFrom) { + filterChips = [ + ...filterChips, + { + label: i18n.t("Price from {{ price }}", { + price: parseFloat(filters.priceFrom).toLocaleString( + formatData.locale, + { + currency: formatData.currencySymbol, + style: "currency" + } + ) + }), + onClick: () => + onFilterDelete({ + ...filters, + priceFrom: undefined + }) + } + ]; + } + + if (!!filters.priceTo) { + filterChips = [ + ...filterChips, + { + label: i18n.t("Price to {{ price }}", { + price: parseFloat(filters.priceTo).toLocaleString( + formatData.locale, + { + currency: formatData.currencySymbol, + style: "currency" + } + ) + }), + onClick: () => + onFilterDelete({ + ...filters, + priceTo: undefined + }) + } + ]; + } + } + } + + if (!!filters.status) { + filterChips = [ + ...filterChips, + { + label: + filters.status === StockAvailability.IN_STOCK.toString() + ? i18n.t("Available") + : i18n.t("Out Of Stock"), + onClick: () => + onFilterDelete({ + ...filters, + status: undefined + }) + } + ]; + } + + if (!!filters.isPublished) { + filterChips = [ + ...filterChips, + { + label: + filters.isPublished === StockAvailability.IN_STOCK.toString() + ? i18n.t("Published") + : i18n.t("Hidden"), + onClick: () => + onFilterDelete({ + ...filters, + isPublished: undefined + }) + } + ]; + } + + return filterChips; +} + +export const { + deleteFilterTab, + getFilterTabs, + saveFilterTab +} = createFilterTabUtils(PRODUCT_FILTERS_KEY); + +export const { areFiltersApplied, getActiveFilters } = createFilterUtils< + ProductListUrlQueryParams, + ProductListUrlFilters +>(ProductListUrlFiltersEnum); diff --git a/src/products/views/ProductList/index.ts b/src/products/views/ProductList/index.ts new file mode 100644 index 000000000..3308d7c0f --- /dev/null +++ b/src/products/views/ProductList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ProductList"; +export * from "./ProductList"; diff --git a/src/products/views/ProductUpdate.tsx b/src/products/views/ProductUpdate.tsx new file mode 100644 index 000000000..c97645a79 --- /dev/null +++ b/src/products/views/ProductUpdate.tsx @@ -0,0 +1,366 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; +import { arrayMove } from "react-sortable-hoc"; + +import * as placeholderImg from "@assets/images/placeholder255x255.png"; +import ActionDialog from "@saleor/components/ActionDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import { DEFAULT_INITIAL_SEARCH_DATA } from "../../config"; +import SearchCategories from "../../containers/SearchCategories"; +import SearchCollections from "../../containers/SearchCollections"; +import i18n from "../../i18n"; +import { decimal, getMutationState, maybe } from "../../misc"; +import { productTypeUrl } from "../../productTypes/urls"; +import ProductUpdatePage, { FormData } from "../components/ProductUpdatePage"; +import ProductUpdateOperations from "../containers/ProductUpdateOperations"; +import { TypedProductDetailsQuery } from "../queries"; +import { + ProductImageCreate, + ProductImageCreateVariables +} from "../types/ProductImageCreate"; +import { ProductVariantBulkDelete } from "../types/ProductVariantBulkDelete"; +import { + productImageUrl, + productListUrl, + productUrl, + ProductUrlQueryParams, + productVariantAddUrl, + productVariantEditUrl +} from "../urls"; + +interface ProductUpdateProps { + id: string; + params: ProductUrlQueryParams; +} + +export const ProductUpdate: React.StatelessComponent = ({ + id, + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + return ( + + {({ search: searchCategories, result: searchCategoriesOpts }) => ( + + {({ search: searchCollections, result: searchCollectionsOpts }) => ( + + {({ data, loading, refetch }) => { + const handleDelete = () => { + notify({ text: i18n.t("Product removed") }); + navigate(productListUrl()); + }; + const handleUpdate = () => + notify({ text: i18n.t("Saved changes") }); + const handleImageCreate = (data: ProductImageCreate) => { + const imageError = data.productImageCreate.errors.find( + error => + error.field === + ("image" as keyof ProductImageCreateVariables) + ); + if (imageError) { + notify({ + text: imageError.message + }); + } + }; + const handleImageDeleteSuccess = () => + notify({ + text: i18n.t("Image successfully deleted") + }); + const handleVariantAdd = () => + navigate(productVariantAddUrl(id)); + + const handleBulkProductVariantDelete = ( + data: ProductVariantBulkDelete + ) => { + if (data.productVariantBulkDelete.errors.length === 0) { + navigate(productUrl(id), true); + reset(); + refetch(); + } + }; + + const product = data ? data.product : undefined; + return ( + + {({ + bulkProductVariantDelete, + createProductImage, + deleteProduct, + deleteProductImage, + reorderProductImages, + updateProduct, + updateSimpleProduct + }) => { + const handleImageDelete = (id: string) => () => + deleteProductImage.mutate({ id }); + const handleImageEdit = (imageId: string) => () => + navigate(productImageUrl(id, imageId)); + const handleSubmit = (data: FormData) => { + if (product) { + if (product.productType.hasVariants) { + updateProduct.mutate({ + attributes: data.attributes, + basePrice: decimal(data.basePrice), + category: data.category.value, + chargeTaxes: data.chargeTaxes, + collections: data.collections.map( + collection => collection.value + ), + descriptionJson: JSON.stringify(data.description), + id: product.id, + isPublished: data.isPublished, + name: data.name, + publicationDate: + data.publicationDate !== "" + ? data.publicationDate + : null + }); + } else { + updateSimpleProduct.mutate({ + attributes: data.attributes, + basePrice: decimal(data.basePrice), + category: data.category.value, + chargeTaxes: data.chargeTaxes, + collections: data.collections.map( + collection => collection.value + ), + descriptionJson: JSON.stringify(data.description), + id: product.id, + isPublished: data.isPublished, + name: data.name, + productVariantId: product.variants[0].id, + productVariantInput: { + quantity: data.stockQuantity, + sku: data.sku + }, + publicationDate: + data.publicationDate !== "" + ? data.publicationDate + : null + }); + } + } + }; + + const disableFormSave = + createProductImage.opts.loading || + deleteProduct.opts.loading || + reorderProductImages.opts.loading || + updateProduct.opts.loading || + loading; + const formTransitionState = getMutationState( + updateProduct.opts.called || + updateSimpleProduct.opts.called, + updateProduct.opts.loading || + updateSimpleProduct.opts.loading, + maybe( + () => updateProduct.opts.data.productUpdate.errors + ), + maybe( + () => + updateSimpleProduct.opts.data.productUpdate.errors + ), + maybe( + () => + updateSimpleProduct.opts.data.productVariantUpdate + .errors + ) + ); + const deleteTransitionState = getMutationState( + deleteProduct.opts.called, + deleteProduct.opts.loading, + maybe( + () => deleteProduct.opts.data.productDelete.errors + ) + ); + + const bulkProductVariantDeleteTransitionState = getMutationState( + bulkProductVariantDelete.opts.called, + bulkProductVariantDelete.opts.loading, + maybe( + () => + bulkProductVariantDelete.opts.data + .productVariantBulkDelete.errors + ) + ); + + return ( + <> + data.product.name)} /> + searchCategoriesOpts.data.categories.edges, + [] + ).map(edge => edge.node)} + collections={maybe( + () => + searchCollectionsOpts.data.collections.edges, + [] + ).map(edge => edge.node)} + disabled={disableFormSave} + errors={maybe( + () => + updateProduct.opts.data.productUpdate.errors, + [] + )} + fetchCategories={searchCategories} + fetchCollections={searchCollections} + saveButtonBarState={formTransitionState} + images={maybe(() => data.product.images)} + header={maybe(() => product.name)} + placeholderImage={placeholderImg} + product={product} + productCollections={maybe( + () => product.collections + )} + variants={maybe(() => product.variants)} + onAttributesEdit={() => + navigate( + productTypeUrl(data.product.productType.id) + ) + } + onBack={() => { + navigate(productListUrl()); + }} + onDelete={() => + navigate( + productUrl(id, { + action: "remove" + }) + ) + } + onProductShow={() => { + if (product) { + window.open(product.url); + } + }} + onImageReorder={({ newIndex, oldIndex }) => { + if (product) { + let ids = product.images.map(image => image.id); + ids = arrayMove(ids, oldIndex, newIndex); + reorderProductImages.mutate({ + imagesIds: ids, + productId: product.id + }); + } + }} + onSubmit={handleSubmit} + onVariantAdd={handleVariantAdd} + onVariantShow={variantId => () => + navigate( + productVariantEditUrl(product.id, variantId) + )} + onImageUpload={file => { + if (product) { + createProductImage.mutate({ + alt: "", + image: file, + product: product.id + }); + } + }} + onImageEdit={handleImageEdit} + onImageDelete={handleImageDelete} + toolbar={ + + navigate( + productUrl(id, { + action: "remove-variants", + ids: listElements + }) + ) + } + > + + + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + /> + navigate(productUrl(id), true)} + confirmButtonState={deleteTransitionState} + onConfirm={() => deleteProduct.mutate({ id })} + variant="delete" + title={i18n.t("Remove product")} + > + {{ name }}?", + { + name: product ? product.name : undefined + } + ) + }} + /> + + navigate(productUrl(id), true)} + confirmButtonState={ + bulkProductVariantDeleteTransitionState + } + onConfirm={() => + bulkProductVariantDelete.mutate({ + ids: params.ids + }) + } + variant="delete" + title={i18n.t("Remove product variants")} + > + {{ number }} variants?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + ); + }} + + )} + + )} + + ); +}; +export default ProductUpdate; diff --git a/src/products/views/ProductVariant.tsx b/src/products/views/ProductVariant.tsx new file mode 100644 index 000000000..be42c88f7 --- /dev/null +++ b/src/products/views/ProductVariant.tsx @@ -0,0 +1,169 @@ +import * as React from "react"; + +import * as placeholderImg from "@assets/images/placeholder255x255.png"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../i18n"; +import { decimal, getMutationState, maybe } from "../../misc"; +import ProductVariantDeleteDialog from "../components/ProductVariantDeleteDialog"; +import ProductVariantPage from "../components/ProductVariantPage"; +import ProductVariantOperations from "../containers/ProductVariantOperations"; +import { TypedProductVariantQuery } from "../queries"; +import { VariantUpdate } from "../types/VariantUpdate"; +import { + productUrl, + productVariantAddUrl, + productVariantEditUrl, + ProductVariantEditUrlQueryParams +} from "../urls"; + +interface ProductUpdateProps { + variantId: string; + productId: string; + params: ProductVariantEditUrlQueryParams; +} + +interface FormData { + id: string; + attributes?: Array<{ + slug: string; + value: string; + }>; + costPrice?: string; + priceOverride?: string; + quantity: number; + sku: string; +} + +export const ProductVariant: React.StatelessComponent = ({ + variantId, + productId, + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + + return ( + + {({ data, loading }) => { + const variant = data ? data.productVariant : undefined; + const handleBack = () => navigate(productUrl(productId)); + const handleDelete = () => { + notify({ text: i18n.t("Variant removed") }); + navigate(productUrl(productId)); + }; + const handleUpdate = (data: VariantUpdate) => { + if (!maybe(() => data.productVariantUpdate.errors.length)) { + notify({ text: i18n.t("Changes saved") }); + } + }; + + return ( + + {({ assignImage, deleteVariant, updateVariant, unassignImage }) => { + const disableFormSave = + loading || + deleteVariant.opts.loading || + updateVariant.opts.loading || + assignImage.opts.loading || + unassignImage.opts.loading; + const formTransitionState = getMutationState( + updateVariant.opts.called, + updateVariant.opts.loading, + maybe(() => updateVariant.opts.data.productVariantUpdate.errors) + ); + const removeTransitionState = getMutationState( + deleteVariant.opts.called, + deleteVariant.opts.loading, + maybe(() => deleteVariant.opts.data.productVariantDelete.errors) + ); + const handleImageSelect = (id: string) => () => { + if (variant) { + if ( + variant.images && + variant.images.map(image => image.id).indexOf(id) !== -1 + ) { + unassignImage.mutate({ + imageId: id, + variantId: variant.id + }); + } else { + assignImage.mutate({ + imageId: id, + variantId: variant.id + }); + } + } + }; + + return ( + <> + data.productVariant.name)} /> + updateVariant.opts.data.productVariantUpdate.errors, + [] + )} + saveButtonBarState={formTransitionState} + loading={disableFormSave} + placeholderImage={placeholderImg} + variant={variant} + header={variant ? variant.name || variant.sku : undefined} + onAdd={() => navigate(productVariantAddUrl(productId))} + onBack={handleBack} + onDelete={() => + navigate( + productVariantEditUrl(productId, variantId, { + action: "remove" + }) + ) + } + onImageSelect={handleImageSelect} + onSubmit={(data: FormData) => { + if (variant) { + updateVariant.mutate({ + attributes: data.attributes ? data.attributes : null, + costPrice: decimal(data.costPrice), + id: variantId, + priceOverride: decimal(data.priceOverride), + quantity: data.quantity || null, + sku: data.sku, + trackInventory: true // FIXME: missing in UI + }); + } + }} + onVariantClick={variantId => { + navigate(productVariantEditUrl(productId, variantId)); + }} + /> + + navigate(productVariantEditUrl(productId, variantId)) + } + onConfirm={() => + deleteVariant.mutate({ + id: variantId + }) + } + open={params.action === "remove"} + name={maybe(() => data.productVariant.name)} + /> + + ); + }} + + ); + }} + + ); +}; +export default ProductVariant; diff --git a/src/products/views/ProductVariantCreate.tsx b/src/products/views/ProductVariantCreate.tsx new file mode 100644 index 000000000..f2dfa4f09 --- /dev/null +++ b/src/products/views/ProductVariantCreate.tsx @@ -0,0 +1,111 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import useShop from "@saleor/hooks/useShop"; +import i18n from "../../i18n"; +import { decimal, getMutationState, maybe } from "../../misc"; +import ProductVariantCreatePage from "../components/ProductVariantCreatePage"; +import { TypedVariantCreateMutation } from "../mutations"; +import { TypedProductVariantCreateQuery } from "../queries"; +import { VariantCreate } from "../types/VariantCreate"; +import { productUrl, productVariantEditUrl } from "../urls"; + +interface ProductUpdateProps { + productId: string; +} + +interface FormData { + attributes?: Array<{ + slug: string; + value: string; + }>; + costPrice?: string; + priceOverride?: string; + quantity: number; + sku: string; +} + +export const ProductVariant: React.StatelessComponent = ({ + productId +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const shop = useShop(); + + return ( + + {({ data, loading: productLoading }) => { + const handleCreateSuccess = (data: VariantCreate) => { + if (data.productVariantCreate.errors.length === 0) { + notify({ text: i18n.t("Product created") }); + navigate( + productVariantEditUrl( + productId, + data.productVariantCreate.productVariant.id + ) + ); + } + }; + + return ( + + {(variantCreate, variantCreateResult) => { + const handleBack = () => navigate(productUrl(productId)); + const handleSubmit = (formData: FormData) => + variantCreate({ + variables: { + attributes: formData.attributes, + costPrice: decimal(formData.costPrice), + priceOverride: decimal(formData.priceOverride), + product: productId, + quantity: formData.quantity || null, + sku: formData.sku, + trackInventory: true + } + }); + const handleVariantClick = (id: string) => + navigate(productVariantEditUrl(productId, id)); + + const disableForm = productLoading || variantCreateResult.loading; + + const formTransitionstate = getMutationState( + variantCreateResult.called, + variantCreateResult.loading, + maybe( + () => variantCreateResult.data.productVariantCreate.errors + ) + ); + return ( + <> + + shop.defaultCurrency)} + errors={maybe( + () => + variantCreateResult.data.productVariantCreate.errors, + [] + )} + header={i18n.t("Add Variant")} + loading={disableForm} + product={maybe(() => data.product)} + onBack={handleBack} + onSubmit={handleSubmit} + onVariantClick={handleVariantClick} + saveButtonBarState={formTransitionstate} + /> + + ); + }} + + ); + }} + + ); +}; +export default ProductVariant; diff --git a/src/queries.tsx b/src/queries.tsx new file mode 100644 index 000000000..2364ee6b7 --- /dev/null +++ b/src/queries.tsx @@ -0,0 +1,169 @@ +import { DocumentNode } from "graphql"; +import gql from "graphql-tag"; +import * as React from "react"; +import { Query, QueryResult } from "react-apollo"; + +import { ApolloQueryResult } from "apollo-client"; +import AppProgress from "./components/AppProgress"; +import ErrorPage from "./components/ErrorPage/ErrorPage"; +import useNavigator from "./hooks/useNavigator"; +import useNotifier from "./hooks/useNotifier"; +import i18n from "./i18n"; +import { RequireAtLeastOne } from "./misc"; + +export interface LoadMore { + loadMore: ( + mergeFunc: (prev: TData, next: TData) => TData, + extraVariables: RequireAtLeastOne + ) => Promise>; +} + +export type TypedQueryResult = QueryResult< + TData, + TVariables +> & + LoadMore; + +export interface TypedQueryInnerProps { + children: (result: TypedQueryResult) => React.ReactNode; + displayLoader?: boolean; + skip?: boolean; + variables?: TVariables; + require?: Array; +} + +interface QueryProgressProps { + loading: boolean; + onLoading: () => void; + onCompleted: () => void; +} + +class QueryProgress extends React.Component { + componentDidMount() { + const { loading, onLoading } = this.props; + if (loading) { + onLoading(); + } + } + + componentDidUpdate(prevProps) { + const { loading, onLoading, onCompleted } = this.props; + if (prevProps.loading !== loading) { + if (loading) { + onLoading(); + } else { + onCompleted(); + } + } + } + + render() { + return this.props.children; + } +} + +export function TypedQuery( + query: DocumentNode +): React.FC> { + class StrictTypedQuery extends Query {} + return props => { + const navigate = useNavigator(); + const pushMessage = useNotifier(); + + return ( + + {({ setProgressState }) => { + // Obviously, this is workaround to the problem described here: + // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/32588 + const { + children, + displayLoader, + skip, + variables, + require + } = props as JSX.LibraryManagedAttributes< + typeof StrictTypedQuery, + typeof props + >; + return ( + + {queryData => { + if (queryData.error) { + const msg = i18n.t("Something went wrong: {{ message }}", { + message: queryData.error.message + }); + pushMessage({ text: msg }); + } + + const loadMore = ( + mergeFunc: ( + previousResults: TData, + fetchMoreResult: TData + ) => TData, + extraVariables: RequireAtLeastOne + ) => + queryData.fetchMore({ + query, + updateQuery: (previousResults, { fetchMoreResult }) => { + if (!fetchMoreResult) { + return previousResults; + } + return mergeFunc(previousResults, fetchMoreResult); + }, + variables: { ...variables, ...extraVariables } + }); + + let childrenOrNotFound = children({ + ...queryData, + loadMore + }); + if ( + !queryData.loading && + require && + queryData.data && + !require.reduce( + (acc, key) => acc && queryData.data[key] !== null, + true + ) + ) { + childrenOrNotFound = ( + navigate("/")} /> + ); + } + + if (displayLoader) { + return ( + setProgressState(false)} + onLoading={() => setProgressState(true)} + > + {childrenOrNotFound} + + ); + } + + return childrenOrNotFound; + }} + + ); + }} + + ); + }; +} + +export const pageInfoFragment = gql` + fragment PageInfoFragment on PageInfo { + endCursor + hasNextPage + hasPreviousPage + startCursor + } +`; diff --git a/src/shipping/components/ShippingWeightUnitForm/ShippingWeightUnitForm.tsx b/src/shipping/components/ShippingWeightUnitForm/ShippingWeightUnitForm.tsx new file mode 100644 index 000000000..b1f72dc6b --- /dev/null +++ b/src/shipping/components/ShippingWeightUnitForm/ShippingWeightUnitForm.tsx @@ -0,0 +1,74 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardActions from "@material-ui/core/CardActions"; +import CardContent from "@material-ui/core/CardContent"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Form from "@saleor/components/Form"; +import Hr from "@saleor/components/Hr"; +import SingleSelectField from "@saleor/components/SingleSelectField"; +import i18n from "../../../i18n"; +import { WeightUnitsEnum } from "../../../types/globalTypes"; + +export interface FormData { + unit: WeightUnitsEnum; +} + +export interface ShippingWeightUnitFormProps { + defaultWeightUnit: WeightUnitsEnum; + disabled: boolean; + onSubmit: (unit: WeightUnitsEnum) => void; +} + +const ShippingWeightUnitForm: React.StatelessComponent< + ShippingWeightUnitFormProps +> = ({ defaultWeightUnit, disabled, onSubmit }) => { + const initialForm: FormData = { + unit: defaultWeightUnit + }; + return ( +
    onSubmit(formData.unit)}> + {({ change, data, submit }) => ( + + + + ({ + label: WeightUnitsEnum[unit], + value: WeightUnitsEnum[unit] + }))} + label={i18n.t("Shipping Weight Unit", { + context: "input label" + })} + hint={i18n.t( + "This unit will be used as default shipping weight", + { + context: "input help text" + } + )} + name={"unit" as keyof FormData} + value={data.unit} + onChange={change} + /> + +
    + + + +
    + )} +
    + ); +}; +ShippingWeightUnitForm.displayName = "ShippingWeightUnitForm"; +export default ShippingWeightUnitForm; diff --git a/src/shipping/components/ShippingWeightUnitForm/index.ts b/src/shipping/components/ShippingWeightUnitForm/index.ts new file mode 100644 index 000000000..8c4dc991f --- /dev/null +++ b/src/shipping/components/ShippingWeightUnitForm/index.ts @@ -0,0 +1,2 @@ +export { default } from './ShippingWeightUnitForm'; +export * from './ShippingWeightUnitForm'; \ No newline at end of file diff --git a/src/shipping/components/ShippingZoneCountriesAssignDialog/ShippingZoneCountriesAssignDialog.tsx b/src/shipping/components/ShippingZoneCountriesAssignDialog/ShippingZoneCountriesAssignDialog.tsx new file mode 100644 index 000000000..2f7ce5238 --- /dev/null +++ b/src/shipping/components/ShippingZoneCountriesAssignDialog/ShippingZoneCountriesAssignDialog.tsx @@ -0,0 +1,233 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import { filter } from "fuzzaldrin"; +import * as React from "react"; + +import Checkbox from "@saleor/components/Checkbox"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import Form from "@saleor/components/Form"; +import FormSpacer from "@saleor/components/FormSpacer"; +import Hr from "@saleor/components/Hr"; +// tslint:disable no-submodule-imports +import { ShopInfo_shop_countries } from "@saleor/components/Shop/types/ShopInfo"; +import i18n from "../../../i18n"; + +interface FormData { + countries: string[]; + query: string; + restOfTheWorld: boolean; +} + +export interface ShippingZoneCountriesAssignDialogProps { + confirmButtonState: ConfirmButtonTransitionState; + countries: ShopInfo_shop_countries[]; + initial: string[]; + isDefault: boolean; + open: boolean; + onClose: () => void; + onConfirm: (data: FormData) => void; +} + +const styles = (theme: Theme) => + createStyles({ + checkboxCell: { + paddingLeft: 0 + }, + container: { + maxHeight: 400 + }, + heading: { + marginBottom: theme.spacing.unit * 2, + marginTop: theme.spacing.unit * 2 + }, + table: { + border: "1px solid " + theme.palette.grey[200] + }, + wideCell: { + width: "100%" + } + }); +const ShippingZoneCountriesAssignDialog = withStyles(styles, { + name: "ShippingZoneCountriesAssignDialog" +})( + ({ + classes, + confirmButtonState, + isDefault, + onClose, + countries, + open, + initial, + onConfirm + }: ShippingZoneCountriesAssignDialogProps & WithStyles) => { + const initialForm: FormData = { + countries: initial, + query: "", + restOfTheWorld: isDefault + }; + return ( + +
    + {({ data, change }) => { + const countrySelectionMap = countries.reduce((acc, country) => { + acc[country.code] = !!data.countries.find( + selectedCountries => selectedCountries === country.code + ); + return acc; + }, {}); + + return ( + <> + {i18n.t("Assign Countries")} + + + {i18n.t( + "Choose countries you want to add to shipping zone from list below" + )} + + + change(event, () => fetch(data.query))} + label={i18n.t("Search Countries", { + context: "country search input label" + })} + placeholder={i18n.t("Search by country name", { + context: "country search input placeholder" + })} + fullWidth + /> + +
    + + + + {i18n.t("Quick Pick")} + + + + + + {i18n.t("Rest of the World")} + + {i18n.t( + "If selected, this will add all of the countries not selected to other shipping zones" + )} + + + + + change({ + target: { + name: "restOfTheWorld" as keyof FormData, + value: !data.restOfTheWorld + } + } as any) + } + /> + + + +
    +
    + + + + {i18n.t("Countries A to Z", { + context: "country selection" + })} + + + + {filter(countries, data.query, { + key: "country" + }).map(country => { + const isChecked = countrySelectionMap[country.code]; + + return ( + + + {country.country} + + + + isChecked + ? change({ + target: { + name: "countries" as keyof FormData, + value: data.countries.filter( + selectedCountries => + selectedCountries !== country.code + ) + } + } as any) + : change({ + target: { + name: "countries" as keyof FormData, + value: [ + ...data.countries, + country.code + ] + } + } as any) + } + /> + + + ); + })} + +
    +
    + + + + {i18n.t("Assign countries", { context: "button" })} + + + + ); + }} +
    +
    + ); + } +); +ShippingZoneCountriesAssignDialog.displayName = + "ShippingZoneCountriesAssignDialog"; +export default ShippingZoneCountriesAssignDialog; diff --git a/src/shipping/components/ShippingZoneCountriesAssignDialog/index.ts b/src/shipping/components/ShippingZoneCountriesAssignDialog/index.ts new file mode 100644 index 000000000..882ec3f99 --- /dev/null +++ b/src/shipping/components/ShippingZoneCountriesAssignDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from './ShippingZoneCountriesAssignDialog'; +export * from './ShippingZoneCountriesAssignDialog'; \ No newline at end of file diff --git a/src/shipping/components/ShippingZoneCreatePage/ShippingZoneCreatePage.tsx b/src/shipping/components/ShippingZoneCreatePage/ShippingZoneCreatePage.tsx new file mode 100644 index 000000000..ee805fb05 --- /dev/null +++ b/src/shipping/components/ShippingZoneCreatePage/ShippingZoneCreatePage.tsx @@ -0,0 +1,130 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import CountryList from "@saleor/components/CountryList"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { CountryFragment } from "../../../taxes/types/CountryFragment"; +import { UserError } from "../../../types"; +import ShippingZoneCountriesAssignDialog from "../ShippingZoneCountriesAssignDialog"; +import ShippingZoneInfo from "../ShippingZoneInfo"; + +export interface FormData { + countries: string[]; + default: boolean; + name: string; +} + +export interface ShippingZoneCreatePageProps { + countries: CountryFragment[]; + disabled: boolean; + errors: UserError[]; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onSubmit: (data: FormData) => void; +} + +const ShippingZoneCreatePage: React.StatelessComponent< + ShippingZoneCreatePageProps +> = ({ countries, disabled, errors, onBack, onSubmit, saveButtonBarState }) => { + const [isModalOpened, setModalStatus] = React.useState(false); + const toggleModal = () => setModalStatus(!isModalOpened); + + const initialForm: FormData = { + countries: [], + default: false, + name: "" + }; + + return ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + <> + + {i18n.t("Shipping")} + + +
    + + + + countries.find(country => country.code === selectedCountry) + )} + disabled={disabled} + emptyText={ + data.default + ? i18n.t( + "This is default shipping zone, which means that it covers all of the countries which are not assigned to other shipping zones" + ) + : i18n.t( + "Currently, there are no countries assigned to this shipping zone" + ) + } + onCountryAssign={toggleModal} + onCountryUnassign={countryCode => + change({ + target: { + name: "countries", + value: data.countries.filter( + country => country !== countryCode + ) + } + } as any) + } + title={i18n.t("Countries")} + /> +
    +
    + +
    + + change( + { + target: { + name: "default", + value: formData.restOfTheWorld + } + } as any, + () => + change( + { + target: { + name: "countries", + value: formData.restOfTheWorld ? [] : formData.countries + } + } as any, + toggleModal + ) + ) + } + confirmButtonState="default" + countries={countries} + initial={data.countries} + isDefault={data.default} + onClose={toggleModal} + /> + + )} + + ); +}; +ShippingZoneCreatePage.displayName = "ShippingZoneCreatePage"; +export default ShippingZoneCreatePage; diff --git a/src/shipping/components/ShippingZoneCreatePage/index.ts b/src/shipping/components/ShippingZoneCreatePage/index.ts new file mode 100644 index 000000000..6c7ccbdd5 --- /dev/null +++ b/src/shipping/components/ShippingZoneCreatePage/index.ts @@ -0,0 +1,2 @@ +export { default } from './ShippingZoneCreatePage'; +export * from './ShippingZoneCreatePage'; \ No newline at end of file diff --git a/src/shipping/components/ShippingZoneDetailsPage/ShippingZoneDetailsPage.tsx b/src/shipping/components/ShippingZoneDetailsPage/ShippingZoneDetailsPage.tsx new file mode 100644 index 000000000..96040ad4e --- /dev/null +++ b/src/shipping/components/ShippingZoneDetailsPage/ShippingZoneDetailsPage.tsx @@ -0,0 +1,135 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import CountryList from "@saleor/components/CountryList"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { UserError } from "../../../types"; +import { ShippingMethodTypeEnum } from "../../../types/globalTypes"; +import { ShippingZoneDetailsFragment } from "../../types/ShippingZoneDetailsFragment"; +import ShippingZoneInfo from "../ShippingZoneInfo"; +import ShippingZoneRates from "../ShippingZoneRates"; + +export interface FormData { + name: string; +} + +export interface ShippingZoneDetailsPageProps { + disabled: boolean; + errors: UserError[]; + saveButtonBarState: ConfirmButtonTransitionState; + shippingZone: ShippingZoneDetailsFragment; + onBack: () => void; + onCountryAdd: () => void; + onCountryRemove: (code: string) => void; + onDelete: () => void; + onPriceRateAdd: () => void; + onPriceRateEdit: (id: string) => void; + onRateRemove: (rateId: string) => void; + onSubmit: (data: FormData) => void; + onWeightRateAdd: () => void; + onWeightRateEdit: (id: string) => void; +} + +const ShippingZoneDetailsPage: React.StatelessComponent< + ShippingZoneDetailsPageProps +> = ({ + disabled, + errors, + onBack, + onCountryAdd, + onCountryRemove, + onDelete, + onPriceRateAdd, + onPriceRateEdit, + onRateRemove, + onSubmit, + onWeightRateAdd, + onWeightRateEdit, + saveButtonBarState, + shippingZone +}) => { + const initialForm: FormData = { + name: maybe(() => shippingZone.name, "") + }; + return ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Shipping")} + shippingZone.name)} /> + +
    + + + shippingZone.countries)} + disabled={disabled} + emptyText={maybe( + () => + shippingZone.default + ? i18n.t( + "This is default shipping zone, which means that it covers all of the countries which are not assigned to other shipping zones" + ) + : i18n.t( + "Currently, there are no countries assigned to this shipping zone" + ), + "..." + )} + onCountryAssign={onCountryAdd} + onCountryUnassign={onCountryRemove} + title={i18n.t("Countries")} + /> + + + shippingZone.shippingMethods.filter( + method => method.type === ShippingMethodTypeEnum.PRICE + ) + )} + variant="price" + /> + + + shippingZone.shippingMethods.filter( + method => method.type === ShippingMethodTypeEnum.WEIGHT + ) + )} + variant="weight" + /> +
    +
    + +
    + )} +
    + ); +}; +ShippingZoneDetailsPage.displayName = "ShippingZoneDetailsPage"; +export default ShippingZoneDetailsPage; diff --git a/src/shipping/components/ShippingZoneDetailsPage/index.ts b/src/shipping/components/ShippingZoneDetailsPage/index.ts new file mode 100644 index 000000000..1bfd26b13 --- /dev/null +++ b/src/shipping/components/ShippingZoneDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from './ShippingZoneDetailsPage'; +export * from './ShippingZoneDetailsPage'; \ No newline at end of file diff --git a/src/shipping/components/ShippingZoneInfo/ShippingZoneInfo.tsx b/src/shipping/components/ShippingZoneInfo/ShippingZoneInfo.tsx new file mode 100644 index 000000000..ff17908e5 --- /dev/null +++ b/src/shipping/components/ShippingZoneInfo/ShippingZoneInfo.tsx @@ -0,0 +1,38 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; +import { FormErrors } from "../../../types"; +import { FormData } from "../ShippingZoneDetailsPage"; + +export interface ShippingZoneInfoProps { + data: FormData; + errors: FormErrors<"name">; + onChange: (event: React.ChangeEvent) => void; +} + +const ShippingZoneInfo: React.StatelessComponent = ({ + data, + errors, + onChange +}) => ( + + + + + + +); +ShippingZoneInfo.displayName = "ShippingZoneInfo"; +export default ShippingZoneInfo; diff --git a/src/shipping/components/ShippingZoneInfo/index.ts b/src/shipping/components/ShippingZoneInfo/index.ts new file mode 100644 index 000000000..a04821eb0 --- /dev/null +++ b/src/shipping/components/ShippingZoneInfo/index.ts @@ -0,0 +1,2 @@ +export { default } from './ShippingZoneInfo'; +export * from './ShippingZoneInfo'; \ No newline at end of file diff --git a/src/shipping/components/ShippingZoneRateDialog/ShippingZoneRateDialog.tsx b/src/shipping/components/ShippingZoneRateDialog/ShippingZoneRateDialog.tsx new file mode 100644 index 000000000..75c0b05dc --- /dev/null +++ b/src/shipping/components/ShippingZoneRateDialog/ShippingZoneRateDialog.tsx @@ -0,0 +1,301 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import ControlledSwitch from "@saleor/components/ControlledSwitch"; +import Form from "@saleor/components/Form"; +import FormSpacer from "@saleor/components/FormSpacer"; +import Hr from "@saleor/components/Hr"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { FormErrors, UserError } from "../../../types"; +import { ShippingMethodTypeEnum } from "../../../types/globalTypes"; +import { ShippingZoneDetailsFragment_shippingMethods } from "../../types/ShippingZoneDetailsFragment"; + +export interface FormData { + name: string; + noLimits: boolean; + minValue: string; + maxValue: string; + isFree: boolean; + price: string; +} + +export interface ShippingZoneRateDialogProps { + action: "create" | "edit"; + confirmButtonState: ConfirmButtonTransitionState; + defaultCurrency: string; + disabled: boolean; + errors: UserError[]; + open: boolean; + rate: ShippingZoneDetailsFragment_shippingMethods; + variant: ShippingMethodTypeEnum; + onClose: () => void; + onSubmit: (data: FormData) => void; +} + +const styles = (theme: Theme) => + createStyles({ + grid: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridTemplateColumns: "1fr 1fr" + }, + subheading: { + marginBottom: theme.spacing.unit * 2, + marginTop: theme.spacing.unit * 2 + } + }); +const ShippingZoneRateDialog = withStyles(styles, { + name: "ShippingZoneRateDialog" +})( + ({ + action, + classes, + confirmButtonState, + defaultCurrency, + disabled, + errors, + onClose, + onSubmit, + open, + rate, + variant + }: ShippingZoneRateDialogProps & WithStyles) => { + const initialForm: FormData = + action === "create" + ? { + isFree: false, + maxValue: "", + minValue: "", + name: "", + noLimits: false, + price: "" + } + : { + isFree: maybe(() => rate.price.amount === 0, false), + maxValue: + variant === ShippingMethodTypeEnum.PRICE + ? maybe(() => rate.maximumOrderPrice.amount.toString(), "") + : maybe(() => rate.maximumOrderWeight.value.toString(), ""), + minValue: + variant === ShippingMethodTypeEnum.PRICE + ? maybe(() => rate.minimumOrderPrice.amount.toString(), "") + : maybe(() => rate.minimumOrderWeight.value.toString(), ""), + name: maybe(() => rate.name, ""), + noLimits: false, + price: maybe(() => rate.price.amount.toString(), "") + }; + if (action === "edit") { + initialForm.noLimits = !initialForm.maxValue && !initialForm.minValue; + } + + return ( + +
    + {({ change, data, errors: formErrors, hasChanged }) => { + const typedFormErrors: FormErrors< + | "minimumOrderPrice" + | "minimumOrderWeight" + | "maximumOrderPrice" + | "maximumOrderWeight" + | "price" + | "name" + > = formErrors; + return ( + <> + + {variant === ShippingMethodTypeEnum.PRICE + ? action === "create" + ? i18n.t("Add Price Rate") + : i18n.t("Edit Price Rate") + : action === "create" + ? i18n.t("Add Weight Rate") + : i18n.t("Edit Weight Rate")} + + + + +
    + + {!!variant ? ( + <> + + {variant === ShippingMethodTypeEnum.PRICE + ? i18n.t("Value range") + : i18n.t("Weight range")} + + + {i18n.t("There are no value limits")} + + {variant === ShippingMethodTypeEnum.PRICE + ? i18n.t( + "This rate will apply to all orders of all prices" + ) + : i18n.t( + "This rate will apply to all orders of all weights" + )} + + + } + /> + {!data.noLimits && ( + <> + +
    + + +
    + + )} + + ) : ( + + )} +
    +
    + + + {i18n.t("Rate")} + + + {!data.isFree && ( + <> + +
    + +
    + + )} +
    + + + + {action === "create" + ? i18n.t("Create rate", { context: "button" }) + : i18n.t("Update rate", { context: "button" })} + + + + ); + }} +
    +
    + ); + } +); +ShippingZoneRateDialog.displayName = "ShippingZoneRateDialog"; +export default ShippingZoneRateDialog; diff --git a/src/shipping/components/ShippingZoneRateDialog/index.ts b/src/shipping/components/ShippingZoneRateDialog/index.ts new file mode 100644 index 000000000..3aa84f45e --- /dev/null +++ b/src/shipping/components/ShippingZoneRateDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from './ShippingZoneRateDialog'; +export * from './ShippingZoneRateDialog'; \ No newline at end of file diff --git a/src/shipping/components/ShippingZoneRates/ShippingZoneRates.tsx b/src/shipping/components/ShippingZoneRates/ShippingZoneRates.tsx new file mode 100644 index 000000000..589edd5b7 --- /dev/null +++ b/src/shipping/components/ShippingZoneRates/ShippingZoneRates.tsx @@ -0,0 +1,163 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import DeleteIcon from "@material-ui/icons/Delete"; +import EditIcon from "@material-ui/icons/Edit"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import IconButtonTableCell from "@saleor/components/IconButtonTableCell"; +import Money from "@saleor/components/Money"; +import MoneyRange from "@saleor/components/MoneyRange"; +import Skeleton from "@saleor/components/Skeleton"; +import WeightRange from "@saleor/components/WeightRange"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ICONBUTTON_SIZE } from "../../../theme"; +import { ShippingZoneDetailsFragment_shippingMethods } from "../../types/ShippingZoneDetailsFragment"; + +export interface ShippingZoneRatesProps { + disabled: boolean; + rates: ShippingZoneDetailsFragment_shippingMethods[]; + variant: "price" | "weight"; + onRateAdd: () => void; + onRateEdit: (id: string) => void; + onRateRemove: (id: string) => void; +} + +const styles = (theme: Theme) => + createStyles({ + alignRight: { + "&:last-child": { + paddingRight: 0 + }, + paddingRight: 0, + width: ICONBUTTON_SIZE + theme.spacing.unit / 2 + }, + nameColumn: { + width: 300 + }, + valueColumn: { + width: 300 + } + }); +const ShippingZoneRates = withStyles(styles, { name: "ShippingZoneRates" })( + ({ + classes, + disabled, + onRateAdd, + onRateEdit, + onRateRemove, + rates, + variant + }: ShippingZoneRatesProps & WithStyles) => ( + + + {i18n.t("Add rate", { + context: "button" + })} + + } + /> + + + + + {i18n.t("Name", { context: "object" })} + + + {variant === "price" + ? i18n.t("Value Range", { context: "object" }) + : i18n.t("Weight Range", { context: "object" })} + + + {i18n.t("Price", { context: "object" })} + + + + + + + {renderCollection( + rates, + rate => ( + onRateEdit(rate.id) : undefined} + > + + {maybe(() => rate.name, )} + + + {maybe( + () => + variant === "price" ? ( + + ) : ( + + ), + + )} + + + {maybe( + () => ( + + ), + + )} + + onRateEdit(rate.id)} + > + + + onRateRemove(rate.id)} + > + + + + ), + () => ( + + + {i18n.t("No shipping rates found")} + + + ) + )} + +
    +
    + ) +); +ShippingZoneRates.displayName = "ShippingZoneRates"; +export default ShippingZoneRates; diff --git a/src/shipping/components/ShippingZoneRates/index.ts b/src/shipping/components/ShippingZoneRates/index.ts new file mode 100644 index 000000000..65c1ae1ce --- /dev/null +++ b/src/shipping/components/ShippingZoneRates/index.ts @@ -0,0 +1,2 @@ +export { default } from './ShippingZoneRates'; +export * from './ShippingZoneRates'; \ No newline at end of file diff --git a/src/shipping/components/ShippingZonesList/ShippingZonesList.tsx b/src/shipping/components/ShippingZonesList/ShippingZonesList.tsx new file mode 100644 index 000000000..29974968e --- /dev/null +++ b/src/shipping/components/ShippingZonesList/ShippingZonesList.tsx @@ -0,0 +1,174 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableRow from "@material-ui/core/TableRow"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Checkbox from "@saleor/components/Checkbox"; +import Skeleton from "@saleor/components/Skeleton"; +import TableHead from "@saleor/components/TableHead"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { maybe, renderCollection } from "../../../misc"; +import { ICONBUTTON_SIZE } from "../../../theme"; +import { ListActions, ListProps } from "../../../types"; +import { ShippingZoneFragment } from "../../types/ShippingZoneFragment"; + +export interface ShippingZonesListProps extends ListProps, ListActions { + shippingZones: ShippingZoneFragment[]; + onAdd: () => void; + onRemove: (id: string) => void; +} + +const styles = (theme: Theme) => + createStyles({ + [theme.breakpoints.up("lg")]: { + colCountries: {}, + colName: { width: 200 } + }, + alignRight: { + "&:last-child": { + paddingRight: theme.spacing.unit + }, + width: ICONBUTTON_SIZE + theme.spacing.unit / 2 + }, + colCountries: {}, + colName: {}, + row: { + cursor: "pointer" + } + }); +const ShippingZonesList = withStyles(styles, { name: "ShippingZonesList" })( + ({ + classes, + disabled, + onAdd, + onNextPage, + onPreviousPage, + onRemove, + onRowClick, + pageInfo, + shippingZones, + isChecked, + selected, + toggle, + toggleAll, + toolbar + }: ShippingZonesListProps & WithStyles) => ( + + + {i18n.t("Add shipping zone", { + context: "button" + })} + + } + /> + + + + {i18n.t("Name", { context: "object" })} + + + {i18n.t("Countries", { context: "object" })} + + + + + + + + + {renderCollection( + shippingZones, + shippingZone => { + const isSelected = shippingZone + ? isChecked(shippingZone.id) + : false; + + return ( + + + toggle(shippingZone.id)} + /> + + + {maybe( + () => shippingZone.name, + + )} + + + {maybe( + () => shippingZone.countries.length, + + )} + + + { + event.stopPropagation(); + onRemove(shippingZone.id); + }} + > + + + + + ); + }, + () => ( + + + {i18n.t("No shipping zones found")} + + + ) + )} + +
    +
    + ) +); +ShippingZonesList.displayName = "ShippingZonesList"; +export default ShippingZonesList; diff --git a/src/shipping/components/ShippingZonesList/index.ts b/src/shipping/components/ShippingZonesList/index.ts new file mode 100644 index 000000000..f6f03db27 --- /dev/null +++ b/src/shipping/components/ShippingZonesList/index.ts @@ -0,0 +1,2 @@ +export { default } from './ShippingZonesList'; +export * from './ShippingZonesList'; \ No newline at end of file diff --git a/src/shipping/components/ShippingZonesListPage/ShippingZonesListPage.tsx b/src/shipping/components/ShippingZonesListPage/ShippingZonesListPage.tsx new file mode 100644 index 000000000..45042f23c --- /dev/null +++ b/src/shipping/components/ShippingZonesListPage/ShippingZonesListPage.tsx @@ -0,0 +1,47 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import Container from "@saleor/components/Container"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListActions, PageListProps } from "../../../types"; +import { WeightUnitsEnum } from "../../../types/globalTypes"; +import { ShippingZoneFragment } from "../../types/ShippingZoneFragment"; +import ShippingWeightUnitForm from "../ShippingWeightUnitForm"; +import ShippingZonesList from "../ShippingZonesList"; + +export interface ShippingZonesListPageProps extends PageListProps, ListActions { + defaultWeightUnit: WeightUnitsEnum; + shippingZones: ShippingZoneFragment[]; + onBack: () => void; + onRemove: (id: string) => void; + onSubmit: (unit: WeightUnitsEnum) => void; +} + +const ShippingZonesListPage: React.StatelessComponent< + ShippingZonesListPageProps +> = ({ defaultWeightUnit, disabled, onBack, onSubmit, ...listProps }) => ( + + {i18n.t("Configuration")} + + +
    + +
    +
    + +
    +
    +
    +); +ShippingZonesListPage.displayName = "ShippingZonesListPage"; +export default ShippingZonesListPage; diff --git a/src/shipping/components/ShippingZonesListPage/index.ts b/src/shipping/components/ShippingZonesListPage/index.ts new file mode 100644 index 000000000..199420676 --- /dev/null +++ b/src/shipping/components/ShippingZonesListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from './ShippingZonesListPage'; +export * from './ShippingZonesListPage'; \ No newline at end of file diff --git a/src/shipping/fixtures.ts b/src/shipping/fixtures.ts new file mode 100644 index 000000000..cefe56d87 --- /dev/null +++ b/src/shipping/fixtures.ts @@ -0,0 +1,1648 @@ +import { ShippingMethodTypeEnum } from "../types/globalTypes"; +import { ShippingZoneDetailsFragment } from "./types/ShippingZoneDetailsFragment"; +import { ShippingZoneFragment } from "./types/ShippingZoneFragment"; + +export const shippingZones: ShippingZoneFragment[] = [ + { + __typename: "ShippingZone", + countries: [ + { + __typename: "CountryDisplay", + code: "AX", + country: "Wyspy Alandzkie" + }, + { + __typename: "CountryDisplay", + code: "AL", + country: "Albania" + }, + { + __typename: "CountryDisplay", + code: "AD", + country: "Andora" + }, + { + __typename: "CountryDisplay", + code: "AT", + country: "Austria" + }, + { + __typename: "CountryDisplay", + code: "BY", + country: "Białoruś" + }, + { + __typename: "CountryDisplay", + code: "BE", + country: "Belgia" + }, + { + __typename: "CountryDisplay", + code: "BA", + country: "Bośnia i Hercegowina" + }, + { + __typename: "CountryDisplay", + code: "BG", + country: "Bułgaria" + }, + { + __typename: "CountryDisplay", + code: "HR", + country: "Chorwacja" + }, + { + __typename: "CountryDisplay", + code: "CZ", + country: "Czechy" + }, + { + __typename: "CountryDisplay", + code: "DK", + country: "Dania" + }, + { + __typename: "CountryDisplay", + code: "EE", + country: "Estonia" + }, + { + __typename: "CountryDisplay", + code: "FO", + country: "Wyspy Owcze" + }, + { + __typename: "CountryDisplay", + code: "FI", + country: "Finlandia" + }, + { + __typename: "CountryDisplay", + code: "FR", + country: "Francja" + }, + { + __typename: "CountryDisplay", + code: "DE", + country: "Niemcy" + }, + { + __typename: "CountryDisplay", + code: "GI", + country: "Gibraltar" + }, + { + __typename: "CountryDisplay", + code: "GR", + country: "Grecja" + }, + { + __typename: "CountryDisplay", + code: "GG", + country: "Guernsey" + }, + { + __typename: "CountryDisplay", + code: "VA", + country: "Watykan" + }, + { + __typename: "CountryDisplay", + code: "HU", + country: "Węgry" + }, + { + __typename: "CountryDisplay", + code: "IS", + country: "Islandia" + }, + { + __typename: "CountryDisplay", + code: "IE", + country: "Irlandia" + }, + { + __typename: "CountryDisplay", + code: "IM", + country: "Wyspa Man" + }, + { + __typename: "CountryDisplay", + code: "IT", + country: "Włochy" + }, + { + __typename: "CountryDisplay", + code: "JE", + country: "Jersey" + }, + { + __typename: "CountryDisplay", + code: "LV", + country: "Łotwa" + }, + { + __typename: "CountryDisplay", + code: "LI", + country: "Liechtenstein" + }, + { + __typename: "CountryDisplay", + code: "LT", + country: "Litwa" + }, + { + __typename: "CountryDisplay", + code: "LU", + country: "Luksemburg" + }, + { + __typename: "CountryDisplay", + code: "MK", + country: "Macedonia" + }, + { + __typename: "CountryDisplay", + code: "MT", + country: "Malta" + }, + { + __typename: "CountryDisplay", + code: "MD", + country: "Mołdawia" + }, + { + __typename: "CountryDisplay", + code: "MC", + country: "Monako" + }, + { + __typename: "CountryDisplay", + code: "ME", + country: "Czarnogóra" + }, + { + __typename: "CountryDisplay", + code: "NL", + country: "Holandia" + }, + { + __typename: "CountryDisplay", + code: "NO", + country: "Norwegia" + }, + { + __typename: "CountryDisplay", + code: "PL", + country: "Polska" + }, + { + __typename: "CountryDisplay", + code: "PT", + country: "Portugalia" + }, + { + __typename: "CountryDisplay", + code: "RO", + country: "Rumunia" + }, + { + __typename: "CountryDisplay", + code: "RU", + country: "Rosja" + }, + { + __typename: "CountryDisplay", + code: "SM", + country: "San Marino" + }, + { + __typename: "CountryDisplay", + code: "RS", + country: "Serbia" + }, + { + __typename: "CountryDisplay", + code: "SK", + country: "Słowacja" + }, + { + __typename: "CountryDisplay", + code: "SI", + country: "Słowenia" + }, + { + __typename: "CountryDisplay", + code: "ES", + country: "Hiszpania" + }, + { + __typename: "CountryDisplay", + code: "SJ", + country: "Svalbard i Jan Mayen" + }, + { + __typename: "CountryDisplay", + code: "SE", + country: "Szwecja" + }, + { + __typename: "CountryDisplay", + code: "CH", + country: "Szwajcaria" + }, + { + __typename: "CountryDisplay", + code: "UA", + country: "Ukraina" + }, + { + __typename: "CountryDisplay", + code: "GB", + country: "Wielka Brytania" + } + ], + id: "U2hpcHBpbmdab25lOjE=", + name: "Europe" + }, + { + __typename: "ShippingZone", + countries: [ + { + __typename: "CountryDisplay", + code: "AS", + country: "Samoa Amerykańskie" + }, + { + __typename: "CountryDisplay", + code: "AU", + country: "Australia" + }, + { + __typename: "CountryDisplay", + code: "CX", + country: "Wyspa Bożego Narodzenia" + }, + { + __typename: "CountryDisplay", + code: "CC", + country: "Wyspy Kokosowe" + }, + { + __typename: "CountryDisplay", + code: "CK", + country: "Wyspy Cooka" + }, + { + __typename: "CountryDisplay", + code: "FJ", + country: "Fidżi" + }, + { + __typename: "CountryDisplay", + code: "PF", + country: "Polinezja Francuska" + }, + { + __typename: "CountryDisplay", + code: "GU", + country: "Guam" + }, + { + __typename: "CountryDisplay", + code: "HM", + country: "Wyspy Heard i McDonalda" + }, + { + __typename: "CountryDisplay", + code: "KI", + country: "Kiribati" + }, + { + __typename: "CountryDisplay", + code: "MH", + country: "Wyspy Marshalla" + }, + { + __typename: "CountryDisplay", + code: "FM", + country: "Mikronezja" + }, + { + __typename: "CountryDisplay", + code: "NR", + country: "Nauru" + }, + { + __typename: "CountryDisplay", + code: "NC", + country: "Nowa Kaledonia" + }, + { + __typename: "CountryDisplay", + code: "NZ", + country: "Nowa Zelandia" + }, + { + __typename: "CountryDisplay", + code: "NU", + country: "Niue" + }, + { + __typename: "CountryDisplay", + code: "NF", + country: "Norfolk" + }, + { + __typename: "CountryDisplay", + code: "MP", + country: "Mariany Północne" + }, + { + __typename: "CountryDisplay", + code: "PW", + country: "Palau" + }, + { + __typename: "CountryDisplay", + code: "PG", + country: "Papua-Nowa Gwinea" + }, + { + __typename: "CountryDisplay", + code: "PN", + country: "Pitcairn" + }, + { + __typename: "CountryDisplay", + code: "WS", + country: "Samoa" + }, + { + __typename: "CountryDisplay", + code: "SB", + country: "Wyspy Salomona" + }, + { + __typename: "CountryDisplay", + code: "TK", + country: "Tokelau" + }, + { + __typename: "CountryDisplay", + code: "TO", + country: "Tonga" + }, + { + __typename: "CountryDisplay", + code: "TV", + country: "Tuvalu" + }, + { + __typename: "CountryDisplay", + code: "UM", + country: "Dalekie Wyspy Mniejsze Stanów Zjednoczonych" + }, + { + __typename: "CountryDisplay", + code: "VU", + country: "Vanuatu" + }, + { + __typename: "CountryDisplay", + code: "WF", + country: "Wallis i Futuna" + } + ], + id: "U2hpcHBpbmdab25lOjI=", + name: "Oceania" + }, + { + __typename: "ShippingZone", + + countries: [ + { + __typename: "CountryDisplay", + code: "AF", + country: "Afganistan" + }, + { + __typename: "CountryDisplay", + code: "AM", + country: "Armenia" + }, + { + __typename: "CountryDisplay", + code: "AZ", + country: "Azerbejdżan" + }, + { + __typename: "CountryDisplay", + code: "BH", + country: "Bahrajn" + }, + { + __typename: "CountryDisplay", + code: "BD", + country: "Bangladesz" + }, + { + __typename: "CountryDisplay", + code: "BT", + country: "Bhutan" + }, + { + __typename: "CountryDisplay", + code: "BN", + country: "Brunei" + }, + { + __typename: "CountryDisplay", + code: "KH", + country: "Kambodża" + }, + { + __typename: "CountryDisplay", + code: "CN", + country: "Chiny" + }, + { + __typename: "CountryDisplay", + code: "CY", + country: "Cypr" + }, + { + __typename: "CountryDisplay", + code: "GE", + country: "Gruzja" + }, + { + __typename: "CountryDisplay", + code: "HK", + country: "Hongkong" + }, + { + __typename: "CountryDisplay", + code: "IN", + country: "Indie" + }, + { + __typename: "CountryDisplay", + code: "ID", + country: "Indonezja" + }, + { + __typename: "CountryDisplay", + code: "IR", + country: "Iran" + }, + { + __typename: "CountryDisplay", + code: "IQ", + country: "Irak" + }, + { + __typename: "CountryDisplay", + code: "IL", + country: "Izrael" + }, + { + __typename: "CountryDisplay", + code: "JP", + country: "Japonia" + }, + { + __typename: "CountryDisplay", + code: "JO", + country: "Jordania" + }, + { + __typename: "CountryDisplay", + code: "KZ", + country: "Kazachstan" + }, + { + __typename: "CountryDisplay", + code: "KP", + country: "Korea Północna" + }, + { + __typename: "CountryDisplay", + code: "KR", + country: "Korea Południowa" + }, + { + __typename: "CountryDisplay", + code: "KW", + country: "Kuwejt" + }, + { + __typename: "CountryDisplay", + code: "KG", + country: "Kirgistan" + }, + { + __typename: "CountryDisplay", + code: "LA", + country: "Laos" + }, + { + __typename: "CountryDisplay", + code: "LB", + country: "Liban" + }, + { + __typename: "CountryDisplay", + code: "MO", + country: "Makau" + }, + { + __typename: "CountryDisplay", + code: "MY", + country: "Malezja" + }, + { + __typename: "CountryDisplay", + code: "MV", + country: "Malediwy" + }, + { + __typename: "CountryDisplay", + code: "MN", + country: "Mongolia" + }, + { + __typename: "CountryDisplay", + code: "MM", + country: "Mjanma" + }, + { + __typename: "CountryDisplay", + code: "NP", + country: "Nepal" + }, + { + __typename: "CountryDisplay", + code: "OM", + country: "Oman" + }, + { + __typename: "CountryDisplay", + code: "PK", + country: "Pakistan" + }, + { + __typename: "CountryDisplay", + code: "PS", + country: "Palestyna" + }, + { + __typename: "CountryDisplay", + code: "PH", + country: "Filipiny" + }, + { + __typename: "CountryDisplay", + code: "QA", + country: "Katar" + }, + { + __typename: "CountryDisplay", + code: "SA", + country: "Arabia Saudyjska" + }, + { + __typename: "CountryDisplay", + code: "SG", + country: "Singapur" + }, + { + __typename: "CountryDisplay", + code: "LK", + country: "Sri Lanka" + }, + { + __typename: "CountryDisplay", + code: "SY", + country: "Syria" + }, + { + __typename: "CountryDisplay", + code: "TW", + country: "Tajwan" + }, + { + __typename: "CountryDisplay", + code: "TJ", + country: "Tadżykistan" + }, + { + __typename: "CountryDisplay", + code: "TH", + country: "Tajlandia" + }, + { + __typename: "CountryDisplay", + code: "TL", + country: "Timor Wschodni" + }, + { + __typename: "CountryDisplay", + code: "TR", + country: "Turcja" + }, + { + __typename: "CountryDisplay", + code: "TM", + country: "Turkmenistan" + }, + { + __typename: "CountryDisplay", + code: "AE", + country: "Zjednoczone Emiraty Arabskie" + }, + { + __typename: "CountryDisplay", + code: "UZ", + country: "Uzbekistan" + }, + { + __typename: "CountryDisplay", + code: "VN", + country: "Wietnam" + }, + { + __typename: "CountryDisplay", + code: "YE", + country: "Jemen" + } + ], + id: "U2hpcHBpbmdab25lOjM=", + name: "Asia" + }, + { + __typename: "ShippingZone", + + countries: [ + { + __typename: "CountryDisplay", + code: "AI", + country: "Anguilla" + }, + { + __typename: "CountryDisplay", + code: "AG", + country: "Antigua i Barbuda" + }, + { + __typename: "CountryDisplay", + code: "AR", + country: "Argentyna" + }, + { + __typename: "CountryDisplay", + code: "AW", + country: "Aruba" + }, + { + __typename: "CountryDisplay", + code: "BS", + country: "Bahamy" + }, + { + __typename: "CountryDisplay", + code: "BB", + country: "Barbados" + }, + { + __typename: "CountryDisplay", + code: "BZ", + country: "Belize" + }, + { + __typename: "CountryDisplay", + code: "BM", + country: "Bermudy" + }, + { + __typename: "CountryDisplay", + code: "BO", + country: "Boliwia" + }, + { + __typename: "CountryDisplay", + code: "BQ", + country: "Bonaire, Sint Eustatius i Saba" + }, + { + __typename: "CountryDisplay", + code: "BV", + country: "Wyspa Bouveta" + }, + { + __typename: "CountryDisplay", + code: "BR", + country: "Brazylia" + }, + { + __typename: "CountryDisplay", + code: "CA", + country: "Kanada" + }, + { + __typename: "CountryDisplay", + code: "KY", + country: "Kajmany" + }, + { + __typename: "CountryDisplay", + code: "CL", + country: "Chile" + }, + { + __typename: "CountryDisplay", + code: "CO", + country: "Kolumbia" + }, + { + __typename: "CountryDisplay", + code: "CR", + country: "Kostaryka" + }, + { + __typename: "CountryDisplay", + code: "CU", + country: "Kuba" + }, + { + __typename: "CountryDisplay", + code: "CW", + country: "Curaçao" + }, + { + __typename: "CountryDisplay", + code: "DM", + country: "Dominika" + }, + { + __typename: "CountryDisplay", + code: "DO", + country: "Dominikana" + }, + { + __typename: "CountryDisplay", + code: "EC", + country: "Ekwador" + }, + { + __typename: "CountryDisplay", + code: "SV", + country: "Salwador" + }, + { + __typename: "CountryDisplay", + code: "FK", + country: "Falklandy" + }, + { + __typename: "CountryDisplay", + code: "GF", + country: "Gujana Francuska" + }, + { + __typename: "CountryDisplay", + code: "GL", + country: "Grenlandia" + }, + { + __typename: "CountryDisplay", + code: "GD", + country: "Grenada" + }, + { + __typename: "CountryDisplay", + code: "GP", + country: "Gwadelupa" + }, + { + __typename: "CountryDisplay", + code: "GT", + country: "Gwatemala" + }, + { + __typename: "CountryDisplay", + code: "GY", + country: "Gujana" + }, + { + __typename: "CountryDisplay", + code: "HT", + country: "Haiti" + }, + { + __typename: "CountryDisplay", + code: "HN", + country: "Honduras" + }, + { + __typename: "CountryDisplay", + code: "JM", + country: "Jamajka" + }, + { + __typename: "CountryDisplay", + code: "MQ", + country: "Martynika" + }, + { + __typename: "CountryDisplay", + code: "MX", + country: "Meksyk" + }, + { + __typename: "CountryDisplay", + code: "MS", + country: "Montserrat" + }, + { + __typename: "CountryDisplay", + code: "NI", + country: "Nikaragua" + }, + { + __typename: "CountryDisplay", + code: "PA", + country: "Panama" + }, + { + __typename: "CountryDisplay", + code: "PY", + country: "Paragwaj" + }, + { + __typename: "CountryDisplay", + code: "PE", + country: "Peru" + }, + { + __typename: "CountryDisplay", + code: "PR", + country: "Portoryko" + }, + { + __typename: "CountryDisplay", + code: "BL", + country: "Saint-Barthélemy" + }, + { + __typename: "CountryDisplay", + code: "KN", + country: "Saint Kitts i Nevis" + }, + { + __typename: "CountryDisplay", + code: "LC", + country: "Saint Lucia" + }, + { + __typename: "CountryDisplay", + code: "MF", + country: "Saint-Martin" + }, + { + __typename: "CountryDisplay", + code: "PM", + country: "Saint-Pierre i Miquelon" + }, + { + __typename: "CountryDisplay", + code: "VC", + country: "Saint Vincent i Grenadyny" + }, + { + __typename: "CountryDisplay", + code: "SX", + country: "Sint Maarten" + }, + { + __typename: "CountryDisplay", + code: "GS", + country: "Georgia Południowa i Sandwich Południowy" + }, + { + __typename: "CountryDisplay", + code: "SR", + country: "Surinam" + }, + { + __typename: "CountryDisplay", + code: "TT", + country: "Trynidad i Tobago" + }, + { + __typename: "CountryDisplay", + code: "TC", + country: "Turks i Caicos" + }, + { + __typename: "CountryDisplay", + code: "US", + country: "Stany Zjednoczone Ameryki" + }, + { + __typename: "CountryDisplay", + code: "UY", + country: "Urugwaj" + }, + { + __typename: "CountryDisplay", + code: "VE", + country: "Wenezuela" + }, + { + __typename: "CountryDisplay", + code: "VG", + country: "Brytyjskie Wyspy Dziewicze" + }, + { + __typename: "CountryDisplay", + code: "VI", + country: "Wyspy Dziewicze Stanów Zjednoczonych" + } + ], + id: "U2hpcHBpbmdab25lOjQ=", + name: "Americas" + }, + { + __typename: "ShippingZone", + + countries: [ + { + __typename: "CountryDisplay", + code: "DZ", + country: "Algeria" + }, + { + __typename: "CountryDisplay", + code: "AO", + country: "Angola" + }, + { + __typename: "CountryDisplay", + code: "BJ", + country: "Benin" + }, + { + __typename: "CountryDisplay", + code: "BW", + country: "Botswana" + }, + { + __typename: "CountryDisplay", + code: "IO", + country: "Brytyjskie Terytorium Oceanu Indyjskiego" + }, + { + __typename: "CountryDisplay", + code: "BF", + country: "Burkina Faso" + }, + { + __typename: "CountryDisplay", + code: "BI", + country: "Burundi" + }, + { + __typename: "CountryDisplay", + code: "CV", + country: "Republika Zielonego Przylądka" + }, + { + __typename: "CountryDisplay", + code: "CM", + country: "Kamerun" + }, + { + __typename: "CountryDisplay", + code: "CF", + country: "Republika Środkowoafrykańska" + }, + { + __typename: "CountryDisplay", + code: "TD", + country: "Czad" + }, + { + __typename: "CountryDisplay", + code: "KM", + country: "Komory" + }, + { + __typename: "CountryDisplay", + code: "CG", + country: "Kongo" + }, + { + __typename: "CountryDisplay", + code: "CD", + country: "Kongo" + }, + { + __typename: "CountryDisplay", + code: "CI", + country: "Wybrzeże Kości Słoniowej" + }, + { + __typename: "CountryDisplay", + code: "DJ", + country: "Dżibuti" + }, + { + __typename: "CountryDisplay", + code: "EG", + country: "Egipt" + }, + { + __typename: "CountryDisplay", + code: "GQ", + country: "Gwinea Równikowa" + }, + { + __typename: "CountryDisplay", + code: "ER", + country: "Erytrea" + }, + { + __typename: "CountryDisplay", + code: "SZ", + country: "Suazi" + }, + { + __typename: "CountryDisplay", + code: "ET", + country: "Etiopia" + }, + { + __typename: "CountryDisplay", + code: "TF", + country: "Francuskie Terytoria Południowe i Antarktyczne" + }, + { + __typename: "CountryDisplay", + code: "GA", + country: "Gabon" + }, + { + __typename: "CountryDisplay", + code: "GM", + country: "Gambia" + }, + { + __typename: "CountryDisplay", + code: "GH", + country: "Ghana" + }, + { + __typename: "CountryDisplay", + code: "GN", + country: "Gwinea" + }, + { + __typename: "CountryDisplay", + code: "GW", + country: "Gwinea Bissau" + }, + { + __typename: "CountryDisplay", + code: "KE", + country: "Kenia" + }, + { + __typename: "CountryDisplay", + code: "LS", + country: "Lesotho" + }, + { + __typename: "CountryDisplay", + code: "LR", + country: "Liberia" + }, + { + __typename: "CountryDisplay", + code: "LY", + country: "Libia" + }, + { + __typename: "CountryDisplay", + code: "MG", + country: "Madagaskar" + }, + { + __typename: "CountryDisplay", + code: "MW", + country: "Malawi" + }, + { + __typename: "CountryDisplay", + code: "ML", + country: "Mali" + }, + { + __typename: "CountryDisplay", + code: "MR", + country: "Mauretania" + }, + { + __typename: "CountryDisplay", + code: "MU", + country: "Mauritius" + }, + { + __typename: "CountryDisplay", + code: "YT", + country: "Majotta" + }, + { + __typename: "CountryDisplay", + code: "MA", + country: "Maroko" + }, + { + __typename: "CountryDisplay", + code: "MZ", + country: "Mozambik" + }, + { + __typename: "CountryDisplay", + code: "NA", + country: "Namibia" + }, + { + __typename: "CountryDisplay", + code: "NE", + country: "Niger" + }, + { + __typename: "CountryDisplay", + code: "NG", + country: "Nigeria" + }, + { + __typename: "CountryDisplay", + code: "RE", + country: "Reunion" + }, + { + __typename: "CountryDisplay", + code: "RW", + country: "Rwanda" + }, + { + __typename: "CountryDisplay", + code: "SH", + country: + "Wyspa Świętej Heleny, Wyspa Wniebowstąpienia i Tristan da Cunha" + }, + { + __typename: "CountryDisplay", + code: "ST", + country: "Wyspy Świętego Tomasza i Książęca" + }, + { + __typename: "CountryDisplay", + code: "SN", + country: "Senegal" + }, + { + __typename: "CountryDisplay", + code: "SC", + country: "Seszele" + }, + { + __typename: "CountryDisplay", + code: "SL", + country: "Sierra Leone" + }, + { + __typename: "CountryDisplay", + code: "SO", + country: "Somalia" + }, + { + __typename: "CountryDisplay", + code: "ZA", + country: "Republika Południowej Afryki" + }, + { + __typename: "CountryDisplay", + code: "SS", + country: "Sudan Południowy" + }, + { + __typename: "CountryDisplay", + code: "SD", + country: "Sudan" + }, + { + __typename: "CountryDisplay", + code: "TZ", + country: "Tanzania" + }, + { + __typename: "CountryDisplay", + code: "TG", + country: "Togo" + }, + { + __typename: "CountryDisplay", + code: "TN", + country: "Tunezja" + }, + { + __typename: "CountryDisplay", + code: "UG", + country: "Uganda" + }, + { + __typename: "CountryDisplay", + code: "EH", + country: "Sahara Zachodnia" + }, + { + __typename: "CountryDisplay", + code: "ZM", + country: "Zambia" + }, + { + __typename: "CountryDisplay", + code: "ZW", + country: "Zimbabwe" + } + ], + id: "U2hpcHBpbmdab25lOjU=", + name: "Africa" + } +]; + +export const shippingZone: ShippingZoneDetailsFragment = { + __typename: "ShippingZone", + countries: [ + { + __typename: "CountryDisplay", + code: "AX", + country: "Wyspy Alandzkie" + }, + { + __typename: "CountryDisplay", + code: "AL", + country: "Albania" + }, + { + __typename: "CountryDisplay", + code: "AD", + country: "Andora" + }, + { + __typename: "CountryDisplay", + code: "AT", + country: "Austria" + }, + { + __typename: "CountryDisplay", + code: "BY", + country: "Białoruś" + }, + { + __typename: "CountryDisplay", + code: "BE", + country: "Belgia" + }, + { + __typename: "CountryDisplay", + code: "BA", + country: "Bośnia i Hercegowina" + }, + { + __typename: "CountryDisplay", + code: "BG", + country: "Bułgaria" + }, + { + __typename: "CountryDisplay", + code: "HR", + country: "Chorwacja" + }, + { + __typename: "CountryDisplay", + code: "CZ", + country: "Czechy" + }, + { + __typename: "CountryDisplay", + code: "DK", + country: "Dania" + }, + { + __typename: "CountryDisplay", + code: "EE", + country: "Estonia" + }, + { + __typename: "CountryDisplay", + code: "FO", + country: "Wyspy Owcze" + }, + { + __typename: "CountryDisplay", + code: "FI", + country: "Finlandia" + }, + { + __typename: "CountryDisplay", + code: "FR", + country: "Francja" + }, + { + __typename: "CountryDisplay", + code: "DE", + country: "Niemcy" + }, + { + __typename: "CountryDisplay", + code: "GI", + country: "Gibraltar" + }, + { + __typename: "CountryDisplay", + code: "GR", + country: "Grecja" + }, + { + __typename: "CountryDisplay", + code: "GG", + country: "Guernsey" + }, + { + __typename: "CountryDisplay", + code: "VA", + country: "Watykan" + }, + { + __typename: "CountryDisplay", + code: "HU", + country: "Węgry" + }, + { + __typename: "CountryDisplay", + code: "IS", + country: "Islandia" + }, + { + __typename: "CountryDisplay", + code: "IE", + country: "Irlandia" + }, + { + __typename: "CountryDisplay", + code: "IM", + country: "Wyspa Man" + }, + { + __typename: "CountryDisplay", + code: "IT", + country: "Włochy" + }, + { + __typename: "CountryDisplay", + code: "JE", + country: "Jersey" + }, + { + __typename: "CountryDisplay", + code: "LV", + country: "Łotwa" + }, + { + __typename: "CountryDisplay", + code: "LI", + country: "Liechtenstein" + }, + { + __typename: "CountryDisplay", + code: "LT", + country: "Litwa" + }, + { + __typename: "CountryDisplay", + code: "LU", + country: "Luksemburg" + }, + { + __typename: "CountryDisplay", + code: "MK", + country: "Macedonia" + }, + { + __typename: "CountryDisplay", + code: "MT", + country: "Malta" + }, + { + __typename: "CountryDisplay", + code: "MD", + country: "Mołdawia" + }, + { + __typename: "CountryDisplay", + code: "MC", + country: "Monako" + }, + { + __typename: "CountryDisplay", + code: "ME", + country: "Czarnogóra" + }, + { + __typename: "CountryDisplay", + code: "NL", + country: "Holandia" + }, + { + __typename: "CountryDisplay", + code: "NO", + country: "Norwegia" + }, + { + __typename: "CountryDisplay", + code: "PL", + country: "Polska" + }, + { + __typename: "CountryDisplay", + code: "PT", + country: "Portugalia" + }, + { + __typename: "CountryDisplay", + code: "RO", + country: "Rumunia" + }, + { + __typename: "CountryDisplay", + code: "RU", + country: "Rosja" + }, + { + __typename: "CountryDisplay", + code: "SM", + country: "San Marino" + }, + { + __typename: "CountryDisplay", + code: "RS", + country: "Serbia" + }, + { + __typename: "CountryDisplay", + code: "SK", + country: "Słowacja" + }, + { + __typename: "CountryDisplay", + code: "SI", + country: "Słowenia" + }, + { + __typename: "CountryDisplay", + code: "ES", + country: "Hiszpania" + }, + { + __typename: "CountryDisplay", + code: "SJ", + country: "Svalbard i Jan Mayen" + }, + { + __typename: "CountryDisplay", + code: "SE", + country: "Szwecja" + }, + { + __typename: "CountryDisplay", + code: "CH", + country: "Szwajcaria" + }, + { + __typename: "CountryDisplay", + code: "UA", + country: "Ukraina" + }, + { + __typename: "CountryDisplay", + code: "GB", + country: "Wielka Brytania" + } + ], + default: false, + id: "U2hpcHBpbmdab25lOjE=", + name: "Europe", + shippingMethods: [ + { + __typename: "ShippingMethod", + id: "U2hpcHBpbmdNZXRob2Q6NA==", + maximumOrderPrice: null, + maximumOrderWeight: { + __typename: "Weight", + unit: "kg", + value: 80 + }, + minimumOrderPrice: { + __typename: "Money", + amount: 0, + currency: "USD" + }, + minimumOrderWeight: { + __typename: "Weight", + unit: "kg", + value: 0 + }, + name: "DB Schenker", + price: { + __typename: "Money", + amount: 45.93, + currency: "USD" + }, + type: ShippingMethodTypeEnum.WEIGHT + }, + { + __typename: "ShippingMethod", + id: "U2hpcHBpbmdNZXRob2Q6Mw==", + maximumOrderPrice: null, + maximumOrderWeight: null, + minimumOrderPrice: { + __typename: "Money", + amount: 0, + currency: "USD" + }, + minimumOrderWeight: { + __typename: "Weight", + unit: "kg", + value: 0 + }, + name: "Registred priority", + price: { + __typename: "Money", + amount: 73.87, + currency: "USD" + }, + type: ShippingMethodTypeEnum.WEIGHT + }, + { + __typename: "ShippingMethod", + id: "U2hpcHBpbmdNZXRob2Q6Mg==", + maximumOrderPrice: null, + maximumOrderWeight: null, + minimumOrderPrice: { + __typename: "Money", + amount: 0, + currency: "USD" + }, + minimumOrderWeight: { + __typename: "Weight", + unit: "kg", + value: 0 + }, + + name: "UPS", + price: { + __typename: "Money", + amount: 48.11, + currency: "USD" + }, + type: ShippingMethodTypeEnum.PRICE + }, + { + __typename: "ShippingMethod", + id: "U2hpcHBpbmdNZXRob2Q6MQ==", + maximumOrderPrice: null, + maximumOrderWeight: null, + minimumOrderPrice: { + __typename: "Money", + amount: 0, + currency: "USD" + }, + minimumOrderWeight: { + __typename: "Weight", + unit: "kg", + value: 0 + }, + name: "DHL", + price: { + __typename: "Money", + amount: 95.24, + currency: "USD" + }, + type: ShippingMethodTypeEnum.PRICE + } + ] +}; diff --git a/src/shipping/index.tsx b/src/shipping/index.tsx new file mode 100644 index 000000000..ca38149ef --- /dev/null +++ b/src/shipping/index.tsx @@ -0,0 +1,52 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { + shippingZoneAddPath, + shippingZonePath, + shippingZonesListPath, + ShippingZonesListUrlQueryParams, + ShippingZoneUrlQueryParams +} from "./urls"; +import ShippingZoneCreate from "./views/ShippingZoneCreate"; +import ShippingZoneDetailsComponent from "./views/ShippingZoneDetails"; +import ShippingZonesListComponent from "./views/ShippingZonesList"; + +const ShippingZonesList: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: ShippingZonesListUrlQueryParams = qs; + return ; +}; + +interface ShippingZoneDetailsRouteProps { + id: string; +} +const ShippingZoneDetails: React.StatelessComponent< + RouteComponentProps +> = ({ location, match }) => { + const qs = parseQs(location.search.substr(1)); + const params: ShippingZoneUrlQueryParams = qs; + return ( + + ); +}; + +export const ShippingRouter: React.StatelessComponent = () => ( + <> + + + + + + + +); +export default ShippingRouter; diff --git a/src/shipping/mutations.ts b/src/shipping/mutations.ts new file mode 100644 index 000000000..35966447b --- /dev/null +++ b/src/shipping/mutations.ts @@ -0,0 +1,209 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { countryFragment } from "../taxes/queries"; +import { shippingMethodFragment, shippingZoneDetailsFragment } from "./queries"; +import { + BulkDeleteShippingRate, + BulkDeleteShippingRateVariables +} from "./types/BulkDeleteShippingRate"; +import { + BulkDeleteShippingZone, + BulkDeleteShippingZoneVariables +} from "./types/BulkDeleteShippingZone"; +import { + CreateShippingRate, + CreateShippingRateVariables +} from "./types/CreateShippingRate"; +import { + CreateShippingZone, + CreateShippingZoneVariables +} from "./types/CreateShippingZone"; +import { + DeleteShippingRate, + DeleteShippingRateVariables +} from "./types/DeleteShippingRate"; +import { + DeleteShippingZone, + DeleteShippingZoneVariables +} from "./types/DeleteShippingZone"; +import { + UpdateDefaultWeightUnit, + UpdateDefaultWeightUnitVariables +} from "./types/UpdateDefaultWeightUnit"; +import { + UpdateShippingRate, + UpdateShippingRateVariables +} from "./types/UpdateShippingRate"; +import { + UpdateShippingZone, + UpdateShippingZoneVariables +} from "./types/UpdateShippingZone"; + +const deleteShippingZone = gql` + mutation DeleteShippingZone($id: ID!) { + shippingZoneDelete(id: $id) { + errors { + field + message + } + } + } +`; +export const TypedDeleteShippingZone = TypedMutation< + DeleteShippingZone, + DeleteShippingZoneVariables +>(deleteShippingZone); + +const bulkDeleteShippingZone = gql` + mutation BulkDeleteShippingZone($ids: [ID]!) { + shippingZoneBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedBulkDeleteShippingZone = TypedMutation< + BulkDeleteShippingZone, + BulkDeleteShippingZoneVariables +>(bulkDeleteShippingZone); + +const updateDefaultWeightUnit = gql` + mutation UpdateDefaultWeightUnit($unit: WeightUnitsEnum) { + shopSettingsUpdate(input: { defaultWeightUnit: $unit }) { + errors { + field + message + } + shop { + defaultWeightUnit + } + } + } +`; +export const TypedUpdateDefaultWeightUnit = TypedMutation< + UpdateDefaultWeightUnit, + UpdateDefaultWeightUnitVariables +>(updateDefaultWeightUnit); + +const createShippingZone = gql` + ${countryFragment} + mutation CreateShippingZone($input: ShippingZoneInput!) { + shippingZoneCreate(input: $input) { + errors { + field + message + } + shippingZone { + countries { + ...CountryFragment + } + default + id + name + } + } + } +`; +export const TypedCreateShippingZone = TypedMutation< + CreateShippingZone, + CreateShippingZoneVariables +>(createShippingZone); + +const updateShippingZone = gql` + ${countryFragment} + mutation UpdateShippingZone($id: ID!, $input: ShippingZoneInput!) { + shippingZoneUpdate(id: $id, input: $input) { + errors { + field + message + } + shippingZone { + countries { + ...CountryFragment + } + default + id + name + } + } + } +`; +export const TypedUpdateShippingZone = TypedMutation< + UpdateShippingZone, + UpdateShippingZoneVariables +>(updateShippingZone); + +const updateShippingRate = gql` + ${shippingMethodFragment} + mutation UpdateShippingRate($id: ID!, $input: ShippingPriceInput!) { + shippingPriceUpdate(id: $id, input: $input) { + errors { + field + message + } + shippingMethod { + ...ShippingMethodFragment + } + } + } +`; +export const TypedUpdateShippingRate = TypedMutation< + UpdateShippingRate, + UpdateShippingRateVariables +>(updateShippingRate); + +const createShippingRate = gql` + ${shippingZoneDetailsFragment} + mutation CreateShippingRate($input: ShippingPriceInput!) { + shippingPriceCreate(input: $input) { + errors { + field + message + } + shippingZone { + ...ShippingZoneDetailsFragment + } + } + } +`; +export const TypedCreateShippingRate = TypedMutation< + CreateShippingRate, + CreateShippingRateVariables +>(createShippingRate); + +const deleteShippingRate = gql` + ${shippingZoneDetailsFragment} + mutation DeleteShippingRate($id: ID!) { + shippingPriceDelete(id: $id) { + errors { + field + message + } + shippingZone { + ...ShippingZoneDetailsFragment + } + } + } +`; +export const TypedDeleteShippingRate = TypedMutation< + DeleteShippingRate, + DeleteShippingRateVariables +>(deleteShippingRate); + +const bulkDeleteShippingRate = gql` + mutation BulkDeleteShippingRate($ids: [ID]!) { + shippingPriceBulkDelete(ids: $ids) { + errors { + field + message + } + } + } +`; +export const TypedBulkDeleteShippingRate = TypedMutation< + BulkDeleteShippingRate, + BulkDeleteShippingRateVariables +>(bulkDeleteShippingRate); diff --git a/src/shipping/queries.ts b/src/shipping/queries.ts new file mode 100644 index 000000000..9a4a1b4e9 --- /dev/null +++ b/src/shipping/queries.ts @@ -0,0 +1,93 @@ +import gql from "graphql-tag"; + +import { pageInfoFragment, TypedQuery } from "../queries"; +import { ShippingZone, ShippingZoneVariables } from "./types/ShippingZone"; +import { ShippingZones, ShippingZonesVariables } from "./types/ShippingZones"; + +export const shippingZoneFragment = gql` + fragment ShippingZoneFragment on ShippingZone { + id + countries { + code + country + } + name + } +`; +export const shippingMethodFragment = gql` + fragment ShippingMethodFragment on ShippingMethod { + id + minimumOrderPrice { + amount + currency + } + minimumOrderWeight { + unit + value + } + maximumOrderPrice { + amount + currency + } + maximumOrderWeight { + unit + value + } + name + price { + amount + currency + } + type + } +`; +export const shippingZoneDetailsFragment = gql` + ${shippingZoneFragment} + ${shippingMethodFragment} + fragment ShippingZoneDetailsFragment on ShippingZone { + ...ShippingZoneFragment + default + shippingMethods { + ...ShippingMethodFragment + } + } +`; + +const shippingZones = gql` + ${pageInfoFragment} + ${shippingZoneFragment} + query ShippingZones( + $first: Int + $after: String + $last: Int + $before: String + ) { + shippingZones(first: $first, after: $after, last: $last, before: $before) { + edges { + node { + ...ShippingZoneFragment + } + } + pageInfo { + ...PageInfoFragment + } + } + } +`; +export const TypedShippingZones = TypedQuery< + ShippingZones, + ShippingZonesVariables +>(shippingZones); + +const shippingZone = gql` + ${shippingZoneDetailsFragment} + query ShippingZone($id: ID!) { + shippingZone(id: $id) { + ...ShippingZoneDetailsFragment + } + } +`; +export const TypedShippingZone = TypedQuery< + ShippingZone, + ShippingZoneVariables +>(shippingZone); diff --git a/src/shipping/types/BulkDeleteShippingRate.ts b/src/shipping/types/BulkDeleteShippingRate.ts new file mode 100644 index 000000000..f6e958599 --- /dev/null +++ b/src/shipping/types/BulkDeleteShippingRate.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: BulkDeleteShippingRate +// ==================================================== + +export interface BulkDeleteShippingRate_shippingPriceBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface BulkDeleteShippingRate_shippingPriceBulkDelete { + __typename: "ShippingPriceBulkDelete"; + errors: BulkDeleteShippingRate_shippingPriceBulkDelete_errors[] | null; +} + +export interface BulkDeleteShippingRate { + shippingPriceBulkDelete: BulkDeleteShippingRate_shippingPriceBulkDelete | null; +} + +export interface BulkDeleteShippingRateVariables { + ids: (string | null)[]; +} diff --git a/src/shipping/types/BulkDeleteShippingZone.ts b/src/shipping/types/BulkDeleteShippingZone.ts new file mode 100644 index 000000000..38f30216d --- /dev/null +++ b/src/shipping/types/BulkDeleteShippingZone.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: BulkDeleteShippingZone +// ==================================================== + +export interface BulkDeleteShippingZone_shippingZoneBulkDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface BulkDeleteShippingZone_shippingZoneBulkDelete { + __typename: "ShippingZoneBulkDelete"; + errors: BulkDeleteShippingZone_shippingZoneBulkDelete_errors[] | null; +} + +export interface BulkDeleteShippingZone { + shippingZoneBulkDelete: BulkDeleteShippingZone_shippingZoneBulkDelete | null; +} + +export interface BulkDeleteShippingZoneVariables { + ids: (string | null)[]; +} diff --git a/src/shipping/types/CreateShippingRate.ts b/src/shipping/types/CreateShippingRate.ts new file mode 100644 index 000000000..0d1326c9c --- /dev/null +++ b/src/shipping/types/CreateShippingRate.ts @@ -0,0 +1,86 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ShippingPriceInput, ShippingMethodTypeEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: CreateShippingRate +// ==================================================== + +export interface CreateShippingRate_shippingPriceCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CreateShippingRate_shippingPriceCreate_shippingZone_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_minimumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_minimumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_maximumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_maximumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods { + __typename: "ShippingMethod"; + id: string; + minimumOrderPrice: CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_minimumOrderPrice | null; + minimumOrderWeight: CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_minimumOrderWeight | null; + maximumOrderPrice: CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_maximumOrderPrice | null; + maximumOrderWeight: CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_maximumOrderWeight | null; + name: string; + price: CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_price | null; + type: ShippingMethodTypeEnum | null; +} + +export interface CreateShippingRate_shippingPriceCreate_shippingZone { + __typename: "ShippingZone"; + id: string; + countries: (CreateShippingRate_shippingPriceCreate_shippingZone_countries | null)[] | null; + name: string; + default: boolean; + shippingMethods: (CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods | null)[] | null; +} + +export interface CreateShippingRate_shippingPriceCreate { + __typename: "ShippingPriceCreate"; + errors: CreateShippingRate_shippingPriceCreate_errors[] | null; + shippingZone: CreateShippingRate_shippingPriceCreate_shippingZone | null; +} + +export interface CreateShippingRate { + shippingPriceCreate: CreateShippingRate_shippingPriceCreate | null; +} + +export interface CreateShippingRateVariables { + input: ShippingPriceInput; +} diff --git a/src/shipping/types/CreateShippingZone.ts b/src/shipping/types/CreateShippingZone.ts new file mode 100644 index 000000000..e82ba553e --- /dev/null +++ b/src/shipping/types/CreateShippingZone.ts @@ -0,0 +1,43 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ShippingZoneInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: CreateShippingZone +// ==================================================== + +export interface CreateShippingZone_shippingZoneCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface CreateShippingZone_shippingZoneCreate_shippingZone_countries { + __typename: "CountryDisplay"; + country: string; + code: string; +} + +export interface CreateShippingZone_shippingZoneCreate_shippingZone { + __typename: "ShippingZone"; + countries: (CreateShippingZone_shippingZoneCreate_shippingZone_countries | null)[] | null; + default: boolean; + id: string; + name: string; +} + +export interface CreateShippingZone_shippingZoneCreate { + __typename: "ShippingZoneCreate"; + errors: CreateShippingZone_shippingZoneCreate_errors[] | null; + shippingZone: CreateShippingZone_shippingZoneCreate_shippingZone | null; +} + +export interface CreateShippingZone { + shippingZoneCreate: CreateShippingZone_shippingZoneCreate | null; +} + +export interface CreateShippingZoneVariables { + input: ShippingZoneInput; +} diff --git a/src/shipping/types/DeleteShippingRate.ts b/src/shipping/types/DeleteShippingRate.ts new file mode 100644 index 000000000..cc37e44e2 --- /dev/null +++ b/src/shipping/types/DeleteShippingRate.ts @@ -0,0 +1,86 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ShippingMethodTypeEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: DeleteShippingRate +// ==================================================== + +export interface DeleteShippingRate_shippingPriceDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface DeleteShippingRate_shippingPriceDelete_shippingZone_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_minimumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_minimumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_maximumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_maximumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods { + __typename: "ShippingMethod"; + id: string; + minimumOrderPrice: DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_minimumOrderPrice | null; + minimumOrderWeight: DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_minimumOrderWeight | null; + maximumOrderPrice: DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_maximumOrderPrice | null; + maximumOrderWeight: DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_maximumOrderWeight | null; + name: string; + price: DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_price | null; + type: ShippingMethodTypeEnum | null; +} + +export interface DeleteShippingRate_shippingPriceDelete_shippingZone { + __typename: "ShippingZone"; + id: string; + countries: (DeleteShippingRate_shippingPriceDelete_shippingZone_countries | null)[] | null; + name: string; + default: boolean; + shippingMethods: (DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods | null)[] | null; +} + +export interface DeleteShippingRate_shippingPriceDelete { + __typename: "ShippingPriceDelete"; + errors: DeleteShippingRate_shippingPriceDelete_errors[] | null; + shippingZone: DeleteShippingRate_shippingPriceDelete_shippingZone | null; +} + +export interface DeleteShippingRate { + shippingPriceDelete: DeleteShippingRate_shippingPriceDelete | null; +} + +export interface DeleteShippingRateVariables { + id: string; +} diff --git a/src/shipping/types/DeleteShippingZone.ts b/src/shipping/types/DeleteShippingZone.ts new file mode 100644 index 000000000..5f1cbb176 --- /dev/null +++ b/src/shipping/types/DeleteShippingZone.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: DeleteShippingZone +// ==================================================== + +export interface DeleteShippingZone_shippingZoneDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface DeleteShippingZone_shippingZoneDelete { + __typename: "ShippingZoneDelete"; + errors: DeleteShippingZone_shippingZoneDelete_errors[] | null; +} + +export interface DeleteShippingZone { + shippingZoneDelete: DeleteShippingZone_shippingZoneDelete | null; +} + +export interface DeleteShippingZoneVariables { + id: string; +} diff --git a/src/shipping/types/ShippingMethodFragment.ts b/src/shipping/types/ShippingMethodFragment.ts new file mode 100644 index 000000000..0c33ded59 --- /dev/null +++ b/src/shipping/types/ShippingMethodFragment.ts @@ -0,0 +1,51 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ShippingMethodTypeEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: ShippingMethodFragment +// ==================================================== + +export interface ShippingMethodFragment_minimumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingMethodFragment_minimumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ShippingMethodFragment_maximumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingMethodFragment_maximumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ShippingMethodFragment_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingMethodFragment { + __typename: "ShippingMethod"; + id: string; + minimumOrderPrice: ShippingMethodFragment_minimumOrderPrice | null; + minimumOrderWeight: ShippingMethodFragment_minimumOrderWeight | null; + maximumOrderPrice: ShippingMethodFragment_maximumOrderPrice | null; + maximumOrderWeight: ShippingMethodFragment_maximumOrderWeight | null; + name: string; + price: ShippingMethodFragment_price | null; + type: ShippingMethodTypeEnum | null; +} diff --git a/src/shipping/types/ShippingZone.ts b/src/shipping/types/ShippingZone.ts new file mode 100644 index 000000000..7b8dc090b --- /dev/null +++ b/src/shipping/types/ShippingZone.ts @@ -0,0 +1,74 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ShippingMethodTypeEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: ShippingZone +// ==================================================== + +export interface ShippingZone_shippingZone_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ShippingZone_shippingZone_shippingMethods_minimumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingZone_shippingZone_shippingMethods_minimumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ShippingZone_shippingZone_shippingMethods_maximumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingZone_shippingZone_shippingMethods_maximumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ShippingZone_shippingZone_shippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingZone_shippingZone_shippingMethods { + __typename: "ShippingMethod"; + id: string; + minimumOrderPrice: ShippingZone_shippingZone_shippingMethods_minimumOrderPrice | null; + minimumOrderWeight: ShippingZone_shippingZone_shippingMethods_minimumOrderWeight | null; + maximumOrderPrice: ShippingZone_shippingZone_shippingMethods_maximumOrderPrice | null; + maximumOrderWeight: ShippingZone_shippingZone_shippingMethods_maximumOrderWeight | null; + name: string; + price: ShippingZone_shippingZone_shippingMethods_price | null; + type: ShippingMethodTypeEnum | null; +} + +export interface ShippingZone_shippingZone { + __typename: "ShippingZone"; + id: string; + countries: (ShippingZone_shippingZone_countries | null)[] | null; + name: string; + default: boolean; + shippingMethods: (ShippingZone_shippingZone_shippingMethods | null)[] | null; +} + +export interface ShippingZone { + shippingZone: ShippingZone_shippingZone | null; +} + +export interface ShippingZoneVariables { + id: string; +} diff --git a/src/shipping/types/ShippingZoneDetailsFragment.ts b/src/shipping/types/ShippingZoneDetailsFragment.ts new file mode 100644 index 000000000..981e085a9 --- /dev/null +++ b/src/shipping/types/ShippingZoneDetailsFragment.ts @@ -0,0 +1,66 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ShippingMethodTypeEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: ShippingZoneDetailsFragment +// ==================================================== + +export interface ShippingZoneDetailsFragment_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ShippingZoneDetailsFragment_shippingMethods_minimumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingZoneDetailsFragment_shippingMethods_minimumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ShippingZoneDetailsFragment_shippingMethods_maximumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingZoneDetailsFragment_shippingMethods_maximumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface ShippingZoneDetailsFragment_shippingMethods_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingZoneDetailsFragment_shippingMethods { + __typename: "ShippingMethod"; + id: string; + minimumOrderPrice: ShippingZoneDetailsFragment_shippingMethods_minimumOrderPrice | null; + minimumOrderWeight: ShippingZoneDetailsFragment_shippingMethods_minimumOrderWeight | null; + maximumOrderPrice: ShippingZoneDetailsFragment_shippingMethods_maximumOrderPrice | null; + maximumOrderWeight: ShippingZoneDetailsFragment_shippingMethods_maximumOrderWeight | null; + name: string; + price: ShippingZoneDetailsFragment_shippingMethods_price | null; + type: ShippingMethodTypeEnum | null; +} + +export interface ShippingZoneDetailsFragment { + __typename: "ShippingZone"; + id: string; + countries: (ShippingZoneDetailsFragment_countries | null)[] | null; + name: string; + default: boolean; + shippingMethods: (ShippingZoneDetailsFragment_shippingMethods | null)[] | null; +} diff --git a/src/shipping/types/ShippingZoneFragment.ts b/src/shipping/types/ShippingZoneFragment.ts new file mode 100644 index 000000000..c5523d418 --- /dev/null +++ b/src/shipping/types/ShippingZoneFragment.ts @@ -0,0 +1,20 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: ShippingZoneFragment +// ==================================================== + +export interface ShippingZoneFragment_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ShippingZoneFragment { + __typename: "ShippingZone"; + id: string; + countries: (ShippingZoneFragment_countries | null)[] | null; + name: string; +} diff --git a/src/shipping/types/ShippingZones.ts b/src/shipping/types/ShippingZones.ts new file mode 100644 index 000000000..fc56f06d9 --- /dev/null +++ b/src/shipping/types/ShippingZones.ts @@ -0,0 +1,50 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: ShippingZones +// ==================================================== + +export interface ShippingZones_shippingZones_edges_node_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ShippingZones_shippingZones_edges_node { + __typename: "ShippingZone"; + id: string; + countries: (ShippingZones_shippingZones_edges_node_countries | null)[] | null; + name: string; +} + +export interface ShippingZones_shippingZones_edges { + __typename: "ShippingZoneCountableEdge"; + node: ShippingZones_shippingZones_edges_node; +} + +export interface ShippingZones_shippingZones_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface ShippingZones_shippingZones { + __typename: "ShippingZoneCountableConnection"; + edges: ShippingZones_shippingZones_edges[]; + pageInfo: ShippingZones_shippingZones_pageInfo; +} + +export interface ShippingZones { + shippingZones: ShippingZones_shippingZones | null; +} + +export interface ShippingZonesVariables { + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/shipping/types/UpdateDefaultWeightUnit.ts b/src/shipping/types/UpdateDefaultWeightUnit.ts new file mode 100644 index 000000000..b24aab1ab --- /dev/null +++ b/src/shipping/types/UpdateDefaultWeightUnit.ts @@ -0,0 +1,34 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { WeightUnitsEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: UpdateDefaultWeightUnit +// ==================================================== + +export interface UpdateDefaultWeightUnit_shopSettingsUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface UpdateDefaultWeightUnit_shopSettingsUpdate_shop { + __typename: "Shop"; + defaultWeightUnit: WeightUnitsEnum | null; +} + +export interface UpdateDefaultWeightUnit_shopSettingsUpdate { + __typename: "ShopSettingsUpdate"; + errors: UpdateDefaultWeightUnit_shopSettingsUpdate_errors[] | null; + shop: UpdateDefaultWeightUnit_shopSettingsUpdate_shop | null; +} + +export interface UpdateDefaultWeightUnit { + shopSettingsUpdate: UpdateDefaultWeightUnit_shopSettingsUpdate | null; +} + +export interface UpdateDefaultWeightUnitVariables { + unit?: WeightUnitsEnum | null; +} diff --git a/src/shipping/types/UpdateShippingRate.ts b/src/shipping/types/UpdateShippingRate.ts new file mode 100644 index 000000000..70f1ad65c --- /dev/null +++ b/src/shipping/types/UpdateShippingRate.ts @@ -0,0 +1,72 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ShippingPriceInput, ShippingMethodTypeEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: UpdateShippingRate +// ==================================================== + +export interface UpdateShippingRate_shippingPriceUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod_minimumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod_minimumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod_maximumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod_maximumOrderWeight { + __typename: "Weight"; + unit: string; + value: number; +} + +export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod { + __typename: "ShippingMethod"; + id: string; + minimumOrderPrice: UpdateShippingRate_shippingPriceUpdate_shippingMethod_minimumOrderPrice | null; + minimumOrderWeight: UpdateShippingRate_shippingPriceUpdate_shippingMethod_minimumOrderWeight | null; + maximumOrderPrice: UpdateShippingRate_shippingPriceUpdate_shippingMethod_maximumOrderPrice | null; + maximumOrderWeight: UpdateShippingRate_shippingPriceUpdate_shippingMethod_maximumOrderWeight | null; + name: string; + price: UpdateShippingRate_shippingPriceUpdate_shippingMethod_price | null; + type: ShippingMethodTypeEnum | null; +} + +export interface UpdateShippingRate_shippingPriceUpdate { + __typename: "ShippingPriceUpdate"; + errors: UpdateShippingRate_shippingPriceUpdate_errors[] | null; + shippingMethod: UpdateShippingRate_shippingPriceUpdate_shippingMethod | null; +} + +export interface UpdateShippingRate { + shippingPriceUpdate: UpdateShippingRate_shippingPriceUpdate | null; +} + +export interface UpdateShippingRateVariables { + id: string; + input: ShippingPriceInput; +} diff --git a/src/shipping/types/UpdateShippingZone.ts b/src/shipping/types/UpdateShippingZone.ts new file mode 100644 index 000000000..f6ef4621c --- /dev/null +++ b/src/shipping/types/UpdateShippingZone.ts @@ -0,0 +1,44 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { ShippingZoneInput } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: UpdateShippingZone +// ==================================================== + +export interface UpdateShippingZone_shippingZoneUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface UpdateShippingZone_shippingZoneUpdate_shippingZone_countries { + __typename: "CountryDisplay"; + country: string; + code: string; +} + +export interface UpdateShippingZone_shippingZoneUpdate_shippingZone { + __typename: "ShippingZone"; + countries: (UpdateShippingZone_shippingZoneUpdate_shippingZone_countries | null)[] | null; + default: boolean; + id: string; + name: string; +} + +export interface UpdateShippingZone_shippingZoneUpdate { + __typename: "ShippingZoneUpdate"; + errors: UpdateShippingZone_shippingZoneUpdate_errors[] | null; + shippingZone: UpdateShippingZone_shippingZoneUpdate_shippingZone | null; +} + +export interface UpdateShippingZone { + shippingZoneUpdate: UpdateShippingZone_shippingZoneUpdate | null; +} + +export interface UpdateShippingZoneVariables { + id: string; + input: ShippingZoneInput; +} diff --git a/src/shipping/urls.ts b/src/shipping/urls.ts new file mode 100644 index 000000000..c622da0a7 --- /dev/null +++ b/src/shipping/urls.ts @@ -0,0 +1,39 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { BulkAction, Dialog, Pagination, SingleAction } from "../types"; +import { ShippingMethodTypeEnum } from "../types/globalTypes"; + +export const shippingSection = "/shipping/"; + +export const shippingZonesListPath = shippingSection; +export type ShippingZonesListUrlDialog = "remove" | "remove-many"; +export type ShippingZonesListUrlQueryParams = BulkAction & + Dialog & + Pagination & + SingleAction; +export const shippingZonesListUrl = ( + params?: ShippingZonesListUrlQueryParams +) => shippingZonesListPath + "?" + stringifyQs(params); + +export const shippingZonePath = (id: string) => + urlJoin(shippingZonesListPath, id); +export type ShippingZoneUrlDialog = + | "add-rate" + | "assign-country" + | "edit-rate" + | "remove" + | "remove-rate" + | "unassign-country"; +export type ShippingZoneUrlQueryParams = Dialog & + SingleAction & + Partial<{ + type: ShippingMethodTypeEnum; + }>; +export const shippingZoneUrl = ( + id: string, + params?: ShippingZoneUrlQueryParams +) => shippingZonePath(encodeURIComponent(id)) + "?" + stringifyQs(params); + +export const shippingZoneAddPath = urlJoin(shippingZonesListPath, "add"); +export const shippingZoneAddUrl = shippingZoneAddPath; diff --git a/src/shipping/views/ShippingZoneCreate.tsx b/src/shipping/views/ShippingZoneCreate.tsx new file mode 100644 index 000000000..f185d026b --- /dev/null +++ b/src/shipping/views/ShippingZoneCreate.tsx @@ -0,0 +1,59 @@ +import * as React from "react"; + +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import useShop from "@saleor/hooks/useShop"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import ShippingZoneCreatePage from "../components/ShippingZoneCreatePage"; +import { TypedCreateShippingZone } from "../mutations"; +import { CreateShippingZone } from "../types/CreateShippingZone"; +import { shippingZonesListUrl, shippingZoneUrl } from "../urls"; + +const ShippingZoneCreate: React.StatelessComponent<{}> = () => { + const navigate = useNavigator(); + const pushMessage = useNotifier(); + const shop = useShop(); + + const onShippingZoneCreate = (data: CreateShippingZone) => { + if (data.shippingZoneCreate.errors.length === 0) { + pushMessage({ + text: i18n.t("Successfully created new shipping zone", { + context: "notification" + }) + }); + navigate(shippingZoneUrl(data.shippingZoneCreate.shippingZone.id)); + } + }; + return ( + + {(createShippingZone, createShippingZoneOpts) => { + const formTransitionState = getMutationState( + createShippingZoneOpts.called, + createShippingZoneOpts.loading, + maybe(() => createShippingZoneOpts.data.shippingZoneCreate.errors, []) + ); + + return ( + shop.countries, [])} + disabled={createShippingZoneOpts.loading} + errors={maybe( + () => createShippingZoneOpts.data.shippingZoneCreate.errors + )} + onBack={() => navigate(shippingZonesListUrl())} + onSubmit={formData => + createShippingZone({ + variables: { + input: formData + } + }) + } + saveButtonBarState={formTransitionState} + /> + ); + }} + + ); +}; +export default ShippingZoneCreate; diff --git a/src/shipping/views/ShippingZoneDetails/ShippingZoneDetailsDialogs.tsx b/src/shipping/views/ShippingZoneDetails/ShippingZoneDetailsDialogs.tsx new file mode 100644 index 000000000..228ff0063 --- /dev/null +++ b/src/shipping/views/ShippingZoneDetails/ShippingZoneDetailsDialogs.tsx @@ -0,0 +1,240 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useShop from "@saleor/hooks/useShop"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { ShippingMethodTypeEnum } from "../../../types/globalTypes"; +import ShippingZoneCountriesAssignDialog from "../../components/ShippingZoneCountriesAssignDialog"; +import ShippingZoneRateDialog from "../../components/ShippingZoneRateDialog"; +import { ShippingZoneDetailsFragment } from "../../types/ShippingZoneDetailsFragment"; +import { shippingZoneUrl, ShippingZoneUrlQueryParams } from "../../urls"; +import { ShippingZoneOperationsOutput } from "./ShippingZoneOperations"; + +export interface ShippingZoneDetailsDialogsProps { + assignCountryTransitionState: ConfirmButtonTransitionState; + createRateTransitionState: ConfirmButtonTransitionState; + deleteRateTransitionState: ConfirmButtonTransitionState; + deleteZoneTransitionState: ConfirmButtonTransitionState; + id: string; + ops: ShippingZoneOperationsOutput; + params: ShippingZoneUrlQueryParams; + shippingZone: ShippingZoneDetailsFragment; + unassignCountryTransitionState: ConfirmButtonTransitionState; + updateRateTransitionState: ConfirmButtonTransitionState; +} + +const ShippingZoneDetailsDialogs: React.StatelessComponent< + ShippingZoneDetailsDialogsProps +> = ({ + assignCountryTransitionState, + createRateTransitionState, + deleteRateTransitionState, + deleteZoneTransitionState, + id, + ops, + params, + shippingZone, + unassignCountryTransitionState, + updateRateTransitionState +}) => { + const navigate = useNavigator(); + const shop = useShop(); + + const closeModal = () => navigate(shippingZoneUrl(id), true); + + const rate = maybe(() => + shippingZone.shippingMethods.find(rate => rate.id === params.id) + ); + + return ( + <> + shop.defaultCurrency)} + disabled={ops.shippingRateUpdate.opts.loading} + errors={maybe( + () => ops.shippingRateUpdate.opts.data.shippingPriceUpdate.errors, + [] + )} + onClose={closeModal} + onSubmit={formData => + ops.shippingRateUpdate.mutate({ + id: params.id, + input: { + maximumOrderPrice: formData.noLimits + ? null + : parseFloat(formData.maxValue), + minimumOrderPrice: formData.noLimits + ? null + : parseFloat(formData.minValue), + name: formData.name, + price: formData.isFree ? 0 : parseFloat(formData.price), + shippingZone: id, + type: maybe(() => rate.type) + } + }) + } + open={params.action === "edit-rate"} + rate={rate} + variant={maybe(() => rate.type)} + /> + + ops.shippingRateDelete.mutate({ + id: params.id + }) + } + open={params.action === "remove-rate"} + title={i18n.t("Delete Shipping Method")} + variant="delete" + > + {{ name }}?", + { + context: "remove shipping method", + name: maybe(() => rate.name, "...") + } + ) + }} + /> + + shop.defaultCurrency)} + disabled={ops.shippingRateCreate.opts.loading} + errors={maybe( + () => ops.shippingRateCreate.opts.data.shippingPriceCreate.errors, + [] + )} + onClose={closeModal} + onSubmit={formData => + ops.shippingRateCreate.mutate({ + input: { + maximumOrderPrice: + params.type === ShippingMethodTypeEnum.PRICE + ? formData.noLimits + ? null + : parseFloat(formData.maxValue) + : null, + maximumOrderWeight: + params.type === ShippingMethodTypeEnum.WEIGHT + ? formData.noLimits + ? null + : parseFloat(formData.maxValue) + : null, + + minimumOrderPrice: + params.type === ShippingMethodTypeEnum.PRICE + ? formData.noLimits + ? null + : parseFloat(formData.minValue) + : null, + minimumOrderWeight: + params.type === ShippingMethodTypeEnum.WEIGHT + ? formData.noLimits + ? null + : parseFloat(formData.minValue) + : null, + name: formData.name, + price: formData.isFree ? 0 : parseFloat(formData.price), + shippingZone: id, + type: ShippingMethodTypeEnum.PRICE + } + }) + } + open={params.action === "add-rate"} + rate={undefined} + variant={params.type} + /> + + ops.shippingZoneDelete.mutate({ + id + }) + } + open={params.action === "remove"} + title={i18n.t("Delete Shipping Zone")} + variant="delete" + > + {{ name }}?", + { + context: "remove shipping zone", + name: maybe(() => shippingZone.name) + } + ) + }} + /> + + shop.countries, [])} + initial={maybe( + () => shippingZone.countries.map(country => country.code), + [] + )} + isDefault={maybe(() => shippingZone.default, false)} + onClose={closeModal} + onConfirm={formData => + ops.shippingZoneUpdate.mutate({ + id, + input: { + countries: formData.countries, + default: formData.restOfTheWorld + } + }) + } + open={params.action === "assign-country"} + /> + + ops.shippingZoneUpdate.mutate({ + id, + input: { + countries: shippingZone.countries + .filter(country => country.code !== params.id) + .map(country => country.code) + } + }) + } + open={params.action === "unassign-country"} + title={i18n.t("Remove from shipping zone")} + variant="delete" + > + {{ name }} from this shipping zone?", + { + context: "unassign country", + name: maybe( + () => + shippingZone.countries.find( + country => country.code === params.id + ).country + ) + } + ) + }} + /> + + + ); +}; +export default ShippingZoneDetailsDialogs; diff --git a/src/shipping/views/ShippingZoneDetails/ShippingZoneOperations.tsx b/src/shipping/views/ShippingZoneDetails/ShippingZoneOperations.tsx new file mode 100644 index 000000000..59d3909ad --- /dev/null +++ b/src/shipping/views/ShippingZoneDetails/ShippingZoneOperations.tsx @@ -0,0 +1,113 @@ +import * as React from "react"; + +import { getMutationProviderData } from "../../../misc"; +import { PartialMutationProviderOutput } from "../../../types"; +import { + TypedCreateShippingRate, + TypedDeleteShippingRate, + TypedDeleteShippingZone, + TypedUpdateShippingRate, + TypedUpdateShippingZone +} from "../../mutations"; +import { + CreateShippingRate, + CreateShippingRateVariables +} from "../../types/CreateShippingRate"; +import { + DeleteShippingRate, + DeleteShippingRateVariables +} from "../../types/DeleteShippingRate"; +import { + DeleteShippingZone, + DeleteShippingZoneVariables +} from "../../types/DeleteShippingZone"; +import { + UpdateShippingRate, + UpdateShippingRateVariables +} from "../../types/UpdateShippingRate"; +import { + UpdateShippingZone, + UpdateShippingZoneVariables +} from "../../types/UpdateShippingZone"; + +export interface ShippingZoneOperationsOutput { + shippingRateCreate: PartialMutationProviderOutput< + CreateShippingRate, + CreateShippingRateVariables + >; + shippingRateDelete: PartialMutationProviderOutput< + DeleteShippingRate, + DeleteShippingRateVariables + >; + shippingRateUpdate: PartialMutationProviderOutput< + UpdateShippingRate, + UpdateShippingRateVariables + >; + shippingZoneDelete: PartialMutationProviderOutput< + DeleteShippingZone, + DeleteShippingZoneVariables + >; + shippingZoneUpdate: PartialMutationProviderOutput< + UpdateShippingZone, + UpdateShippingZoneVariables + >; +} +interface ShippingZoneOperationsProps { + children: (props: ShippingZoneOperationsOutput) => React.ReactNode; + onShippingRateCreate: (data: CreateShippingRate) => void; + onShippingRateDelete: (data: DeleteShippingRate) => void; + onShippingRateUpdate: (data: UpdateShippingRate) => void; + onShippingZoneDelete: (data: DeleteShippingZone) => void; + onShippingZoneUpdate: (data: UpdateShippingZone) => void; +} + +const ShippingZoneOperations: React.StatelessComponent< + ShippingZoneOperationsProps +> = ({ + children, + onShippingRateCreate, + onShippingRateDelete, + onShippingRateUpdate, + onShippingZoneDelete, + onShippingZoneUpdate +}) => ( + + {(...shippingRateCreate) => ( + + {(...shippingRateDelete) => ( + + {(...shippingRateUpdate) => ( + + {(...shippingZoneDelete) => ( + + {(...shippingZoneUpdate) => + children({ + shippingRateCreate: getMutationProviderData( + ...shippingRateCreate + ), + shippingRateDelete: getMutationProviderData( + ...shippingRateDelete + ), + shippingRateUpdate: getMutationProviderData( + ...shippingRateUpdate + ), + shippingZoneDelete: getMutationProviderData( + ...shippingZoneDelete + ), + shippingZoneUpdate: getMutationProviderData( + ...shippingZoneUpdate + ) + }) + } + + )} + + )} + + )} + + )} + +); +ShippingZoneOperations.displayName = "ShippingZoneOperations"; +export default ShippingZoneOperations; diff --git a/src/shipping/views/ShippingZoneDetails/index.tsx b/src/shipping/views/ShippingZoneDetails/index.tsx new file mode 100644 index 000000000..e898c0113 --- /dev/null +++ b/src/shipping/views/ShippingZoneDetails/index.tsx @@ -0,0 +1,239 @@ +import * as React from "react"; + +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import i18n from "../../../i18n"; +import { getMutationState, maybe } from "../../../misc"; +import { ShippingMethodTypeEnum } from "../../../types/globalTypes"; +import ShippingZoneDetailsPage from "../../components/ShippingZoneDetailsPage"; +import { TypedShippingZone } from "../../queries"; +import { CreateShippingRate } from "../../types/CreateShippingRate"; +import { DeleteShippingRate } from "../../types/DeleteShippingRate"; +import { DeleteShippingZone } from "../../types/DeleteShippingZone"; +import { UpdateShippingRate } from "../../types/UpdateShippingRate"; +import { UpdateShippingZone } from "../../types/UpdateShippingZone"; +import { + shippingZonesListUrl, + shippingZoneUrl, + ShippingZoneUrlQueryParams +} from "../../urls"; +import ShippingZoneDetailsDialogs from "./ShippingZoneDetailsDialogs"; +import ShippingZoneOperations from "./ShippingZoneOperations"; + +export interface ShippingZoneDetailsProps { + id: string; + params: ShippingZoneUrlQueryParams; +} + +const ShippingZoneDetails: React.StatelessComponent< + ShippingZoneDetailsProps +> = ({ id, params }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const closeModal = () => navigate(shippingZoneUrl(id)); + + const onShippingRateCreate = (data: CreateShippingRate) => { + if (data.shippingPriceCreate.errors.length === 0) { + notify({ + text: i18n.t("Successfully created rate", { + context: "shipping method" + }) + }); + closeModal(); + } + }; + + const onShippingRateUpdate = (data: UpdateShippingRate) => { + if (data.shippingPriceUpdate.errors.length === 0) { + notify({ + text: i18n.t("Successfully updated rate", { + context: "shipping method" + }) + }); + closeModal(); + } + }; + + const onShippingRateDelete = (data: DeleteShippingRate) => { + if (data.shippingPriceDelete.errors.length === 0) { + notify({ + text: i18n.t("Successfully deleted rate", { + context: "shipping method" + }) + }); + closeModal(); + } + }; + + const onShippingZoneDelete = (data: DeleteShippingZone) => { + if (data.shippingZoneDelete.errors.length === 0) { + notify({ + text: i18n.t("Successfully deleted shipping zone") + }); + navigate(shippingZonesListUrl(), true); + } + }; + + const onShippingZoneUpdate = (data: UpdateShippingZone) => { + if (data.shippingZoneUpdate.errors.length === 0) { + notify({ + text: i18n.t("Successfully updated shipping zone") + }); + closeModal(); + } + }; + + return ( + + {ops => ( + + {({ data, loading }) => { + const formTransitionState = getMutationState( + ops.shippingZoneUpdate.opts.called, + ops.shippingZoneUpdate.opts.loading, + maybe( + () => ops.shippingZoneUpdate.opts.data.shippingZoneUpdate.errors + ) + ); + const createRateTransitionState = getMutationState( + ops.shippingRateCreate.opts.called, + ops.shippingRateCreate.opts.loading, + maybe( + () => + ops.shippingRateCreate.opts.data.shippingPriceCreate.errors + ) + ); + const deleteRateTransitionState = getMutationState( + ops.shippingRateDelete.opts.called, + ops.shippingRateDelete.opts.loading, + maybe( + () => + ops.shippingRateDelete.opts.data.shippingPriceDelete.errors + ) + ); + const updateRateTransitionState = getMutationState( + ops.shippingRateUpdate.opts.called, + ops.shippingRateUpdate.opts.loading, + maybe( + () => + ops.shippingRateUpdate.opts.data.shippingPriceUpdate.errors + ) + ); + const deleteZoneTransitionState = getMutationState( + ops.shippingZoneDelete.opts.called, + ops.shippingZoneDelete.opts.loading, + maybe( + () => ops.shippingZoneDelete.opts.data.shippingZoneDelete.errors + ) + ); + + return ( + <> + + ops.shippingZoneUpdate.opts.data.shippingZoneUpdate.errors + )} + onBack={() => navigate(shippingZonesListUrl())} + onCountryAdd={() => + navigate( + shippingZoneUrl(id, { + action: "assign-country" + }) + ) + } + onCountryRemove={code => + navigate( + shippingZoneUrl(id, { + action: "unassign-country", + id: code + }) + ) + } + onDelete={() => + navigate( + shippingZoneUrl(id, { + action: "remove" + }) + ) + } + onPriceRateAdd={() => + navigate( + shippingZoneUrl(id, { + action: "add-rate", + type: ShippingMethodTypeEnum.PRICE + }) + ) + } + onPriceRateEdit={rateId => + navigate( + shippingZoneUrl(id, { + action: "edit-rate", + id: rateId + }) + ) + } + onRateRemove={rateId => + navigate( + shippingZoneUrl(id, { + action: "remove-rate", + id: rateId + }) + ) + } + onSubmit={formData => + ops.shippingZoneUpdate.mutate({ + id, + input: { + name: formData.name + } + }) + } + onWeightRateAdd={() => + navigate( + shippingZoneUrl(id, { + action: "add-rate", + type: ShippingMethodTypeEnum.WEIGHT + }) + ) + } + onWeightRateEdit={rateId => + navigate( + shippingZoneUrl(id, { + action: "edit-rate", + id: rateId + }) + ) + } + saveButtonBarState={formTransitionState} + shippingZone={maybe(() => data.shippingZone)} + /> + + + ); + }} + + )} + + ); +}; +export default ShippingZoneDetails; diff --git a/src/shipping/views/ShippingZonesList.tsx b/src/shipping/views/ShippingZonesList.tsx new file mode 100644 index 000000000..1debefce2 --- /dev/null +++ b/src/shipping/views/ShippingZonesList.tsx @@ -0,0 +1,272 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import IconButton from "@material-ui/core/IconButton"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import useBulkActions from "@saleor/hooks/useBulkActions"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import useShop from "@saleor/hooks/useShop"; +import { PAGINATE_BY } from "../../config"; +import { configurationMenuUrl } from "../../configuration"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import ShippingZonesListPage from "../components/ShippingZonesListPage"; +import { + TypedBulkDeleteShippingZone, + TypedDeleteShippingZone, + TypedUpdateDefaultWeightUnit +} from "../mutations"; +import { TypedShippingZones } from "../queries"; +import { BulkDeleteShippingZone } from "../types/BulkDeleteShippingZone"; +import { DeleteShippingZone } from "../types/DeleteShippingZone"; +import { UpdateDefaultWeightUnit } from "../types/UpdateDefaultWeightUnit"; +import { + shippingZoneAddUrl, + shippingZonesListUrl, + ShippingZonesListUrlQueryParams, + shippingZoneUrl +} from "../urls"; + +interface ShippingZonesListProps { + params: ShippingZonesListUrlQueryParams; +} + +export const ShippingZonesList: React.StatelessComponent< + ShippingZonesListProps +> = ({ params }) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + const shop = useShop(); + const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( + params.ids + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + + return ( + + {({ data, loading, refetch }) => { + const handleUpdateDefaultWeightUnit = ( + data: UpdateDefaultWeightUnit + ) => { + if (data.shopSettingsUpdate.errors.length === 0) { + notify({ + text: i18n.t("Updated default weight unit", { + context: "notification" + }) + }); + } + }; + + const closeModal = () => + navigate( + shippingZonesListUrl({ + ...params, + action: undefined, + ids: undefined + }), + true + ); + + const handleShippingZoneDelete = (data: DeleteShippingZone) => { + if (data.shippingZoneDelete.errors.length === 0) { + notify({ + text: i18n.t("Updated default weight unit", { + context: "notification" + }) + }); + closeModal(); + refetch(); + } + }; + + const handleBulkDeleteShippingZone = (data: BulkDeleteShippingZone) => { + if (data.shippingZoneBulkDelete.errors.length === 0) { + notify({ + text: i18n.t("Removed shipping zones", { + context: "notification" + }) + }); + closeModal(); + reset(); + refetch(); + } + }; + return ( + + {(deleteShippingZone, deleteShippingZoneOpts) => ( + + {(updateDefaultWeightUnit, updateDefaultWeightUnitOpts) => ( + + {(bulkDeleteShippingZone, bulkDeleteShippingZoneOpts) => { + const deleteTransitionState = getMutationState( + deleteShippingZoneOpts.called, + deleteShippingZoneOpts.loading, + maybe( + () => + deleteShippingZoneOpts.data.shippingZoneDelete + .errors + ) + ); + + const bulkDeleteTransitionState = getMutationState( + bulkDeleteShippingZoneOpts.called, + bulkDeleteShippingZoneOpts.loading, + maybe( + () => + bulkDeleteShippingZoneOpts.data + .shippingZoneBulkDelete.errors + ) + ); + + const { + loadNextPage, + loadPreviousPage, + pageInfo + } = paginate( + maybe(() => data.shippingZones.pageInfo), + paginationState, + params + ); + + return ( + <> + shop.defaultWeightUnit + )} + disabled={ + loading || + deleteShippingZoneOpts.loading || + updateDefaultWeightUnitOpts.loading + } + shippingZones={maybe(() => + data.shippingZones.edges.map(edge => edge.node) + )} + pageInfo={pageInfo} + onAdd={() => navigate(shippingZoneAddUrl)} + onBack={() => navigate(configurationMenuUrl)} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRemove={id => + navigate( + shippingZonesListUrl({ + ...params, + action: "remove", + id + }) + ) + } + onRowClick={id => () => + navigate(shippingZoneUrl(id))} + onSubmit={unit => + updateDefaultWeightUnit({ + variables: { unit } + }) + } + isChecked={isSelected} + selected={listElements.length} + toggle={toggle} + toggleAll={toggleAll} + toolbar={ + + navigate( + shippingZonesListUrl({ + action: "remove-many", + ids: listElements + }) + ) + } + > + + + } + /> + + + deleteShippingZone({ + variables: { id: params.id } + }) + } + > + {{ name }} shipping zone?", + { + context: "shipping zone removal", + name: maybe( + () => + data.shippingZones.edges.find( + edge => edge.node.id === params.id + ).node.name, + "..." + ) + } + ) + }} + /> + + + bulkDeleteShippingZone({ + variables: { ids: params.ids } + }) + } + > + {{ number }} shipping zones?", + { + number: maybe( + () => params.ids.length.toString(), + "..." + ) + } + ) + }} + /> + + + ); + }} + + )} + + )} + + ); + }} + + ); +}; +ShippingZonesList.displayName = "ShippingZonesList"; +export default ShippingZonesList; diff --git a/src/siteSettings/components/SiteSettingsDetails/SiteSettingsDetails.tsx b/src/siteSettings/components/SiteSettingsDetails/SiteSettingsDetails.tsx new file mode 100644 index 000000000..136f9c1be --- /dev/null +++ b/src/siteSettings/components/SiteSettingsDetails/SiteSettingsDetails.tsx @@ -0,0 +1,81 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import FormSpacer from "@saleor/components/FormSpacer"; +import i18n from "../../../i18n"; +import { SiteSettingsPageFormData } from "../SiteSettingsPage"; + +interface SiteSettingsDetailsProps { + data: SiteSettingsPageFormData; + errors: Partial<{ + description: string; + domain: string; + name: string; + }>; + disabled: boolean; + onChange: (event: React.ChangeEvent) => void; +} + +const SiteSettingsDetails: React.StatelessComponent< + SiteSettingsDetailsProps +> = ({ data, disabled, errors, onChange }) => ( + + + + + + + + + + +); +SiteSettingsDetails.displayName = "SiteSettingsDetails"; +export default SiteSettingsDetails; diff --git a/src/siteSettings/components/SiteSettingsDetails/index.ts b/src/siteSettings/components/SiteSettingsDetails/index.ts new file mode 100644 index 000000000..ae552a229 --- /dev/null +++ b/src/siteSettings/components/SiteSettingsDetails/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SiteSettingsDetails"; +export * from "./SiteSettingsDetails"; diff --git a/src/siteSettings/components/SiteSettingsKeyDialog/SiteSettingsKeyDialog.tsx b/src/siteSettings/components/SiteSettingsKeyDialog/SiteSettingsKeyDialog.tsx new file mode 100644 index 000000000..37c0bdab0 --- /dev/null +++ b/src/siteSettings/components/SiteSettingsKeyDialog/SiteSettingsKeyDialog.tsx @@ -0,0 +1,102 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import TextField from "@material-ui/core/TextField"; +import * as React from "react"; + +import Form, { FormProps } from "@saleor/components/Form"; +import { FormSpacer } from "@saleor/components/FormSpacer"; +import SingleSelectField from "@saleor/components/SingleSelectField"; +import i18n from "../../../i18n"; +import { translatedAuthorizationKeyTypes } from "../../../misc"; +import { AuthorizationKeyType } from "../../../types/globalTypes"; + +export interface SiteSettingsKeyDialogForm { + key: string; + password: string; + type: AuthorizationKeyType; +} + +export interface SiteSettingsKeyDialogProps + extends Pick< + FormProps, + Exclude, "children"> + > { + open: boolean; + onClose: () => void; +} + +const SiteSettingsKeyDialog: React.StatelessComponent< + SiteSettingsKeyDialogProps +> = ({ errors, initial, open, onClose, onSubmit }) => { + const keyTypes = translatedAuthorizationKeyTypes(); + return ( + +
    + {({ change, data, errors }) => ( + <> + + {i18n.t("Add New Authorization Key", { + context: "modal title" + })} + + + ({ + label: keyTypes[key], + value: key + }))} + error={!!errors.keyType} + label={i18n.t("Authentication type", { + context: "input label" + })} + hint={errors.keyType} + name="type" + onChange={change} + value={data.type} + /> + + + + + + + + + + + )} +
    +
    + ); +}; +SiteSettingsKeyDialog.displayName = "SiteSettingsKeyDialog"; +export default SiteSettingsKeyDialog; diff --git a/src/siteSettings/components/SiteSettingsKeyDialog/index.ts b/src/siteSettings/components/SiteSettingsKeyDialog/index.ts new file mode 100644 index 000000000..3e571551b --- /dev/null +++ b/src/siteSettings/components/SiteSettingsKeyDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SiteSettingsKeyDialog"; +export * from "./SiteSettingsKeyDialog"; diff --git a/src/siteSettings/components/SiteSettingsKeys/SiteSettingsKeys.tsx b/src/siteSettings/components/SiteSettingsKeys/SiteSettingsKeys.tsx new file mode 100644 index 000000000..8dcbd39c0 --- /dev/null +++ b/src/siteSettings/components/SiteSettingsKeys/SiteSettingsKeys.tsx @@ -0,0 +1,118 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import IconButton from "@material-ui/core/IconButton"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import DeleteIcon from "@material-ui/icons/Delete"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { + maybe, + renderCollection, + translatedAuthorizationKeyTypes +} from "../../../misc"; +import { ICONBUTTON_SIZE } from "../../../theme"; +import { AuthorizationKeyType } from "../../../types/globalTypes"; +import { SiteSettings_shop_authorizationKeys } from "../../types/SiteSettings"; + +const styles = (theme: Theme) => + createStyles({ + iconCell: { + "&:last-child": { + paddingRight: 0 + }, + width: ICONBUTTON_SIZE + theme.spacing.unit / 2 + } + }); + +interface SiteSettingsKeysProps extends WithStyles { + disabled: boolean; + keys: SiteSettings_shop_authorizationKeys[]; + onAdd: () => void; + onRemove: (name: AuthorizationKeyType) => void; +} + +const SiteSettingsKeys = withStyles(styles, { name: "SiteSettingsKeys" })( + ({ classes, disabled, keys, onAdd, onRemove }: SiteSettingsKeysProps) => { + const keyTypes = translatedAuthorizationKeyTypes(); + return ( + + + {i18n.t("Add key", { + context: "button" + })} + + } + /> + + + + + {i18n.t("Authentication Type", { context: "table header" })} + + + {i18n.t("Key", { context: "table header" })} + + + + + + {renderCollection( + keys, + key => ( + key.name)} + > + + {maybe( + () => keyTypes[key.name], + + )} + + + {maybe(() => key.key, )} + + + onRemove(key.name)}> + + + + + ), + () => ( + + {i18n.t("No keys")} + + ) + )} + +
    +
    + ); + } +); +SiteSettingsKeys.displayName = "SiteSettingsKeys"; +export default SiteSettingsKeys; diff --git a/src/siteSettings/components/SiteSettingsKeys/index.ts b/src/siteSettings/components/SiteSettingsKeys/index.ts new file mode 100644 index 000000000..cb3400edf --- /dev/null +++ b/src/siteSettings/components/SiteSettingsKeys/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SiteSettingsKeys"; +export * from "./SiteSettingsKeys"; diff --git a/src/siteSettings/components/SiteSettingsPage/SiteSettingsPage.tsx b/src/siteSettings/components/SiteSettingsPage/SiteSettingsPage.tsx new file mode 100644 index 000000000..9bc9a9694 --- /dev/null +++ b/src/siteSettings/components/SiteSettingsPage/SiteSettingsPage.tsx @@ -0,0 +1,98 @@ +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { maybe } from "../../../misc"; +import { AuthorizationKeyType } from "../../../types/globalTypes"; +import { SiteSettings_shop } from "../../types/SiteSettings"; +import SiteSettingsDetails from "../SiteSettingsDetails/SiteSettingsDetails"; +import SiteSettingsKeys from "../SiteSettingsKeys/SiteSettingsKeys"; + +export interface SiteSettingsPageFormData { + description: string; + domain: string; + name: string; +} + +export interface SiteSettingsPageProps { + disabled: boolean; + errors: Array<{ + field: string; + message: string; + }>; + shop: SiteSettings_shop; + saveButtonBarState: ConfirmButtonTransitionState; + onBack: () => void; + onKeyAdd: () => void; + onKeyRemove: (keyType: AuthorizationKeyType) => void; + onSubmit: (data: SiteSettingsPageFormData) => void; +} + +const SiteSettingsPage: React.StatelessComponent = ({ + disabled, + errors, + saveButtonBarState, + shop, + onBack, + onKeyAdd, + onKeyRemove, + onSubmit +}) => { + const initialForm: SiteSettingsPageFormData = { + description: maybe(() => shop.description, ""), + domain: maybe(() => shop.domain.host, ""), + name: maybe(() => shop.name, "") + }; + return ( +
    + {({ change, data, errors: formErrors, hasChanged, submit }) => ( + + {i18n.t("Configuration")} + + + {i18n.t("Site Settings")} + + + {i18n.t("Authentication keys")} + + shop.authorizationKeys)} + onAdd={onKeyAdd} + onRemove={onKeyRemove} + /> + + + + )} +
    + ); +}; +SiteSettingsPage.displayName = "SiteSettingsPage"; +export default SiteSettingsPage; diff --git a/src/siteSettings/components/SiteSettingsPage/index.ts b/src/siteSettings/components/SiteSettingsPage/index.ts new file mode 100644 index 000000000..d10967cb4 --- /dev/null +++ b/src/siteSettings/components/SiteSettingsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./SiteSettingsPage"; +export * from "./SiteSettingsPage"; diff --git a/src/siteSettings/fixtures.ts b/src/siteSettings/fixtures.ts new file mode 100644 index 000000000..b41da4c79 --- /dev/null +++ b/src/siteSettings/fixtures.ts @@ -0,0 +1,19 @@ +import { AuthorizationKeyType } from "../types/globalTypes"; +import { SiteSettings_shop } from "./types/SiteSettings"; + +export const shop: SiteSettings_shop = { + __typename: "Shop", + authorizationKeys: [ + { + __typename: "AuthorizationKey", + key: "n1n62jkn2123:123n", + name: AuthorizationKeyType.FACEBOOK + } + ], + description: "Lorem ipsum dolor sit amet", + domain: { + __typename: "Domain", + host: "localhost:8000" + }, + name: "Saleor e-commerce" +}; diff --git a/src/siteSettings/index.tsx b/src/siteSettings/index.tsx new file mode 100644 index 000000000..14598e14c --- /dev/null +++ b/src/siteSettings/index.tsx @@ -0,0 +1,18 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps } from "react-router-dom"; + +import { siteSettingsPath, SiteSettingsUrlQueryParams } from "./urls"; +import SiteSettingsComponent from "./views/"; + +const SiteSettings: React.FC> = ({ location }) => { + const qs = parseQs(location.search.substr(1)); + const params: SiteSettingsUrlQueryParams = qs; + + return ; +}; + +export const SiteSettingsSection: React.FC = () => { + return ; +}; +export default SiteSettingsSection; diff --git a/src/siteSettings/mutations.ts b/src/siteSettings/mutations.ts new file mode 100644 index 000000000..31b531d85 --- /dev/null +++ b/src/siteSettings/mutations.ts @@ -0,0 +1,91 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { shopFragment } from "./queries"; +import { + AuthorizationKeyAdd, + AuthorizationKeyAddVariables +} from "./types/AuthorizationKeyAdd"; +import { + AuthorizationKeyDelete, + AuthorizationKeyDeleteVariables +} from "./types/AuthorizationKeyDelete"; +import { + ShopSettingsUpdate, + ShopSettingsUpdateVariables +} from "./types/ShopSettingsUpdate"; + +const authorizationKeyAdd = gql` + ${shopFragment} + mutation AuthorizationKeyAdd( + $input: AuthorizationKeyInput! + $keyType: AuthorizationKeyType! + ) { + authorizationKeyAdd(input: $input, keyType: $keyType) { + errors { + field + message + } + shop { + ...ShopFragment + } + } + } +`; +export const TypedAuthorizationKeyAdd = TypedMutation< + AuthorizationKeyAdd, + AuthorizationKeyAddVariables +>(authorizationKeyAdd); + +const authorizationKeyDelete = gql` + ${shopFragment} + mutation AuthorizationKeyDelete($keyType: AuthorizationKeyType!) { + authorizationKeyDelete(keyType: $keyType) { + errors { + field + message + } + shop { + ...ShopFragment + } + } + } +`; +export const TypedAuthorizationKeyDelete = TypedMutation< + AuthorizationKeyDelete, + AuthorizationKeyDeleteVariables +>(authorizationKeyDelete); + +const shopSettingsUpdate = gql` + ${shopFragment} + mutation ShopSettingsUpdate( + $shopDomainInput: SiteDomainInput! + $shopSettingsInput: ShopSettingsInput! + ) { + shopSettingsUpdate(input: $shopSettingsInput) { + errors { + field + message + } + shop { + ...ShopFragment + } + } + shopDomainUpdate(input: $shopDomainInput) { + errors { + field + message + } + shop { + domain { + host + url + } + } + } + } +`; +export const TypedShopSettingsUpdate = TypedMutation< + ShopSettingsUpdate, + ShopSettingsUpdateVariables +>(shopSettingsUpdate); diff --git a/src/siteSettings/queries.ts b/src/siteSettings/queries.ts new file mode 100644 index 000000000..07128b873 --- /dev/null +++ b/src/siteSettings/queries.ts @@ -0,0 +1,28 @@ +import gql from "graphql-tag"; +import { TypedQuery } from "../queries"; +import { SiteSettings } from "./types/SiteSettings"; + +export const shopFragment = gql` + fragment ShopFragment on Shop { + authorizationKeys { + key + name + } + description + domain { + host + } + name + } +`; +const siteSettings = gql` + ${shopFragment} + query SiteSettings { + shop { + ...ShopFragment + } + } +`; +export const TypedSiteSettingsQuery = TypedQuery( + siteSettings +); diff --git a/src/siteSettings/types/AuthorizationKeyAdd.ts b/src/siteSettings/types/AuthorizationKeyAdd.ts new file mode 100644 index 000000000..c6524fdbf --- /dev/null +++ b/src/siteSettings/types/AuthorizationKeyAdd.ts @@ -0,0 +1,49 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AuthorizationKeyInput, AuthorizationKeyType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: AuthorizationKeyAdd +// ==================================================== + +export interface AuthorizationKeyAdd_authorizationKeyAdd_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface AuthorizationKeyAdd_authorizationKeyAdd_shop_authorizationKeys { + __typename: "AuthorizationKey"; + key: string; + name: AuthorizationKeyType; +} + +export interface AuthorizationKeyAdd_authorizationKeyAdd_shop_domain { + __typename: "Domain"; + host: string; +} + +export interface AuthorizationKeyAdd_authorizationKeyAdd_shop { + __typename: "Shop"; + authorizationKeys: (AuthorizationKeyAdd_authorizationKeyAdd_shop_authorizationKeys | null)[]; + description: string | null; + domain: AuthorizationKeyAdd_authorizationKeyAdd_shop_domain; + name: string; +} + +export interface AuthorizationKeyAdd_authorizationKeyAdd { + __typename: "AuthorizationKeyAdd"; + errors: AuthorizationKeyAdd_authorizationKeyAdd_errors[] | null; + shop: AuthorizationKeyAdd_authorizationKeyAdd_shop | null; +} + +export interface AuthorizationKeyAdd { + authorizationKeyAdd: AuthorizationKeyAdd_authorizationKeyAdd | null; +} + +export interface AuthorizationKeyAddVariables { + input: AuthorizationKeyInput; + keyType: AuthorizationKeyType; +} diff --git a/src/siteSettings/types/AuthorizationKeyDelete.ts b/src/siteSettings/types/AuthorizationKeyDelete.ts new file mode 100644 index 000000000..a79185000 --- /dev/null +++ b/src/siteSettings/types/AuthorizationKeyDelete.ts @@ -0,0 +1,48 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AuthorizationKeyType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: AuthorizationKeyDelete +// ==================================================== + +export interface AuthorizationKeyDelete_authorizationKeyDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface AuthorizationKeyDelete_authorizationKeyDelete_shop_authorizationKeys { + __typename: "AuthorizationKey"; + key: string; + name: AuthorizationKeyType; +} + +export interface AuthorizationKeyDelete_authorizationKeyDelete_shop_domain { + __typename: "Domain"; + host: string; +} + +export interface AuthorizationKeyDelete_authorizationKeyDelete_shop { + __typename: "Shop"; + authorizationKeys: (AuthorizationKeyDelete_authorizationKeyDelete_shop_authorizationKeys | null)[]; + description: string | null; + domain: AuthorizationKeyDelete_authorizationKeyDelete_shop_domain; + name: string; +} + +export interface AuthorizationKeyDelete_authorizationKeyDelete { + __typename: "AuthorizationKeyDelete"; + errors: AuthorizationKeyDelete_authorizationKeyDelete_errors[] | null; + shop: AuthorizationKeyDelete_authorizationKeyDelete_shop | null; +} + +export interface AuthorizationKeyDelete { + authorizationKeyDelete: AuthorizationKeyDelete_authorizationKeyDelete | null; +} + +export interface AuthorizationKeyDeleteVariables { + keyType: AuthorizationKeyType; +} diff --git a/src/siteSettings/types/ShopFragment.ts b/src/siteSettings/types/ShopFragment.ts new file mode 100644 index 000000000..dcea4c527 --- /dev/null +++ b/src/siteSettings/types/ShopFragment.ts @@ -0,0 +1,28 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AuthorizationKeyType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: ShopFragment +// ==================================================== + +export interface ShopFragment_authorizationKeys { + __typename: "AuthorizationKey"; + key: string; + name: AuthorizationKeyType; +} + +export interface ShopFragment_domain { + __typename: "Domain"; + host: string; +} + +export interface ShopFragment { + __typename: "Shop"; + authorizationKeys: (ShopFragment_authorizationKeys | null)[]; + description: string | null; + domain: ShopFragment_domain; + name: string; +} diff --git a/src/siteSettings/types/ShopSettingsUpdate.ts b/src/siteSettings/types/ShopSettingsUpdate.ts new file mode 100644 index 000000000..e78f9c121 --- /dev/null +++ b/src/siteSettings/types/ShopSettingsUpdate.ts @@ -0,0 +1,73 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { SiteDomainInput, ShopSettingsInput, AuthorizationKeyType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: ShopSettingsUpdate +// ==================================================== + +export interface ShopSettingsUpdate_shopSettingsUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ShopSettingsUpdate_shopSettingsUpdate_shop_authorizationKeys { + __typename: "AuthorizationKey"; + key: string; + name: AuthorizationKeyType; +} + +export interface ShopSettingsUpdate_shopSettingsUpdate_shop_domain { + __typename: "Domain"; + host: string; +} + +export interface ShopSettingsUpdate_shopSettingsUpdate_shop { + __typename: "Shop"; + authorizationKeys: (ShopSettingsUpdate_shopSettingsUpdate_shop_authorizationKeys | null)[]; + description: string | null; + domain: ShopSettingsUpdate_shopSettingsUpdate_shop_domain; + name: string; +} + +export interface ShopSettingsUpdate_shopSettingsUpdate { + __typename: "ShopSettingsUpdate"; + errors: ShopSettingsUpdate_shopSettingsUpdate_errors[] | null; + shop: ShopSettingsUpdate_shopSettingsUpdate_shop | null; +} + +export interface ShopSettingsUpdate_shopDomainUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface ShopSettingsUpdate_shopDomainUpdate_shop_domain { + __typename: "Domain"; + host: string; + url: string; +} + +export interface ShopSettingsUpdate_shopDomainUpdate_shop { + __typename: "Shop"; + domain: ShopSettingsUpdate_shopDomainUpdate_shop_domain; +} + +export interface ShopSettingsUpdate_shopDomainUpdate { + __typename: "ShopDomainUpdate"; + errors: ShopSettingsUpdate_shopDomainUpdate_errors[] | null; + shop: ShopSettingsUpdate_shopDomainUpdate_shop | null; +} + +export interface ShopSettingsUpdate { + shopSettingsUpdate: ShopSettingsUpdate_shopSettingsUpdate | null; + shopDomainUpdate: ShopSettingsUpdate_shopDomainUpdate | null; +} + +export interface ShopSettingsUpdateVariables { + shopDomainInput: SiteDomainInput; + shopSettingsInput: ShopSettingsInput; +} diff --git a/src/siteSettings/types/SiteSettings.ts b/src/siteSettings/types/SiteSettings.ts new file mode 100644 index 000000000..873124078 --- /dev/null +++ b/src/siteSettings/types/SiteSettings.ts @@ -0,0 +1,32 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { AuthorizationKeyType } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: SiteSettings +// ==================================================== + +export interface SiteSettings_shop_authorizationKeys { + __typename: "AuthorizationKey"; + key: string; + name: AuthorizationKeyType; +} + +export interface SiteSettings_shop_domain { + __typename: "Domain"; + host: string; +} + +export interface SiteSettings_shop { + __typename: "Shop"; + authorizationKeys: (SiteSettings_shop_authorizationKeys | null)[]; + description: string | null; + domain: SiteSettings_shop_domain; + name: string; +} + +export interface SiteSettings { + shop: SiteSettings_shop | null; +} diff --git a/src/siteSettings/urls.ts b/src/siteSettings/urls.ts new file mode 100644 index 000000000..201d086a7 --- /dev/null +++ b/src/siteSettings/urls.ts @@ -0,0 +1,11 @@ +import { stringify as stringifyQs } from "qs"; + +import { Dialog } from "../types"; + +const siteSettingsSection = "/site-settings"; + +export const siteSettingsPath = siteSettingsSection; +export type SiteSettingsUrlDialog = "add-key"; +export type SiteSettingsUrlQueryParams = Dialog; +export const siteSettingsUrl = (params?: SiteSettingsUrlQueryParams) => + siteSettingsPath + "?" + stringifyQs(params); diff --git a/src/siteSettings/views/index.tsx b/src/siteSettings/views/index.tsx new file mode 100644 index 000000000..b0db5c7ea --- /dev/null +++ b/src/siteSettings/views/index.tsx @@ -0,0 +1,201 @@ +import * as React from "react"; + +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import { configurationMenuUrl } from "../../configuration"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import { AuthorizationKeyType } from "../../types/globalTypes"; +import SiteSettingsKeyDialog, { + SiteSettingsKeyDialogForm +} from "../components/SiteSettingsKeyDialog"; +import SiteSettingsPage, { + SiteSettingsPageFormData +} from "../components/SiteSettingsPage"; +import { + TypedAuthorizationKeyAdd, + TypedAuthorizationKeyDelete, + TypedShopSettingsUpdate +} from "../mutations"; +import { TypedSiteSettingsQuery } from "../queries"; +import { AuthorizationKeyAdd } from "../types/AuthorizationKeyAdd"; +import { AuthorizationKeyDelete } from "../types/AuthorizationKeyDelete"; +import { ShopSettingsUpdate } from "../types/ShopSettingsUpdate"; +import { siteSettingsUrl, SiteSettingsUrlQueryParams } from "../urls"; + +export interface SiteSettingsProps { + params: SiteSettingsUrlQueryParams; +} + +export const SiteSettings: React.StatelessComponent = ({ + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + + const handleAddKeySuccess = (data: AuthorizationKeyAdd) => { + if (!maybe(() => data.authorizationKeyAdd.errors.length)) { + notify({ + text: i18n.t("Authorization key added", { + context: "notification" + }) + }); + navigate(siteSettingsUrl()); + } + }; + const handleDeleteKeySuccess = (data: AuthorizationKeyDelete) => { + if (!maybe(() => data.authorizationKeyDelete.errors.length)) { + notify({ + text: i18n.t("Authorization key deleted", { + context: "notification" + }) + }); + } else { + notify({ + text: i18n.t("Could not delete authorization key: {{ message }}", { + context: "notification", + message: data.authorizationKeyDelete.errors[0].message + }) + }); + } + }; + const handleSiteSettingsSuccess = (data: ShopSettingsUpdate) => { + if ( + (!data.shopDomainUpdate.errors || + data.shopDomainUpdate.errors.length === 0) && + (!data.shopSettingsUpdate.errors || + data.shopSettingsUpdate.errors.length === 0) + ) { + notify({ + text: i18n.t("Site settings updated", { + context: "notification" + }) + }); + } + }; + return ( + + {siteSettings => ( + + {(addAuthorizationKey, addAuthorizationKeyOpts) => ( + + {(deleteAuthorizationKey, _) => ( + + {(updateShopSettings, updateShopSettingsOpts) => { + const errors = [ + ...maybe( + () => + updateShopSettingsOpts.data.shopDomainUpdate.errors, + [] + ), + ...maybe( + () => + updateShopSettingsOpts.data.shopSettingsUpdate.errors, + [] + ) + ]; + const loading = + siteSettings.loading || + addAuthorizationKeyOpts.loading || + updateShopSettingsOpts.loading; + + const handleAuthenticationKeyAdd = ( + data: SiteSettingsKeyDialogForm + ) => + addAuthorizationKey({ + variables: { + input: { + key: data.key, + password: data.password + }, + keyType: data.type + } + }); + const handleUpdateShopSettings = ( + data: SiteSettingsPageFormData + ) => + updateShopSettings({ + variables: { + shopDomainInput: { + domain: data.domain, + name: data.name + }, + shopSettingsInput: { + description: data.description + } + } + }); + + const formTransitionState = getMutationState( + updateShopSettingsOpts.called, + updateShopSettingsOpts.loading, + [ + ...maybe( + () => + updateShopSettingsOpts.data.shopDomainUpdate.errors, + [] + ), + ...maybe( + () => + updateShopSettingsOpts.data.shopSettingsUpdate + .errors, + [] + ) + ] + ); + + return ( + <> + + siteSettings.data.shop)} + onBack={() => navigate(configurationMenuUrl)} + onKeyAdd={() => + navigate( + siteSettingsUrl({ + action: "add-key" + }) + ) + } + onKeyRemove={keyType => + deleteAuthorizationKey({ + variables: { keyType } + }) + } + onSubmit={handleUpdateShopSettings} + saveButtonBarState={formTransitionState} + /> + + addAuthorizationKeyOpts.data.authorizationKeyAdd + .errors, + [] + )} + initial={{ + key: "", + password: "", + type: AuthorizationKeyType.FACEBOOK + }} + open={params.action === "add-key"} + onClose={() => navigate(siteSettingsUrl())} + onSubmit={handleAuthenticationKeyAdd} + /> + + ); + }} + + )} + + )} + + )} + + ); +}; +export default SiteSettings; diff --git a/src/staff/components/StaffAddMemberDialog/StaffAddMemberDialog.tsx b/src/staff/components/StaffAddMemberDialog/StaffAddMemberDialog.tsx new file mode 100644 index 000000000..0d97ee9b0 --- /dev/null +++ b/src/staff/components/StaffAddMemberDialog/StaffAddMemberDialog.tsx @@ -0,0 +1,154 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import Form from "@saleor/components/Form"; +import FormSpacer from "@saleor/components/FormSpacer"; +import i18n from "../../../i18n"; +import { UserError } from "../../../types"; + +export interface FormData { + email: string; + firstName: string; + fullAccess: boolean; + lastName: string; +} + +const initialForm: FormData = { + email: "", + firstName: "", + fullAccess: false, + lastName: "" +}; + +const styles = (theme: Theme) => + createStyles({ + hr: { + backgroundColor: "#eaeaea", + border: "none", + height: 1, + marginBottom: 0 + }, + sectionTitle: { + fontWeight: 600 as 600, + marginBottom: theme.spacing.unit, + marginTop: theme.spacing.unit * 2 + }, + textFieldGrid: { + display: "grid", + gridColumnGap: `${theme.spacing.unit * 2}px`, + gridTemplateColumns: "1fr 1fr" + } + }); + +interface StaffAddMemberDialogProps extends WithStyles { + confirmButtonState: ConfirmButtonTransitionState; + errors: UserError[]; + open: boolean; + onClose: () => void; + onConfirm: (data: FormData) => void; +} + +const StaffAddMemberDialog = withStyles(styles, { + name: "StaffAddMemberDialog" +})( + ({ + classes, + confirmButtonState, + errors, + open, + onClose, + onConfirm + }: StaffAddMemberDialogProps) => ( + +
    + {({ change, data, errors: formErrors, hasChanged }) => ( + <> + {i18n.t("Add Staff Member")} + +
    + + +
    + + +
    +
    + + + {i18n.t("Permissions")} + + + {i18n.t( + "Expand or restrict user’s permissions to access certain part of saleor system." + )} + + + + + + + {i18n.t("Send invite", { context: "button" })} + + + + )} +
    +
    + ) +); +StaffAddMemberDialog.displayName = "StaffAddMemberDialog"; +export default StaffAddMemberDialog; diff --git a/src/staff/components/StaffAddMemberDialog/index.ts b/src/staff/components/StaffAddMemberDialog/index.ts new file mode 100644 index 000000000..d01805760 --- /dev/null +++ b/src/staff/components/StaffAddMemberDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./StaffAddMemberDialog"; +export * from "./StaffAddMemberDialog"; diff --git a/src/staff/components/StaffDetailsPage/StaffDetailsPage.tsx b/src/staff/components/StaffDetailsPage/StaffDetailsPage.tsx new file mode 100644 index 000000000..9083b22a0 --- /dev/null +++ b/src/staff/components/StaffDetailsPage/StaffDetailsPage.tsx @@ -0,0 +1,125 @@ +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import CardSpacer from "@saleor/components/CardSpacer"; +import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; +import Container from "@saleor/components/Container"; +import Form from "@saleor/components/Form"; +import Grid from "@saleor/components/Grid"; +import PageHeader from "@saleor/components/PageHeader"; +import SaveButtonBar from "@saleor/components/SaveButtonBar"; +import i18n from "../../../i18n"; +import { getUserName, maybe } from "../../../misc"; +import { PermissionEnum } from "../../../types/globalTypes"; +import { + StaffMemberDetails_shop_permissions, + StaffMemberDetails_user +} from "../../types/StaffMemberDetails"; +import StaffPermissions from "../StaffPermissions/StaffPermissions"; +import StaffProperties from "../StaffProperties/StaffProperties"; +import StaffStatus from "../StaffStatus/StaffStatus"; + +interface FormData { + hasFullAccess: boolean; + isActive: boolean; + permissions: PermissionEnum[]; + firstName: string; + lastName: string; + email: string; +} + +export interface StaffDetailsPageProps { + canEditAvatar: boolean; + canEditStatus: boolean; + canRemove: boolean; + disabled: boolean; + permissions: StaffMemberDetails_shop_permissions[]; + saveButtonBarState: ConfirmButtonTransitionState; + staffMember: StaffMemberDetails_user; + onBack: () => void; + onDelete: () => void; + onImageDelete: () => void; + onSubmit: (data: FormData) => void; + onImageUpload(file: File); +} + +const StaffDetailsPage: React.StatelessComponent = ({ + canEditAvatar, + canEditStatus, + canRemove, + disabled, + permissions, + saveButtonBarState, + staffMember, + onBack, + onDelete, + onImageDelete, + onImageUpload, + onSubmit +}: StaffDetailsPageProps) => { + const initialForm: FormData = { + email: maybe(() => staffMember.email), + firstName: maybe(() => staffMember.firstName), + hasFullAccess: maybe( + () => + permissions.filter( + perm => + maybe(() => staffMember.permissions, []).filter( + userPerm => userPerm.code === perm.code + ).length === 0 + ).length === 0, + false + ), + isActive: maybe(() => staffMember.isActive, false), + lastName: maybe(() => staffMember.lastName), + permissions: maybe(() => staffMember.permissions, []).map(perm => perm.code) + }; + return ( +
    + {({ data, change, hasChanged, submit }) => ( + + {i18n.t("Staff Members")} + + +
    + +
    + {canEditStatus && ( +
    + + + +
    + )} +
    + +
    + )} +
    + ); +}; +StaffDetailsPage.displayName = "StaffDetailsPage"; +export default StaffDetailsPage; diff --git a/src/staff/components/StaffDetailsPage/index.ts b/src/staff/components/StaffDetailsPage/index.ts new file mode 100644 index 000000000..310f38a21 --- /dev/null +++ b/src/staff/components/StaffDetailsPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./StaffDetailsPage"; +export * from "./StaffDetailsPage"; diff --git a/src/staff/components/StaffList/StaffList.tsx b/src/staff/components/StaffList/StaffList.tsx new file mode 100644 index 000000000..0216dd234 --- /dev/null +++ b/src/staff/components/StaffList/StaffList.tsx @@ -0,0 +1,172 @@ +import Card from "@material-ui/core/Card"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableFooter from "@material-ui/core/TableFooter"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import Typography from "@material-ui/core/Typography"; +import * as classNames from "classnames"; +import * as React from "react"; + +import Skeleton from "@saleor/components/Skeleton"; +import TablePagination from "@saleor/components/TablePagination"; +import i18n from "../../../i18n"; +import { + getUserInitials, + getUserName, + maybe, + renderCollection +} from "../../../misc"; +import { ListProps } from "../../../types"; +import { StaffList_staffUsers_edges_node } from "../../types/StaffList"; + +const styles = (theme: Theme) => + createStyles({ + avatar: { + alignItems: "center", + borderRadius: "100%", + display: "grid", + float: "left", + height: 47, + justifyContent: "center", + marginRight: theme.spacing.unit * 1 + "px", + overflow: "hidden", + width: 47 + }, + avatarDefault: { + "& p": { + color: "#fff", + lineHeight: "47px" + }, + background: theme.palette.primary.main, + height: 47, + textAlign: "center", + width: 47 + }, + avatarImage: { + pointerEvents: "none", + width: "100%" + }, + statusText: { + color: "#9E9D9D" + }, + tableRow: { + cursor: "pointer" + }, + wideColumn: { + width: "80%" + } + }); + +interface StaffListProps extends ListProps, WithStyles { + staffMembers: StaffList_staffUsers_edges_node[]; +} + +const StaffList = withStyles(styles, { name: "StaffList" })( + ({ + classes, + disabled, + onNextPage, + onPreviousPage, + onRowClick, + pageInfo, + staffMembers + }: StaffListProps) => ( + + + + + + {i18n.t("Name", { context: "object" })} + + + {i18n.t("Email Address", { context: "object" })} + + + + + + + + + + {renderCollection( + staffMembers, + staffMember => ( + + +
    + {maybe(() => staffMember.avatar.url) ? ( + staffMember.avatar.url)} + /> + ) : ( +
    + {getUserInitials(staffMember)} +
    + )} +
    + + {getUserName(staffMember) || } + + + {maybe( + () => + staffMember.isActive + ? i18n.t("Active", { context: "status" }) + : i18n.t("Inactive", { context: "status" }), + + )} + +
    + + {maybe( + () => staffMember.email, + + )} + +
    + ), + () => ( + + + {i18n.t("No staff members found")} + + + ) + )} +
    +
    +
    + ) +); +StaffList.displayName = "StaffList"; +export default StaffList; diff --git a/src/staff/components/StaffList/index.ts b/src/staff/components/StaffList/index.ts new file mode 100644 index 000000000..524579391 --- /dev/null +++ b/src/staff/components/StaffList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./StaffList"; +export * from "./StaffList"; diff --git a/src/staff/components/StaffListPage/StaffListPage.tsx b/src/staff/components/StaffListPage/StaffListPage.tsx new file mode 100644 index 000000000..b5a5f0fd1 --- /dev/null +++ b/src/staff/components/StaffListPage/StaffListPage.tsx @@ -0,0 +1,42 @@ +import Button from "@material-ui/core/Button"; +import AddIcon from "@material-ui/icons/Add"; +import * as React from "react"; + +import AppHeader from "@saleor/components/AppHeader"; +import { Container } from "@saleor/components/Container"; +import PageHeader from "@saleor/components/PageHeader"; +import i18n from "../../../i18n"; +import { ListProps } from "../../../types"; +import { StaffList_staffUsers_edges_node } from "../../types/StaffList"; +import StaffList from "../StaffList/StaffList"; + +export interface StaffListPageProps extends ListProps { + staffMembers: StaffList_staffUsers_edges_node[]; + onAdd: () => void; + onBack: () => void; +} + +const StaffListPage: React.StatelessComponent = ({ + disabled, + onAdd, + onBack, + ...listProps +}) => ( + + {i18n.t("Configuration")} + + + + + +); +StaffListPage.displayName = "StaffListPage"; +export default StaffListPage; diff --git a/src/staff/components/StaffListPage/index.ts b/src/staff/components/StaffListPage/index.ts new file mode 100644 index 000000000..acbe4f3df --- /dev/null +++ b/src/staff/components/StaffListPage/index.ts @@ -0,0 +1,2 @@ +export { default } from "./StaffListPage"; +export * from "./StaffListPage"; diff --git a/src/staff/components/StaffPermissions/StaffPermissions.tsx b/src/staff/components/StaffPermissions/StaffPermissions.tsx new file mode 100644 index 000000000..f992b6051 --- /dev/null +++ b/src/staff/components/StaffPermissions/StaffPermissions.tsx @@ -0,0 +1,121 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import Skeleton from "@saleor/components/Skeleton"; +import i18n from "../../../i18n"; +import { StaffMemberDetails_shop_permissions } from "../../types/StaffMemberDetails"; + +const styles = (theme: Theme) => + createStyles({ + checkboxContainer: { + marginTop: theme.spacing.unit + }, + hr: { + backgroundColor: "#eaeaea", + border: "none", + height: 1, + marginBottom: 0, + marginTop: 0 + } + }); + +interface StaffPermissionsProps extends WithStyles { + permissions: StaffMemberDetails_shop_permissions[]; + data: { + hasFullAccess: boolean; + permissions: string[]; + }; + disabled: boolean; + onChange: (event: React.ChangeEvent, cb?: () => void) => void; +} + +const StaffPermissions = withStyles(styles, { name: "StaffPermissions" })( + ({ + classes, + data, + disabled, + permissions, + onChange + }: StaffPermissionsProps) => { + const handleFullAccessChange = (event: React.ChangeEvent) => + onChange(event, () => + onChange({ + target: { + name: "permissions", + value: event.target.value ? permissions.map(perm => perm.code) : [] + } + } as any) + ); + const handlePermissionChange = (event: React.ChangeEvent) => { + onChange({ + target: { + name: "permissions", + value: event.target.value + ? data.permissions.concat([event.target.name]) + : data.permissions.filter(perm => perm !== event.target.name) + } + } as any); + }; + return ( + + + + + {i18n.t( + "Expand or restrict user's permissions to access certain part of saleor system." + )} + +
    + +
    +
    + {!data.hasFullAccess && ( + <> +
    + + {permissions === undefined ? ( + + ) : ( + permissions.map(perm => ( +
    + userPerm === perm.code + ).length === 1 + } + disabled={disabled} + label={perm.name.replace(/\./, "")} + name={perm.code} + onChange={handlePermissionChange} + /> +
    + )) + )} +
    + + )} +
    + ); + } +); +StaffPermissions.displayName = "StaffPermissions"; +export default StaffPermissions; diff --git a/src/staff/components/StaffPermissions/index.ts b/src/staff/components/StaffPermissions/index.ts new file mode 100644 index 000000000..82993ead1 --- /dev/null +++ b/src/staff/components/StaffPermissions/index.ts @@ -0,0 +1,2 @@ +export { default } from "./StaffPermissions"; +export * from "./StaffPermissions"; diff --git a/src/staff/components/StaffProperties/StaffProperties.tsx b/src/staff/components/StaffProperties/StaffProperties.tsx new file mode 100644 index 000000000..b58a5cc18 --- /dev/null +++ b/src/staff/components/StaffProperties/StaffProperties.tsx @@ -0,0 +1,201 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { + createStyles, + Theme, + withStyles, + WithStyles +} from "@material-ui/core/styles"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; +import SVG from "react-inlinesvg"; + +import CardTitle from "@saleor/components/CardTitle"; +import i18n from "../../../i18n"; +import { getUserInitials, maybe } from "../../../misc"; +import { StaffMemberDetails_user } from "../../types/StaffMemberDetails"; + +import * as photoIcon from "@assets/images/photo-icon.svg"; + +const styles = (theme: Theme) => + createStyles({ + avatar: { + "& svg": { + fill: "#fff" + }, + "&:hover $avatarHover": { + opacity: 1 + }, + alignItems: "center", + borderRadius: "100%", + display: "grid", + height: 120, + justifyContent: "center", + overflow: "hidden", + position: "relative", + width: 120 + }, + avatarDefault: { + "& p": { + color: "#fff", + fontSize: 35, + fontWeight: "bold", + lineHeight: "120px" + }, + background: theme.palette.primary.main, + height: 120, + textAlign: "center", + width: 120 + }, + avatarHover: { + "& p": { + "&:hover": { + textDecoration: "underline" + }, + color: theme.palette.primary.main, + cursor: "pointer", + fontSize: 12, + fontWeight: 500 + }, + background: "#00000080", + borderRadius: "100%", + height: 120, + opacity: 0, + padding: `${theme.spacing.unit * 2.5}px 0`, + position: "absolute", + textAlign: "center", + textTransform: "uppercase", + transition: "opacity 0.5s", + width: 120 + }, + avatarImage: { + pointerEvents: "none", + width: "100%" + }, + fileField: { + display: "none" + }, + prop: { + marginBottom: theme.spacing.unit * 2 + "px" + }, + propGrid: { + display: "grid", + gridColumnGap: theme.spacing.unit * 2 + "px", + gridRowGap: theme.spacing.unit + "px", + gridTemplateColumns: "1fr 1fr", + [theme.breakpoints.down("xs")]: { + gridTemplateColumns: "1fr" + } + }, + root: { + display: "grid", + gridColumnGap: theme.spacing.unit * 4 + "px", + gridTemplateColumns: "120px 1fr" + } + }); + +interface StaffPropertiesProps extends WithStyles { + canEditAvatar: boolean; + className?: string; + data: { + email: string; + firstName: string; + lastName: string; + }; + disabled: boolean; + staffMember: StaffMemberDetails_user; + onChange: (event: React.ChangeEvent) => void; + onImageDelete: () => void; + onImageUpload: (file: File) => void; +} + +const StaffProperties = withStyles(styles, { name: "StaffProperties" })( + ({ + canEditAvatar, + classes, + className, + data, + staffMember, + onChange, + onImageDelete, + onImageUpload + }: StaffPropertiesProps) => { + const imgInputAnchor = React.createRef(); + const clickImgInput = () => imgInputAnchor.current.click(); + return ( + + + +
    +
    +
    + {maybe(() => staffMember.avatar.url) ? ( + staffMember.avatar.url)} + /> + ) : ( +
    + {getUserInitials(data)} +
    + )} + {canEditAvatar && ( +
    + + + {i18n.t("Change photo")} + + + {i18n.t("Delete photo")} + + onImageUpload(event.target.files[0])} + type="file" + ref={imgInputAnchor} + /> +
    + )} +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + ); + } +); +StaffProperties.displayName = "StaffProperties"; +export default StaffProperties; diff --git a/src/staff/components/StaffProperties/index.ts b/src/staff/components/StaffProperties/index.ts new file mode 100644 index 000000000..eadc2b079 --- /dev/null +++ b/src/staff/components/StaffProperties/index.ts @@ -0,0 +1,2 @@ +export { default } from "./StaffProperties"; +export * from "./StaffProperties"; diff --git a/src/staff/components/StaffStatus/StaffStatus.tsx b/src/staff/components/StaffStatus/StaffStatus.tsx new file mode 100644 index 000000000..20fab8d68 --- /dev/null +++ b/src/staff/components/StaffStatus/StaffStatus.tsx @@ -0,0 +1,40 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import * as React from "react"; + +import CardTitle from "@saleor/components/CardTitle"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import i18n from "../../../i18n"; + +interface StaffStatusProps { + data: { + isActive: boolean; + }; + disabled: boolean; + onChange: (event: React.ChangeEvent) => void; +} + +const StaffStatus: React.StatelessComponent = ({ + data, + disabled, + onChange +}) => ( + + + + + {i18n.t("If you want to disable this account uncheck the box below")} + + + + +); +StaffStatus.displayName = "StaffStatus"; +export default StaffStatus; diff --git a/src/staff/components/StaffStatus/index.ts b/src/staff/components/StaffStatus/index.ts new file mode 100644 index 000000000..2372b443b --- /dev/null +++ b/src/staff/components/StaffStatus/index.ts @@ -0,0 +1,2 @@ +export { default } from "./StaffStatus"; +export * from "./StaffStatus"; diff --git a/src/staff/fixtures.ts b/src/staff/fixtures.ts new file mode 100644 index 000000000..9141f284f --- /dev/null +++ b/src/staff/fixtures.ts @@ -0,0 +1,238 @@ +import * as avatarImage from "../../images/avatars/avatar1.png"; +import { PermissionEnum } from "../types/globalTypes"; +import { StaffList_staffUsers_edges_node } from "./types/StaffList"; +import { StaffMemberDetails_user } from "./types/StaffMemberDetails"; + +export const permissions = [ + { + code: PermissionEnum.IMPERSONATE_USERS, + name: "Impersonate customers." + }, + { + code: PermissionEnum.MANAGE_DISCOUNTS, + name: "Manage sales and vouchers." + }, + { + code: PermissionEnum.MANAGE_MENUS, + name: "Manage navigation." + }, + { + code: PermissionEnum.MANAGE_ORDERS, + name: "Manage orders." + }, + { + code: PermissionEnum.MANAGE_PAGES, + name: "Manage pages." + }, + { + code: PermissionEnum.MANAGE_PRODUCTS, + name: "Manage products." + }, + { + code: PermissionEnum.MANAGE_SETTINGS, + name: "Manage settings." + }, + { + code: PermissionEnum.MANAGE_SHIPPING, + name: "Manage shipping." + }, + { + code: PermissionEnum.MANAGE_STAFF, + name: "Manage staff." + }, + { + code: PermissionEnum.MANAGE_USERS, + name: "Manage customers." + } +].map(perm => ({ + __typename: "PermissionDisplay" as "PermissionDisplay", + ...perm +})); +export const staffMembers: StaffList_staffUsers_edges_node[] = [ + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Chris", + id: "VXNlcjoyMQ==", + isActive: true, + lastName: "Cooper" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: false, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: true, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: true, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: true, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: true, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: false, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: true, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: true, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: false, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: false, + lastName: "Smith" + }, + { + avatar: { + __typename: "Image" as "Image", + url: avatarImage + }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: true, + lastName: "Smith" + } +].map(staffMember => ({ __typename: "User" as "User", ...staffMember })); +export const staffMember: StaffMemberDetails_user = { + __typename: "User", + avatar: { __typename: "Image" as "Image", url: avatarImage }, + email: "admin@example.com", + firstName: "Jacob", + id: "VXNlcjoyMQ==", + isActive: true, + lastName: "Smith", + permissions: [ + { + code: PermissionEnum.IMPERSONATE_USERS, + name: "Impersonate customers." + }, + { + code: PermissionEnum.MANAGE_DISCOUNTS, + name: "Manage sales and vouchers." + }, + { + code: PermissionEnum.MANAGE_MENUS, + name: "Manage navigation." + }, + { + code: PermissionEnum.MANAGE_ORDERS, + name: "Manage orders." + }, + { + code: PermissionEnum.MANAGE_PAGES, + name: "Manage pages." + }, + { + code: PermissionEnum.MANAGE_PRODUCTS, + name: "Manage products." + }, + { + code: PermissionEnum.MANAGE_SETTINGS, + name: "Manage settings." + }, + { + code: PermissionEnum.MANAGE_SHIPPING, + name: "Manage shipping." + }, + { + code: PermissionEnum.MANAGE_STAFF, + name: "Manage staff." + }, + { + code: PermissionEnum.MANAGE_USERS, + name: "Manage customers." + } + ].map(perm => ({ + __typename: "PermissionDisplay" as "PermissionDisplay", + ...perm + })) +}; diff --git a/src/staff/index.tsx b/src/staff/index.tsx new file mode 100644 index 000000000..5413b5995 --- /dev/null +++ b/src/staff/index.tsx @@ -0,0 +1,51 @@ +import { parse as parseQs } from "qs"; +import * as React from "react"; +import { Route, RouteComponentProps, Switch } from "react-router-dom"; + +import { WindowTitle } from "../components/WindowTitle"; +import i18n from "../i18n"; +import { + staffListPath, + StaffListUrlQueryParams, + staffMemberDetailsPath, + StaffMemberDetailsUrlQueryParams +} from "./urls"; +import StaffDetailsComponent from "./views/StaffDetails"; +import StaffListComponent from "./views/StaffList"; + +const StaffList: React.StatelessComponent> = ({ + location +}) => { + const qs = parseQs(location.search.substr(1)); + const params: StaffListUrlQueryParams = qs; + return ; +}; + +interface StaffDetailsRouteProps { + id: string; +} +const StaffDetails: React.StatelessComponent< + RouteComponentProps +> = ({ match }) => { + const qs = parseQs(location.search.substr(1)); + const params: StaffMemberDetailsUrlQueryParams = qs; + + return ( + + ); +}; + +const Component = () => ( + <> + + + + + + +); + +export default Component; diff --git a/src/staff/mutations.ts b/src/staff/mutations.ts new file mode 100644 index 000000000..a3939ecc3 --- /dev/null +++ b/src/staff/mutations.ts @@ -0,0 +1,116 @@ +import gql from "graphql-tag"; + +import { TypedMutation } from "../mutations"; +import { staffMemberDetailsFragment } from "./queries"; +import { StaffAvatarDelete } from "./types/StaffAvatarDelete"; +import { + StaffAvatarUpdate, + StaffAvatarUpdateVariables +} from "./types/StaffAvatarUpdate"; +import { + StaffMemberAdd, + StaffMemberAddVariables +} from "./types/StaffMemberAdd"; +import { + StaffMemberDelete, + StaffMemberDeleteVariables +} from "./types/StaffMemberDelete"; +import { + StaffMemberUpdate, + StaffMemberUpdateVariables +} from "./types/StaffMemberUpdate"; + +const staffMemberAddMutation = gql` + ${staffMemberDetailsFragment} + mutation StaffMemberAdd($input: StaffCreateInput!) { + staffCreate(input: $input) { + errors { + field + message + } + user { + ...StaffMemberDetailsFragment + } + } + } +`; +export const TypedStaffMemberAddMutation = TypedMutation< + StaffMemberAdd, + StaffMemberAddVariables +>(staffMemberAddMutation); + +const staffMemberUpdateMutation = gql` + ${staffMemberDetailsFragment} + mutation StaffMemberUpdate($id: ID!, $input: StaffInput!) { + staffUpdate(id: $id, input: $input) { + errors { + field + message + } + user { + ...StaffMemberDetailsFragment + } + } + } +`; +export const TypedStaffMemberUpdateMutation = TypedMutation< + StaffMemberUpdate, + StaffMemberUpdateVariables +>(staffMemberUpdateMutation); + +const staffMemberDeleteMutation = gql` + mutation StaffMemberDelete($id: ID!) { + staffDelete(id: $id) { + errors { + field + message + } + } + } +`; +export const TypedStaffMemberDeleteMutation = TypedMutation< + StaffMemberDelete, + StaffMemberDeleteVariables +>(staffMemberDeleteMutation); + +const staffAvatarUpdateMutation = gql` + mutation StaffAvatarUpdate($image: Upload!) { + userAvatarUpdate(image: $image) { + errors { + field + message + } + user { + id + avatar { + url + } + } + } + } +`; +export const TypedStaffAvatarUpdateMutation = TypedMutation< + StaffAvatarUpdate, + StaffAvatarUpdateVariables +>(staffAvatarUpdateMutation); + +const staffAvatarDeleteMutation = gql` + mutation StaffAvatarDelete { + userAvatarDelete { + errors { + field + message + } + user { + id + avatar { + url + } + } + } + } +`; +export const TypedStaffAvatarDeleteMutation = TypedMutation< + StaffAvatarDelete, + StaffMemberDeleteVariables +>(staffAvatarDeleteMutation); diff --git a/src/staff/queries.ts b/src/staff/queries.ts new file mode 100644 index 000000000..994b2f47c --- /dev/null +++ b/src/staff/queries.ts @@ -0,0 +1,77 @@ +import gql from "graphql-tag"; +import { TypedQuery } from "../queries"; +import { StaffList, StaffListVariables } from "./types/StaffList"; +import { + StaffMemberDetails, + StaffMemberDetailsVariables +} from "./types/StaffMemberDetails"; + +export const staffMemberFragment = gql` + fragment StaffMemberFragment on User { + id + email + firstName + isActive + lastName + avatar { + url + } + } +`; +export const staffMemberDetailsFragment = gql` + ${staffMemberFragment} + fragment StaffMemberDetailsFragment on User { + ...StaffMemberFragment + permissions { + code + name + } + } +`; +const staffList = gql` + ${staffMemberFragment} + query StaffList($first: Int, $after: String, $last: Int, $before: String) { + staffUsers(before: $before, after: $after, first: $first, last: $last) { + edges { + cursor + node { + ...StaffMemberFragment + } + } + pageInfo { + hasPreviousPage + hasNextPage + startCursor + endCursor + } + } + shop { + permissions { + code + name + } + } + } +`; +export const TypedStaffListQuery = TypedQuery( + staffList +); + +export const staffMemberDetails = gql` + ${staffMemberDetailsFragment} + query StaffMemberDetails($id: ID!) { + user(id: $id) { + ...StaffMemberDetailsFragment + } + shop { + permissions { + code + name + } + } + } +`; +export const TypedStaffMemberDetailsQuery = TypedQuery< + StaffMemberDetails, + StaffMemberDetailsVariables +>(staffMemberDetails); diff --git a/src/staff/types/StaffAvatarDelete.ts b/src/staff/types/StaffAvatarDelete.ts new file mode 100644 index 000000000..763ee71e6 --- /dev/null +++ b/src/staff/types/StaffAvatarDelete.ts @@ -0,0 +1,34 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: StaffAvatarDelete +// ==================================================== + +export interface StaffAvatarDelete_userAvatarDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface StaffAvatarDelete_userAvatarDelete_user_avatar { + __typename: "Image"; + url: string; +} + +export interface StaffAvatarDelete_userAvatarDelete_user { + __typename: "User"; + id: string; + avatar: StaffAvatarDelete_userAvatarDelete_user_avatar | null; +} + +export interface StaffAvatarDelete_userAvatarDelete { + __typename: "UserAvatarDelete"; + errors: StaffAvatarDelete_userAvatarDelete_errors[] | null; + user: StaffAvatarDelete_userAvatarDelete_user | null; +} + +export interface StaffAvatarDelete { + userAvatarDelete: StaffAvatarDelete_userAvatarDelete | null; +} diff --git a/src/staff/types/StaffAvatarUpdate.ts b/src/staff/types/StaffAvatarUpdate.ts new file mode 100644 index 000000000..847f5c80d --- /dev/null +++ b/src/staff/types/StaffAvatarUpdate.ts @@ -0,0 +1,38 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: StaffAvatarUpdate +// ==================================================== + +export interface StaffAvatarUpdate_userAvatarUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface StaffAvatarUpdate_userAvatarUpdate_user_avatar { + __typename: "Image"; + url: string; +} + +export interface StaffAvatarUpdate_userAvatarUpdate_user { + __typename: "User"; + id: string; + avatar: StaffAvatarUpdate_userAvatarUpdate_user_avatar | null; +} + +export interface StaffAvatarUpdate_userAvatarUpdate { + __typename: "UserAvatarUpdate"; + errors: StaffAvatarUpdate_userAvatarUpdate_errors[] | null; + user: StaffAvatarUpdate_userAvatarUpdate_user | null; +} + +export interface StaffAvatarUpdate { + userAvatarUpdate: StaffAvatarUpdate_userAvatarUpdate | null; +} + +export interface StaffAvatarUpdateVariables { + image: any; +} diff --git a/src/staff/types/StaffList.ts b/src/staff/types/StaffList.ts new file mode 100644 index 000000000..2a3663628 --- /dev/null +++ b/src/staff/types/StaffList.ts @@ -0,0 +1,67 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PermissionEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: StaffList +// ==================================================== + +export interface StaffList_staffUsers_edges_node_avatar { + __typename: "Image"; + url: string; +} + +export interface StaffList_staffUsers_edges_node { + __typename: "User"; + id: string; + email: string; + firstName: string; + isActive: boolean; + lastName: string; + avatar: StaffList_staffUsers_edges_node_avatar | null; +} + +export interface StaffList_staffUsers_edges { + __typename: "UserCountableEdge"; + cursor: string; + node: StaffList_staffUsers_edges_node; +} + +export interface StaffList_staffUsers_pageInfo { + __typename: "PageInfo"; + hasPreviousPage: boolean; + hasNextPage: boolean; + startCursor: string | null; + endCursor: string | null; +} + +export interface StaffList_staffUsers { + __typename: "UserCountableConnection"; + edges: StaffList_staffUsers_edges[]; + pageInfo: StaffList_staffUsers_pageInfo; +} + +export interface StaffList_shop_permissions { + __typename: "PermissionDisplay"; + code: PermissionEnum; + name: string; +} + +export interface StaffList_shop { + __typename: "Shop"; + permissions: (StaffList_shop_permissions | null)[]; +} + +export interface StaffList { + staffUsers: StaffList_staffUsers | null; + shop: StaffList_shop | null; +} + +export interface StaffListVariables { + first?: number | null; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/staff/types/StaffMemberAdd.ts b/src/staff/types/StaffMemberAdd.ts new file mode 100644 index 000000000..b19fcddb3 --- /dev/null +++ b/src/staff/types/StaffMemberAdd.ts @@ -0,0 +1,51 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { StaffCreateInput, PermissionEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: StaffMemberAdd +// ==================================================== + +export interface StaffMemberAdd_staffCreate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface StaffMemberAdd_staffCreate_user_avatar { + __typename: "Image"; + url: string; +} + +export interface StaffMemberAdd_staffCreate_user_permissions { + __typename: "PermissionDisplay"; + code: PermissionEnum; + name: string; +} + +export interface StaffMemberAdd_staffCreate_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + isActive: boolean; + lastName: string; + avatar: StaffMemberAdd_staffCreate_user_avatar | null; + permissions: (StaffMemberAdd_staffCreate_user_permissions | null)[] | null; +} + +export interface StaffMemberAdd_staffCreate { + __typename: "StaffCreate"; + errors: StaffMemberAdd_staffCreate_errors[] | null; + user: StaffMemberAdd_staffCreate_user | null; +} + +export interface StaffMemberAdd { + staffCreate: StaffMemberAdd_staffCreate | null; +} + +export interface StaffMemberAddVariables { + input: StaffCreateInput; +} diff --git a/src/staff/types/StaffMemberDelete.ts b/src/staff/types/StaffMemberDelete.ts new file mode 100644 index 000000000..7a238232f --- /dev/null +++ b/src/staff/types/StaffMemberDelete.ts @@ -0,0 +1,26 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL mutation operation: StaffMemberDelete +// ==================================================== + +export interface StaffMemberDelete_staffDelete_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface StaffMemberDelete_staffDelete { + __typename: "StaffDelete"; + errors: StaffMemberDelete_staffDelete_errors[] | null; +} + +export interface StaffMemberDelete { + staffDelete: StaffMemberDelete_staffDelete | null; +} + +export interface StaffMemberDeleteVariables { + id: string; +} diff --git a/src/staff/types/StaffMemberDetails.ts b/src/staff/types/StaffMemberDetails.ts new file mode 100644 index 000000000..d7cc5b763 --- /dev/null +++ b/src/staff/types/StaffMemberDetails.ts @@ -0,0 +1,51 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PermissionEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: StaffMemberDetails +// ==================================================== + +export interface StaffMemberDetails_user_avatar { + __typename: "Image"; + url: string; +} + +export interface StaffMemberDetails_user_permissions { + __typename: "PermissionDisplay"; + code: PermissionEnum; + name: string; +} + +export interface StaffMemberDetails_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + isActive: boolean; + lastName: string; + avatar: StaffMemberDetails_user_avatar | null; + permissions: (StaffMemberDetails_user_permissions | null)[] | null; +} + +export interface StaffMemberDetails_shop_permissions { + __typename: "PermissionDisplay"; + code: PermissionEnum; + name: string; +} + +export interface StaffMemberDetails_shop { + __typename: "Shop"; + permissions: (StaffMemberDetails_shop_permissions | null)[]; +} + +export interface StaffMemberDetails { + user: StaffMemberDetails_user | null; + shop: StaffMemberDetails_shop | null; +} + +export interface StaffMemberDetailsVariables { + id: string; +} diff --git a/src/staff/types/StaffMemberDetailsFragment.ts b/src/staff/types/StaffMemberDetailsFragment.ts new file mode 100644 index 000000000..332de7b4a --- /dev/null +++ b/src/staff/types/StaffMemberDetailsFragment.ts @@ -0,0 +1,31 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { PermissionEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: StaffMemberDetailsFragment +// ==================================================== + +export interface StaffMemberDetailsFragment_avatar { + __typename: "Image"; + url: string; +} + +export interface StaffMemberDetailsFragment_permissions { + __typename: "PermissionDisplay"; + code: PermissionEnum; + name: string; +} + +export interface StaffMemberDetailsFragment { + __typename: "User"; + id: string; + email: string; + firstName: string; + isActive: boolean; + lastName: string; + avatar: StaffMemberDetailsFragment_avatar | null; + permissions: (StaffMemberDetailsFragment_permissions | null)[] | null; +} diff --git a/src/staff/types/StaffMemberFragment.ts b/src/staff/types/StaffMemberFragment.ts new file mode 100644 index 000000000..f5098fcdf --- /dev/null +++ b/src/staff/types/StaffMemberFragment.ts @@ -0,0 +1,22 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL fragment: StaffMemberFragment +// ==================================================== + +export interface StaffMemberFragment_avatar { + __typename: "Image"; + url: string; +} + +export interface StaffMemberFragment { + __typename: "User"; + id: string; + email: string; + firstName: string; + isActive: boolean; + lastName: string; + avatar: StaffMemberFragment_avatar | null; +} diff --git a/src/staff/types/StaffMemberUpdate.ts b/src/staff/types/StaffMemberUpdate.ts new file mode 100644 index 000000000..158b084db --- /dev/null +++ b/src/staff/types/StaffMemberUpdate.ts @@ -0,0 +1,52 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { StaffInput, PermissionEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: StaffMemberUpdate +// ==================================================== + +export interface StaffMemberUpdate_staffUpdate_errors { + __typename: "Error"; + field: string | null; + message: string | null; +} + +export interface StaffMemberUpdate_staffUpdate_user_avatar { + __typename: "Image"; + url: string; +} + +export interface StaffMemberUpdate_staffUpdate_user_permissions { + __typename: "PermissionDisplay"; + code: PermissionEnum; + name: string; +} + +export interface StaffMemberUpdate_staffUpdate_user { + __typename: "User"; + id: string; + email: string; + firstName: string; + isActive: boolean; + lastName: string; + avatar: StaffMemberUpdate_staffUpdate_user_avatar | null; + permissions: (StaffMemberUpdate_staffUpdate_user_permissions | null)[] | null; +} + +export interface StaffMemberUpdate_staffUpdate { + __typename: "StaffUpdate"; + errors: StaffMemberUpdate_staffUpdate_errors[] | null; + user: StaffMemberUpdate_staffUpdate_user | null; +} + +export interface StaffMemberUpdate { + staffUpdate: StaffMemberUpdate_staffUpdate | null; +} + +export interface StaffMemberUpdateVariables { + id: string; + input: StaffInput; +} diff --git a/src/staff/urls.ts b/src/staff/urls.ts new file mode 100644 index 000000000..56c2211a6 --- /dev/null +++ b/src/staff/urls.ts @@ -0,0 +1,25 @@ +import { stringify as stringifyQs } from "qs"; +import * as urlJoin from "url-join"; + +import { BulkAction, Dialog, Pagination } from "../types"; + +const staffSection = "/staff/"; + +export const staffListPath = staffSection; +export type StaffListUrlDialog = "add" | "remove"; +export type StaffListUrlQueryParams = BulkAction & + Dialog & + Pagination; +export const staffListUrl = (params?: StaffListUrlQueryParams) => + staffListPath + "?" + stringifyQs(params); + +export const staffMemberDetailsPath = (id: string) => urlJoin(staffSection, id); +export type StaffMemberDetailsUrlDialog = "remove" | "remove-avatar"; +export type StaffMemberDetailsUrlQueryParams = Dialog< + StaffMemberDetailsUrlDialog +>; + +export const staffMemberDetailsUrl = ( + id: string, + params?: StaffMemberDetailsUrlQueryParams +) => staffMemberDetailsPath(encodeURIComponent(id)) + "?" + stringifyQs(params); diff --git a/src/staff/views/StaffDetails.tsx b/src/staff/views/StaffDetails.tsx new file mode 100644 index 000000000..9dfb77312 --- /dev/null +++ b/src/staff/views/StaffDetails.tsx @@ -0,0 +1,226 @@ +import DialogContentText from "@material-ui/core/DialogContentText"; +import * as React from "react"; + +import ActionDialog from "@saleor/components/ActionDialog"; +import { WindowTitle } from "@saleor/components/WindowTitle"; +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import useUser from "@saleor/hooks/useUser"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import StaffDetailsPage from "../components/StaffDetailsPage/StaffDetailsPage"; +import { + TypedStaffAvatarDeleteMutation, + TypedStaffAvatarUpdateMutation, + TypedStaffMemberDeleteMutation, + TypedStaffMemberUpdateMutation +} from "../mutations"; +import { TypedStaffMemberDetailsQuery } from "../queries"; +import { StaffAvatarDelete } from "../types/StaffAvatarDelete"; +import { StaffAvatarUpdate } from "../types/StaffAvatarUpdate"; +import { StaffMemberDelete } from "../types/StaffMemberDelete"; +import { StaffMemberUpdate } from "../types/StaffMemberUpdate"; +import { + staffListUrl, + staffMemberDetailsUrl, + StaffMemberDetailsUrlQueryParams +} from "../urls"; + +interface OrderListProps { + id: string; + params: StaffMemberDetailsUrlQueryParams; +} + +export const StaffDetails: React.StatelessComponent = ({ + id, + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const user = useUser(); + + return ( + + {({ data, loading }) => { + const handleStaffMemberUpdate = (data: StaffMemberUpdate) => { + if (!maybe(() => data.staffUpdate.errors.length !== 0)) { + notify({ + text: i18n.t("Succesfully updated staff member account") + }); + } + }; + const handleStaffMemberDelete = (data: StaffMemberDelete) => { + if (!maybe(() => data.staffDelete.errors.length !== 0)) { + notify({ + text: i18n.t("Succesfully removed staff member") + }); + navigate(staffListUrl()); + } + }; + const handleStaffMemberAvatarUpdate = (data: StaffAvatarUpdate) => { + if (!maybe(() => data.userAvatarUpdate.errors.length !== 0)) { + notify({ + text: i18n.t("Succesfully updated staff member avatar") + }); + } + }; + const handleStaffMemberAvatarDelete = (data: StaffAvatarDelete) => { + if (!maybe(() => data.userAvatarDelete.errors.length !== 0)) { + notify({ + text: i18n.t("Succesfully removed staff member avatar") + }); + navigate(staffMemberDetailsUrl(id)); + } + }; + return ( + + {(updateStaffMember, updateResult) => ( + + {(deleteStaffMember, deleteResult) => ( + + {updateStaffAvatar => ( + + {(deleteStaffAvatar, deleteAvatarResult) => { + const formTransitionState = getMutationState( + updateResult.called, + updateResult.loading, + maybe(() => updateResult.data.staffUpdate.errors) + ); + const deleteTransitionState = getMutationState( + deleteResult.called, + deleteResult.loading, + maybe(() => deleteResult.data.staffDelete.errors) + ); + const deleteAvatarTransitionState = getMutationState( + deleteAvatarResult.called, + deleteAvatarResult.loading, + maybe( + () => + deleteAvatarResult.data.userAvatarDelete.errors + ) + ); + const isUserSameAsViewer = maybe( + () => user.user.id === data.user.id, + true + ); + + return ( + <> + data.user.email)} + /> + navigate(staffListUrl())} + onDelete={() => + navigate( + staffMemberDetailsUrl(id, { + action: "remove" + }) + ) + } + onSubmit={variables => + updateStaffMember({ + variables: { + id, + input: { + email: variables.email, + firstName: variables.firstName, + isActive: variables.isActive, + lastName: variables.lastName, + permissions: variables.permissions + } + } + }) + } + onImageUpload={file => + updateStaffAvatar({ + variables: { + image: file + } + }) + } + onImageDelete={() => + navigate( + staffMemberDetailsUrl(id, { + action: "remove-avatar" + }) + ) + } + permissions={maybe(() => data.shop.permissions)} + staffMember={maybe(() => data.user)} + saveButtonBarState={formTransitionState} + /> + + navigate(staffMemberDetailsUrl(id)) + } + onConfirm={deleteStaffMember} + > + {{ email }} from staff members?", + { + email: maybe(() => data.user.email) + } + ) + }} + /> + + + navigate(staffMemberDetailsUrl(id)) + } + onConfirm={deleteStaffAvatar} + > + {{ email }} avatar?", + { + email: maybe(() => data.user.email) + } + ) + }} + /> + + + ); + }} + + )} + + )} + + )} + + ); + }} + + ); +}; + +export default StaffDetails; diff --git a/src/staff/views/StaffList.tsx b/src/staff/views/StaffList.tsx new file mode 100644 index 000000000..4a33bfbc4 --- /dev/null +++ b/src/staff/views/StaffList.tsx @@ -0,0 +1,130 @@ +import * as React from "react"; + +import useNavigator from "@saleor/hooks/useNavigator"; +import useNotifier from "@saleor/hooks/useNotifier"; +import usePaginator, { + createPaginationState +} from "@saleor/hooks/usePaginator"; +import { PAGINATE_BY } from "../../config"; +import { configurationMenuUrl } from "../../configuration"; +import i18n from "../../i18n"; +import { getMutationState, maybe } from "../../misc"; +import StaffAddMemberDialog, { + FormData as AddStaffMemberForm +} from "../components/StaffAddMemberDialog"; +import StaffListPage from "../components/StaffListPage"; +import { TypedStaffMemberAddMutation } from "../mutations"; +import { TypedStaffListQuery } from "../queries"; +import { StaffMemberAdd } from "../types/StaffMemberAdd"; +import { + staffListUrl, + StaffListUrlQueryParams, + staffMemberDetailsUrl +} from "../urls"; + +interface StaffListProps { + params: StaffListUrlQueryParams; +} + +export const StaffList: React.StatelessComponent = ({ + params +}) => { + const navigate = useNavigator(); + const notify = useNotifier(); + const paginate = usePaginator(); + + const closeModal = () => + navigate( + staffListUrl({ + ...params, + action: undefined, + ids: undefined + }), + true + ); + + const paginationState = createPaginationState(PAGINATE_BY, params); + return ( + + {({ data, loading }) => { + const handleStaffMemberAddSuccess = (data: StaffMemberAdd) => { + if (data.staffCreate.errors.length === 0) { + notify({ + text: i18n.t("Succesfully added staff member") + }); + navigate(staffMemberDetailsUrl(data.staffCreate.user.id)); + } + }; + + return ( + + {(addStaffMember, addStaffMemberData) => { + const handleStaffMemberAdd = (variables: AddStaffMemberForm) => + addStaffMember({ + variables: { + input: { + email: variables.email, + firstName: variables.firstName, + lastName: variables.lastName, + permissions: variables.fullAccess + ? data.shop.permissions.map(perm => perm.code) + : undefined, + sendPasswordEmail: true + } + } + }); + const addTransitionState = getMutationState( + addStaffMemberData.called, + addStaffMemberData.loading, + maybe(() => addStaffMemberData.data.staffCreate.errors) + ); + + const { loadNextPage, loadPreviousPage, pageInfo } = paginate( + maybe(() => data.staffUsers.pageInfo), + paginationState, + params + ); + + return ( + <> + + data.staffUsers.edges.map(edge => edge.node) + )} + onAdd={() => + navigate( + staffListUrl({ + action: "add" + }) + ) + } + onBack={() => navigate(configurationMenuUrl)} + onNextPage={loadNextPage} + onPreviousPage={loadPreviousPage} + onRowClick={id => () => navigate(staffMemberDetailsUrl(id))} + /> + addStaffMemberData.data.staffCreate.errors, + [] + )} + open={params.action === "add"} + onClose={closeModal} + onConfirm={handleStaffMemberAdd} + /> + + ); + }} + + ); + }} + + ); +}; + +export default StaffList; diff --git a/src/storybook/.babelrc b/src/storybook/.babelrc new file mode 100644 index 000000000..2b7bafa5f --- /dev/null +++ b/src/storybook/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env", "@babel/preset-react"] +} diff --git a/src/storybook/CardDecorator.tsx b/src/storybook/CardDecorator.tsx new file mode 100644 index 000000000..e00a37481 --- /dev/null +++ b/src/storybook/CardDecorator.tsx @@ -0,0 +1,16 @@ +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import * as React from "react"; + +const CardDecorator = storyFn => ( + + {storyFn()} + +); +export default CardDecorator; diff --git a/src/storybook/Decorator.tsx b/src/storybook/Decorator.tsx new file mode 100644 index 000000000..beb127ca6 --- /dev/null +++ b/src/storybook/Decorator.tsx @@ -0,0 +1,28 @@ +import * as React from "react"; + +import { Provider as DateProvider } from "../components/Date/DateContext"; +import { FormProvider } from "../components/Form"; +import { MessageManager } from "../components/messages"; +import ThemeProvider from "../components/Theme"; +import { TimezoneProvider } from "../components/Timezone"; + +export const Decorator = storyFn => ( + + + + + +
    + {storyFn()} +
    +
    +
    +
    +
    +
    +); +export default Decorator; diff --git a/src/storybook/Stories.test.ts b/src/storybook/Stories.test.ts new file mode 100644 index 000000000..197179e68 --- /dev/null +++ b/src/storybook/Stories.test.ts @@ -0,0 +1,27 @@ +import createGenerateClassName from "@material-ui/core/styles/createGenerateClassName"; +import initStoryshots from "@storybook/addon-storyshots"; +// tslint:disable no-submodule-imports +import * as generateRandomKey from "draft-js/lib/generateRandomKey"; +import { configure, render } from "enzyme"; +import * as Adapter from "enzyme-adapter-react-16"; +import toJSON from "enzyme-to-json"; + +configure({ adapter: new Adapter() }); + +jest.mock("@material-ui/core/styles/createGenerateClassName"); +(createGenerateClassName as any).mockImplementation( + () => (rule, stylesheet) => { + return [stylesheet.options.meta, rule.key, "id"].join("-"); + } +); + +jest.mock("draft-js/lib/generateRandomKey"); +(generateRandomKey as any).mockImplementation(() => "testKey"); + +initStoryshots({ + configPath: "saleor/static/dashboard-next/storybook/", + test({ story }) { + const result = render(story.render() as any); + expect(toJSON(result)).toMatchSnapshot(); + } +}); diff --git a/src/storybook/__snapshots__/Stories.test.ts.snap b/src/storybook/__snapshots__/Stories.test.ts.snap new file mode 100644 index 000000000..17bd0d0a3 --- /dev/null +++ b/src/storybook/__snapshots__/Stories.test.ts.snap @@ -0,0 +1,83985 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Storyshots Categories / CategoryProducts when loading data 1`] = ` +
    +
    +
    + + Products + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + +
    + + Name + + Type +
    +
    + +
    +
    + + ‌ + + + + ‌ + +
    +
    +
    +`; + +exports[`Storyshots Categories / CategoryProducts with clickable rows 1`] = ` +
    +
    +
    + + Products + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Name + + Type +
    +
    + +
    +
    + + Gardner, Graham and King + + + T-Shirt +
    +
    + +
    +
    + + Gardner, Graham and King + + + T-Shirt +
    +
    + +
    +
    + + Gardner, Graham and King + + + T-Shirt +
    +
    + +
    +
    + + Gardner, Graham and King + + + T-Shirt +
    +
    +
    +`; + +exports[`Storyshots Categories / CategoryProducts with initial data 1`] = ` +
    +
    +
    + + Products + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Name + + Type +
    +
    + +
    +
    + + Gardner, Graham and King + + + T-Shirt +
    +
    + +
    +
    + + Gardner, Graham and King + + + T-Shirt +
    +
    + +
    +
    + + Gardner, Graham and King + + + T-Shirt +
    +
    + +
    +
    + + Gardner, Graham and King + + + T-Shirt +
    +
    +
    +`; + +exports[`Storyshots Categories / CategoryProducts without initial data 1`] = ` +
    +
    +
    + + Products + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    + Name + + Type +
    + No products found +
    +
    +
    +`; + +exports[`Storyshots Customers / Address editing dialog default 1`] = ` +
    +`; + +exports[`Storyshots Customers / Address editing dialog edit 1`] = ` +
    +`; + +exports[`Storyshots Discounts / Select countries default 1`] = ` +
    +`; + +exports[`Storyshots Generics / ActionDialog default 1`] = ` +
    +`; + +exports[`Storyshots Generics / AddressEdit default 1`] = ` +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / AddressFormatter default 1`] = ` +
    +
    +
    +
    + + Elizabeth Vaughn + + + 419 Ruiz Orchard Apt. 199 +
    +
    + + 52203 Port Danielshire + + + Szwecja + +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / AddressFormatter when loading 1`] = ` +
    +
    +
    + + ‌ + +
    +
    +
    +`; + +exports[`Storyshots Generics / Autocomplete Menu default 1`] = ` +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Autocomplete Menu error 1`] = ` +
    +
    +
    +
    +
    + +
    + +
    +

    + Generic form error +

    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Autocomplete Menu interactive 1`] = ` +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Autocomplete Menu loading 1`] = ` +
    +
    +
    +
    +
    + +
    + +
    + + + +
    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Card menu default 1`] = ` +
    +
    + +
    +
    +`; + +exports[`Storyshots Generics / Checkbox checked 1`] = ` +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / Checkbox disabled 1`] = ` +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / Checkbox interactive 1`] = ` +
    +
    +
    +
    + +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Checkbox unchecked 1`] = ` +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / Checkbox undeterminate 1`] = ` +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / Chip default 1`] = ` +
    +
    +
    +
    + + Lorem Ipsum + +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Chip with x 1`] = ` +
    +
    +
    +
    + + Lorem Ipsum + + +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Date default 1`] = ` +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / Date plain 1`] = ` +
    +
    +
    + Apr 7, 2018 +
    +
    +
    +`; + +exports[`Storyshots Generics / DateTime default 1`] = ` +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / DateTime plain 1`] = ` +
    +
    +
    + Apr 7, 2018 6:44 AM +
    +
    +
    +`; + +exports[`Storyshots Generics / Delete filter tab default 1`] = ` +
    +`; + +exports[`Storyshots Generics / EditableTableCell default 1`] = ` +
    +
    +
    + + + + + + + + + + + + + + + +
    + Some header + + Some header + + Some header +
    + Some value + +
    + + Some editable text + +
    +
    + Some value +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / ErrorMessageCard default 1`] = ` +
    +
    +

    + Error +

    +

    + Loren ipsum dolor sit amet! +

    +
    +
    +`; + +exports[`Storyshots Generics / External Link default 1`] = ` + +`; + +exports[`Storyshots Generics / External Link new tab 1`] = ` + +`; + +exports[`Storyshots Generics / Filter default 1`] = ` +
    +
    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Global messages default 1`] = ` +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / Global messages with undo action 1`] = ` +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / Money formatting default 1`] = ` +
    +
    +
    + €14.00 +
    +
    +
    +`; + +exports[`Storyshots Generics / Money range from 1`] = ` +
    +
    +
    + from $5.20 +
    +
    +
    +`; + +exports[`Storyshots Generics / Money range range 1`] = ` +
    +
    +
    + $5.20 - $10.60 +
    +
    +
    +`; + +exports[`Storyshots Generics / Money range to 1`] = ` +
    +
    +
    + to $10.60 +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiAutocompleteSelectField with loaded data 1`] = ` +
    +
    +
    +
    +
    +
    + + +

    + Value: afghanistan +

    +
    +
    +
    +

    + Afghanistan +

    +
    + +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiAutocompleteSelectField with loading data 1`] = ` +
    +
    +
    +
    +
    +
    + + +

    + Value: afghanistan +

    +
    +
    +
    +

    + Afghanistan +

    +
    + +
    +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiSelectField interactive 1`] = ` +
    +
    +
    +
    +
    + +
    +
    +
    + Apparel +
    + + +
    +
    +

    + Ipsum +

    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiSelectField with error hint 1`] = ` +
    +
    +
    +
    +
    +
    +
    + + ​ + +
    + + +
    +
    +

    + Lorem error +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiSelectField with hint 1`] = ` +
    +
    +
    +
    +
    +
    +
    + + ​ + +
    + + +
    +
    +

    + Lorem ipsum +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiSelectField with label 1`] = ` +
    +
    +
    +
    + +
    +
    +
    + + ​ + +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiSelectField with label and hint 1`] = ` +
    +
    +
    +
    + +
    +
    +
    + + ​ + +
    + + +
    +
    +

    + Ipsum +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiSelectField with no value 1`] = ` +
    +
    +
    +
    +
    +
    +
    + + ​ + +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiSelectField with value 1`] = ` +
    +
    +
    +
    +
    +
    +
    + Apparel +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / MultiSelectField with value, label and hint 1`] = ` +
    +
    +
    +
    + +
    +
    +
    + Apparel +
    + + +
    +
    +

    + Ipsum +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / PageHeader with title 1`] = ` +
    +
    +
    + Lorem ipsum +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / PageHeader with title icon bar 1`] = ` +
    +
    +
    + Lorem ipsum +
    +
    + +
    +
    +
    +`; + +exports[`Storyshots Generics / PageHeader without title 1`] = ` +
    +
    +
    + + ‌ + +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Percent formatting default 1`] = ` +
    +
    +
    + 96.14% +
    +
    +
    +`; + +exports[`Storyshots Generics / PhoneField default 1`] = ` +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Price input disabled 1`] = ` +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Price input with currency symbol 1`] = ` +
    +
    +
    +
    +
    + +
    +

    + $ +

    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Price input with hint 1`] = ` +
    +
    +
    +
    +
    + + +
    +

    + Lorem ipsum +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Price input with label 1`] = ` +
    +
    +
    +
    + +
    + + +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Price input with label and hint 1`] = ` +
    +
    +
    +
    + +
    + + +
    +

    + Ipsum +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Price input with no value 1`] = ` +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Price input with value 1`] = ` +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Price input with value, label, currency symbol and error 1`] = ` +
    +
    +
    +
    + +
    + +
    +

    + $ +

    +
    +
    +

    + Ipsum +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Price input with value, label, currency symbol and hint 1`] = ` +
    +
    +
    +
    + +
    + +
    +

    + $ +

    +
    +
    +

    + Ipsum +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Rich text editor default 1`] = ` +
    +
    +
    +
    +
    + + Content + +
    + +
    +
    +
    +
    +
    +
    + + + bold + + +
    +
    +
    +
    + + + italic + + +
    +
    +
    +
    + + + strikethrough + + +
    +
    +

    +
    + + + h1 + + +
    +

    +

    +
    + + + h2 + + +
    +

    +

    +
    + + + h3 + + +
    +

    +
    +
    + + + blockquote + + +
    +
    +
      +
    • +
      + + + ul + + +
      +
    • +
    +
      +
    1. +
      + + + ol + + +
      +
    2. +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Save filter tab default 1`] = ` +
    +`; + +exports[`Storyshots Generics / SaveButtonBar disabled 1`] = ` +
    +`; + +exports[`Storyshots Generics / SaveButtonBar error 1`] = ` +
    +`; + +exports[`Storyshots Generics / SaveButtonBar idle 1`] = ` +
    +`; + +exports[`Storyshots Generics / SaveButtonBar interactive error 1`] = ` +
    +`; + +exports[`Storyshots Generics / SaveButtonBar interactive success 1`] = ` +
    +`; + +exports[`Storyshots Generics / SaveButtonBar loading 1`] = ` +
    +`; + +exports[`Storyshots Generics / SaveButtonBar success 1`] = ` +
    +`; + +exports[`Storyshots Generics / SingleAutocompleteSelectField with custom option 1`] = ` +
    +
    +
    +
    +
    +
    + + +

    + Value: afghanistan +

    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / SingleAutocompleteSelectField with loaded data 1`] = ` +
    +
    +
    +
    +
    +
    + + +

    + Value: afghanistan +

    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / SingleAutocompleteSelectField with loading data 1`] = ` +
    +
    +
    +
    +
    +
    + + +

    + Value: afghanistan +

    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / SingleSelectField with error hint 1`] = ` +
    +
    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / SingleSelectField with hint 1`] = ` +
    +
    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / SingleSelectField with label 1`] = ` +
    +
    +
    +
    + +
    +
    +
    + + ​ + +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / SingleSelectField with label and hint 1`] = ` +
    +
    +
    +
    + +
    +
    +
    + + ​ + +
    + + +
    +
    +

    + Ipsum +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / SingleSelectField with no value 1`] = ` +
    +
    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / SingleSelectField with value 1`] = ` +
    +
    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / SingleSelectField with value, label and hint 1`] = ` +
    +
    +
    +
    + +
    +
    +
    + Apparel +
    + + +
    +
    +

    + Ipsum +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Skeleton default 1`] = ` +
    +
    +
    + + ‌ + +
    +
    +
    +`; + +exports[`Storyshots Generics / StatusLabel when error 1`] = ` +
    +
    +
    +
    + Example label +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / StatusLabel when neutral 1`] = ` +
    +
    +
    +
    + Example label +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / StatusLabel when success 1`] = ` +
    +
    +
    +
    + Example label +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / TablePagination both previous and next pages are available 1`] = ` +
    +
    +
    + + + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / TablePagination next page available 1`] = ` +
    +
    +
    + + + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / TablePagination no previous / next page 1`] = ` +
    +
    +
    + + + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / TablePagination previous page available 1`] = ` +
    +
    +
    + + + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Timeline default 1`] = ` +
    +
    +
    + +
    +

    + Expansion panel 1 +

    +

    + +

    +
    +
    +
    + +
    +

    + Expansion panel 2 +

    +

    + +

    +
    +
    +
    + +
    +

    + Expansion panel 3 +

    +

    + +

    +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Timeline with expansion panels 1`] = ` +
    +
    +
    + +
    + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + + +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Timeline with order notes 1`] = ` +
    +
    +
    + +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    +

    + admin@example.com +

    +

    + +

    +
    +
    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse +
    + malesuada lacus ex, sit amet blandit leo lobortis eget. +

    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    + ceo@example.com +

    +

    + +

    +
    +
    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse +
    + malesuada lacus ex, sit amet blandit leo lobortis eget. +

    +
    +
    +
    +
    + +
    + + +
    +
    +
    +
    +`; + +exports[`Storyshots Generics / Weight default 1`] = ` +
    +
    +
    + 8.4 kg +
    +
    +
    +`; + +exports[`Storyshots Generics / Weight range from 1`] = ` +
    +
    +
    + from 4.2 kg +
    +
    +
    +`; + +exports[`Storyshots Generics / Weight range range 1`] = ` +
    +
    +
    + 4.2 kg - 81.9 kg +
    +
    +
    +`; + +exports[`Storyshots Generics / Weight range to 1`] = ` +
    +
    +
    + to 81.9 kg +
    +
    +
    +`; + +exports[`Storyshots Navigation / Menu create default 1`] = ` +
    +`; + +exports[`Storyshots Navigation / Menu create loading 1`] = ` +
    +`; + +exports[`Storyshots Navigation / Menu item create default 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderAddressEditDialog billing address 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderAddressEditDialog shipping address 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderBulkCancelDialog default 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderCancelDialog default 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderCustomer default 1`] = ` +
    +
    +
    + + Customer + +
    + +
    +
    +
    +
    +
    +

    + Anonymous user +

    +
    +
    +
    +
    +

    + Contact information +

    +
    + +

    + melissa.simon@example.com +

    +
    +
    +
    +
    +
    +

    + Shipping Address +

    +
    +

    + Melissa Simon +

    +

    + 487 Roberto Shores +
    +

    +

    + 66272 West Patriciastad +

    +

    + Wyspy Salomona +

    +

    +

    +
    +
    +
    +

    + Billing Address +

    +
    +

    + Same as shipping address +

    +
    +
    +
    +`; + +exports[`Storyshots Orders / OrderCustomer editable 1`] = ` +
    +
    +
    + + Customer + +
    + +
    +
    +
    +
    +
    +

    + Anonymous user +

    +
    +
    +
    +
    +

    + Contact information +

    +
    + +

    + melissa.simon@example.com +

    +
    +
    +
    +
    +
    +

    + Shipping Address +

    +
    + +
    +
    +

    + Melissa Simon +

    +

    + 487 Roberto Shores +
    +

    +

    + 66272 West Patriciastad +

    +

    + Wyspy Salomona +

    +

    +

    +
    +
    +
    +

    + Billing Address +

    +
    + +
    +
    +

    + Same as shipping address +

    +
    +
    +
    +`; + +exports[`Storyshots Orders / OrderCustomer loading 1`] = ` +
    +
    +
    + + Customer + +
    + +
    +
    +
    +
    +
    + + ‌ + +
    +
    +
    +
    +

    + Contact information +

    +
    + + ‌ + +
    +
    +
    +
    +

    + Shipping Address +

    +
    + + ‌ + +
    +
    +
    +
    +

    + Billing Address +

    +
    + + ‌ + +
    +
    +
    +`; + +exports[`Storyshots Orders / OrderCustomer with different addresses 1`] = ` +
    +
    +
    + + Customer + +
    + +
    +
    +
    +
    +
    +

    + Anonymous user +

    +
    +
    +
    +
    +

    + Contact information +

    +
    + +

    + melissa.simon@example.com +

    +
    +
    +
    +
    +
    +

    + Shipping Address +

    +
    +

    + Melissa Simon +

    +

    + 487 Roberto Shores +
    +

    +

    + 66272 West Patriciastad +

    +

    + Wyspy Salomona +

    +

    +

    +
    +
    +
    +

    + Billing Address +

    +
    +

    + Melissa Simon +

    +

    + 487 Roberto Shores +
    +

    +

    + 66272 West Patriciastad +

    +

    + Wyspy Salomona +

    +

    +

    +
    +
    +`; + +exports[`Storyshots Orders / OrderCustomerEditDialog default 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderDraftCancelDialog default 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderDraftFinalizeDialog default 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderDraftFinalizeDialog with warnings 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderFulfillmentCancelDialog default 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderFulfillmentDialog default 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderFulfillmentTrackingDialog default 1`] = ` +
    +`; + +exports[`Storyshots Orders / OrderHistory default 1`] = ` +
    +
    +

    + Order History +

    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    +
    +

    + Optional +

    +
    +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this category easier to find +

    +
    +
    +
    +
    + + Subcategories + + + Products + +
    +
    +
    +
    + + All Subcategories + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    + + Category Name + + Subcategories + + No. Products +
    + No subcategories found +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Categories / Update category loading 1`] = ` +
    +
    +
    +
    +
    + + ‌ + +
    +
    +
    +
    +
    + + General information + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + + Description + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Background image (optional) + +
    + + +
    +
    +
    +
    +
    +
    +
    + + ‌ + +
    +
    +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this category easier to find +

    +
    +
    +
    +
    + + Subcategories + + + Products + +
    +
    +
    +
    + + All Subcategories + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + + Category Name + + Subcategories + + No. Products +
    + + + + ‌ + + + + ‌ + + + + ‌ + +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Categories / Update category no background 1`] = ` +
    +
    +
    +
    +
    + Coffees +
    +
    +
    +
    +
    + + General information + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + + Description + +
    + +
    +
    +
    +
    +
    +
    + + + bold + + +
    +
    +
    +
    + + + italic + + +
    +
    +
    +
    + + + strikethrough + + +
    +
    +

    +
    + + + h1 + + +
    +

    +

    +
    + + + h2 + + +
    +

    +

    +
    + + + h3 + + +
    +

    +
    +
    + + + blockquote + + +
    +
    +
      +
    • +
      + + + ul + + +
      +
    • +
    +
      +
    1. +
      + + + ol + + +
      +
    2. +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Background image (optional) + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + Alt text +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +

    + Optional +

    +
    +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this category easier to find +

    +
    +
    +
    +
    + + Subcategories + + + Products + +
    +
    +
    +
    + + All Subcategories + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    + + Category Name + + Subcategories + + No. Products +
    + No subcategories found +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Categories / Update category no products 1`] = ` +
    +
    +
    +
    +
    + Coffees +
    +
    +
    +
    +
    + + General information + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + + Description + +
    + +
    +
    +
    +
    +
    +
    + + + bold + + +
    +
    +
    +
    + + + italic + + +
    +
    +
    +
    + + + strikethrough + + +
    +
    +

    +
    + + + h1 + + +
    +

    +

    +
    + + + h2 + + +
    +

    +

    +
    + + + h3 + + +
    +

    +
    +
    + + + blockquote + + +
    +
    +
      +
    • +
      + + + ul + + +
      +
    • +
    +
      +
    1. +
      + + + ol + + +
      +
    2. +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Background image (optional) + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + Alt text +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +

    + Optional +

    +
    +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this category easier to find +

    +
    +
    +
    +
    + + Subcategories + + + Products + +
    +
    +
    +
    + + Products in Coffees + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + +
    + + + Name + + Type + + Published + + Price +
    + No products found +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Categories / Update category no subcategories 1`] = ` +
    +
    +
    +
    +
    + Coffees +
    +
    +
    +
    +
    + + General information + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + + Description + +
    + +
    +
    +
    +
    +
    +
    + + + bold + + +
    +
    +
    +
    + + + italic + + +
    +
    +
    +
    + + + strikethrough + + +
    +
    +

    +
    + + + h1 + + +
    +

    +

    +
    + + + h2 + + +
    +

    +

    +
    + + + h3 + + +
    +

    +
    +
    + + + blockquote + + +
    +
    +
      +
    • +
      + + + ul + + +
      +
    • +
    +
      +
    1. +
      + + + ol + + +
      +
    2. +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Background image (optional) + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + Alt text +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +

    + Optional +

    +
    +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this category easier to find +

    +
    +
    +
    +
    + + Subcategories + + + Products + +
    +
    +
    +
    + + All Subcategories + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    + + Category Name + + Subcategories + + No. Products +
    + No subcategories found +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Collections / Collection details default 1`] = ` +
    +
    +
    +
    +
    + Summer collection +
    +
    +
    +
    +
    +
    +
    + + General information + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + + Description + +
    + +
    +
    +
    +
    +
    +
    + + + bold + + +
    +
    +
    +
    + + + italic + + +
    +
    +
    +
    + + + strikethrough + + +
    +
    +

    +
    + + + h1 + + +
    +

    +

    +
    + + + h2 + + +
    +

    +

    +
    + + + h3 + + +
    +

    +
    +
    + + + blockquote + + +
    +
    +
      +
    • +
      + + + ul + + +
      +
    • +
    +
      +
    1. +
      + + + ol + + +
      +
    2. +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Background image (optional) + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + Alt text +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +

    + Optional +

    +
    +
    +
    +
    +
    +
    + + Products in Summer collection + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + Name + + Type + + Published +
    + + +
    + +
    +
    + Murray Inc + + Mugs + +
    + Published +
    +
    + +
    + + +
    + +
    +
    + Williams-Taylor + + Coffee + +
    + Published +
    +
    + +
    + + +
    + +
    +
    + Hebert-Sherman + + Coffee + +
    + Published +
    +
    + +
    + + +
    + +
    +
    + Estes, Johnson and Graham + + Books + +
    + Published +
    +
    + +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this collection easier to find +

    +
    +
    +
    +
    +
    +
    +
    + + Visibility + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Collections / Collection details loading 1`] = ` +
    +
    +
    +
    +
    + + ‌ + +
    +
    +
    +
    +
    +
    +
    + + General information + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + + Description + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Background image (optional) + +
    + + +
    +
    +
    +
    +
    +
    +
    + + ‌ + +
    +
    +
    +
    +
    +
    +
    + + + ‌ + + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + Name + + Type + + Published +
    + + +
    + +
    +
    + + ‌ + + + + ‌ + + + + ‌ + + + +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this collection easier to find +

    +
    +
    +
    +
    +
    +
    +
    + + Visibility + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Collections / Collection details no products 1`] = ` +
    +
    +
    +
    +
    + Summer collection +
    +
    +
    +
    +
    +
    +
    + + General information + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + + Description + +
    + +
    +
    +
    +
    +
    +
    + + + bold + + +
    +
    +
    +
    + + + italic + + +
    +
    +
    +
    + + + strikethrough + + +
    +
    +

    +
    + + + h1 + + +
    +

    +

    +
    + + + h2 + + +
    +

    +

    +
    + + + h3 + + +
    +

    +
    +
    + + + blockquote + + +
    +
    +
      +
    • +
      + + + ul + + +
      +
    • +
    +
      +
    1. +
      + + + ol + + +
      +
    2. +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Background image (optional) + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + Alt text +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +

    + Optional +

    +
    +
    +
    +
    +
    +
    + + Products in Summer collection + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    + + Name + + Type + + Published +
    + + No products found +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this collection easier to find +

    +
    +
    +
    +
    +
    +
    +
    + + Visibility + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Collections / Collection list default 1`] = ` +
    +
    +
    +
    + Collections +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + Category Name + + No. Products + + Availability +
    + + + Summer collection + + 4 + +
    + Published +
    +
    + + + Winter sale + + 4 + +
    + Published +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Views / Collections / Collection list loading 1`] = ` +
    +
    +
    +
    + Collections +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + + Category Name + + No. Products + + Availability +
    + + + + ‌ + + + + ‌ + + + + ‌ + +
    +
    +
    +
    +`; + +exports[`Storyshots Views / Collections / Create collection default 1`] = ` +
    +
    +
    +
    +
    + Add collection +
    +
    +
    +
    +
    +
    +
    + + General information + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + + Description + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Background image (optional) + +
    + + +
    +
    +
    +
    +
    +
    + + +

    + Drop here to upload +

    +
    +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this collection easier to find +

    +
    +
    +
    +
    +
    +
    +
    + + Availability + +
    +
    +
    +
    +
    +
    +
    + + Visibility + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Collections / Create collection loading 1`] = ` +
    +
    +
    +
    +
    + Add collection +
    +
    +
    +
    +
    +
    +
    + + General information + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + + Description + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Background image (optional) + +
    + + +
    +
    +
    +
    +
    +
    + + +

    + Drop here to upload +

    +
    +
    +
    +
    +
    +
    + + Search Engine Preview + +
    + +
    +
    +
    +
    +
    +

    + Add search engine title and description to make this collection easier to find +

    +
    +
    +
    +
    +
    +
    +
    + + Availability + +
    +
    +
    +
    +
    +
    +
    + + Visibility + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Configuration default 1`] = ` +
    +
    +
    +
    + Configure +
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Product Types +

    +

    + Define types of products you sell +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Staff Members +

    +

    + Manage your employees and their permissions +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Shipping Methods +

    +

    + Manage how you ship out orders. +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Taxes +

    +

    + Manage how your store charges tax +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Navigation +

    +

    + Define how users can navigate through your store +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Site Settings +

    +

    + View and update your site settings +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Pages +

    +

    + Manage and add additional pages +

    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Views / Configuration partial access 1`] = ` +
    +
    +
    +
    + Configure +
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Product Types +

    +

    + Define types of products you sell +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Taxes +

    +

    + Manage how your store charges tax +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Navigation +

    +

    + Define how users can navigate through your store +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + Pages +

    +

    + Manage and add additional pages +

    +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Views / Customers / Address Book default 1`] = ` +
    +
    +
    +
    + Tom Cooper Address Book +
    +
    + +
    +
    +
    +
    +
    + + Address 1 + + Default Address + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + Elizabeth Vaughn + + + 419 Ruiz Orchard Apt. 199 +
    + 0238 Cremin Freeway +
    + + 52203 Port Danielshire + + + Szwecja + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + Address 2 + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + Timmy Macejkovic + + + 0238 Cremin Freeway +
    +
    + + 15926 West Feliciamouth, Montana + + + Japan + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Views / Customers / Address Book loading 1`] = ` +
    +
    +
    +
    + + ‌ + +
    +
    + +
    +
    +
    +
    +
    + + + ‌ + + +
    +
    + +
    +
    +
    +
    +
    +
    + + ‌ + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +`; + +exports[`Storyshots Views / Customers / Address Book no data 1`] = ` +
    +
    +
    +
    + There is no address to show for this customer +
    +

    + This customer doesn’t have any adresses added to his address book. You can add address using the button below. +

    + +
    +
    +
    +`; + +exports[`Storyshots Views / Customers / Create customer default 1`] = ` +
    +
    +
    +
    +
    + Add customer +
    +
    +
    +
    +
    +
    +
    + + Customer overview + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + Primary address + +
    +
    +
    +
    +
    +

    + The primary address of this customer. +

    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + Notes + +
    +
    +
    +
    +
    +

    + Enter any extra infotmation regarding this customer. +

    +
    +
    + +
    +
    + + +
    +
    +

    + Optional +

    +
    +
    +
    +
    +
    +
    +
    + + Photo View + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +`; + +exports[`Storyshots Views / Products / Product image details when loading data 1`] = ` +
    +
    +
    +
    +
    + Edit Photo +
    +
    +
    +
    +
    +
    +
    + + All photos + +
    +
    +
    +
    +
    + + ‌ + +
    +
    +
    +
    + + Photo Information + +
    +
    +
    +
    +
    +
    + +
    +
    +

    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

Gc!ezF$4+$_?2Io*t5&QvgC1uKzlD* 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�T8FclJ>p$RFpi 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

5$LUJ1M;|* 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%0A*-@(_?-OQEB`uwA3Qq3{{Q&}{J(q!|48Fp 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�EY!+PYB($dMn8FY& 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 OPfzQqW~Dkb^nU;dm(|Mv literal 0 HcmV?d00001 diff --git a/assets/images/avatars/avatar12.png b/assets/images/avatars/avatar12.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b16999722e31097e8e26807812e01ca336efa4 GIT binary patch literal 133438 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