Showing preview only (4,356K chars total). Download the full file or copy to clipboard to get everything.
Repository: evershopcommerce/evershop
Branch: dev
Commit: c4a8ff42a1d3
Files: 1781
Total size: 3.7 MB
Directory structure:
gitextract_6d_loyql/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── pull_request_template.md
│ └── workflows/
│ └── build_test.yml
├── .gitignore
├── .husky/
│ └── pre-commit
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── changelog.md
├── docker-compose.yml
├── eslint.config.js
├── jest.config.js
├── package.json
├── packages/
│ ├── create-evershop-app/
│ │ ├── README.md
│ │ ├── createEverShopApp.js
│ │ ├── index.js
│ │ ├── package.json
│ │ └── sample/
│ │ └── themes/
│ │ └── sample/
│ │ ├── dist/
│ │ │ └── pages/
│ │ │ ├── all/
│ │ │ │ ├── EveryWhere.d.ts
│ │ │ │ ├── EveryWhere.js
│ │ │ │ └── EveryWhere.js.map
│ │ │ └── homepage/
│ │ │ ├── OnlyHomePage.d.ts
│ │ │ ├── OnlyHomePage.js
│ │ │ └── OnlyHomePage.js.map
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── pages/
│ │ │ ├── all/
│ │ │ │ └── EveryWhere.tsx
│ │ │ └── homepage/
│ │ │ └── OnlyHomePage.tsx
│ │ └── tsconfig.json
│ ├── evershop/
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ ├── postpack.js
│ │ │ ├── postpublish.js
│ │ │ └── prepublish.js
│ │ ├── src/
│ │ │ ├── bin/
│ │ │ │ ├── build/
│ │ │ │ │ ├── client/
│ │ │ │ │ │ └── index.js
│ │ │ │ │ ├── complie.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── initEnvBuild.ts
│ │ │ │ │ └── server/
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── useDDL.js
│ │ │ │ │ └── useVendorChunk.js
│ │ │ │ ├── dev/
│ │ │ │ │ ├── compileTs.js
│ │ │ │ │ ├── enableWatcher.js
│ │ │ │ │ ├── hooks.js
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── init.ts
│ │ │ │ │ ├── initEnvDev.ts
│ │ │ │ │ └── register.js
│ │ │ │ ├── evershop.js
│ │ │ │ ├── extension/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── install/
│ │ │ │ │ ├── createMigrationTable.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── templates/
│ │ │ │ │ └── config.json
│ │ │ │ ├── lib/
│ │ │ │ │ ├── addDefaultMiddlewareFuncs.ts
│ │ │ │ │ ├── app.js
│ │ │ │ │ ├── bootstrap/
│ │ │ │ │ │ ├── bootstrap.ts
│ │ │ │ │ │ └── migrate.js
│ │ │ │ │ ├── buildEntry.js
│ │ │ │ │ ├── devEnvHelper.ts
│ │ │ │ │ ├── loadModules.js
│ │ │ │ │ ├── normalizePort.js
│ │ │ │ │ ├── onError.js
│ │ │ │ │ ├── onListening.js
│ │ │ │ │ ├── prepare.js
│ │ │ │ │ ├── startCronProcess.ts
│ │ │ │ │ ├── startSubscriberProcess.ts
│ │ │ │ │ ├── startUp.js
│ │ │ │ │ └── watch/
│ │ │ │ │ ├── broadcast.js
│ │ │ │ │ ├── compileSwc.ts
│ │ │ │ │ ├── effect.ts
│ │ │ │ │ ├── getDistPaths.ts
│ │ │ │ │ ├── getRootPaths.ts
│ │ │ │ │ ├── getSrcPaths.ts
│ │ │ │ │ ├── isDist.js
│ │ │ │ │ ├── isRestartRequired.ts
│ │ │ │ │ ├── isSrc.js
│ │ │ │ │ ├── processors/
│ │ │ │ │ │ ├── addAdminRoute.ts
│ │ │ │ │ │ ├── addApiRoute.ts
│ │ │ │ │ │ ├── addComponent.ts
│ │ │ │ │ │ ├── addFrontStoreRoute.ts
│ │ │ │ │ │ ├── addMiddleware.ts
│ │ │ │ │ │ ├── deleteARoute.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── removeMiddleware.ts
│ │ │ │ │ │ ├── restart.ts
│ │ │ │ │ │ ├── restartCronJob.ts
│ │ │ │ │ │ ├── restartSubscriber.ts
│ │ │ │ │ │ ├── touch.js
│ │ │ │ │ │ ├── updateAdminRoute.ts
│ │ │ │ │ │ ├── updateApiRoute.ts
│ │ │ │ │ │ └── updateFrontStoreRoute.ts
│ │ │ │ │ └── watchHandler.ts
│ │ │ │ ├── seed/
│ │ │ │ │ ├── data/
│ │ │ │ │ │ ├── attributes.json
│ │ │ │ │ │ ├── categories.json
│ │ │ │ │ │ ├── collections.json
│ │ │ │ │ │ ├── pages.json
│ │ │ │ │ │ ├── products.json
│ │ │ │ │ │ └── widgets.json
│ │ │ │ │ ├── imageDownloader.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── initEnvDev.ts
│ │ │ │ │ ├── seedAttributes.ts
│ │ │ │ │ ├── seedCategories.ts
│ │ │ │ │ ├── seedCollections.ts
│ │ │ │ │ ├── seedImages.ts
│ │ │ │ │ ├── seedPages.ts
│ │ │ │ │ ├── seedProducts.ts
│ │ │ │ │ ├── seedWidgets.ts
│ │ │ │ │ └── variantGroupHelpers.ts
│ │ │ │ ├── start/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── initEnvStart.ts
│ │ │ │ ├── theme/
│ │ │ │ │ ├── active.ts
│ │ │ │ │ ├── create.ts
│ │ │ │ │ └── twizz.ts
│ │ │ │ └── user/
│ │ │ │ ├── changePassword.js
│ │ │ │ └── create.js
│ │ │ ├── components/
│ │ │ │ ├── admin/
│ │ │ │ │ ├── AttributeGroupSelector.tsx
│ │ │ │ │ ├── CategorySelector.tsx
│ │ │ │ │ ├── CategoryTree.scss
│ │ │ │ │ ├── CategoryTree.tsx
│ │ │ │ │ ├── CollectionSelector.tsx
│ │ │ │ │ ├── FileBrowser.scss
│ │ │ │ │ ├── FileBrowser.tsx
│ │ │ │ │ ├── FormButtons.tsx
│ │ │ │ │ ├── ImageUploader.scss
│ │ │ │ │ ├── ImageUploader.tsx
│ │ │ │ │ ├── ImageUploaderSkeleton.tsx
│ │ │ │ │ ├── NavigationItem.scss
│ │ │ │ │ ├── NavigationItem.tsx
│ │ │ │ │ ├── NavigationItemGroup.scss
│ │ │ │ │ ├── NavigationItemGroup.tsx
│ │ │ │ │ ├── PageHeading.scss
│ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ ├── ProductListSkeleton.tsx
│ │ │ │ │ ├── ProductSelector.tsx
│ │ │ │ │ ├── SettingMenu.tsx
│ │ │ │ │ ├── Spinner.jsx
│ │ │ │ │ ├── Status.tsx
│ │ │ │ │ └── grid/
│ │ │ │ │ ├── GridPagination.tsx
│ │ │ │ │ ├── Thumbnail.tsx
│ │ │ │ │ └── header/
│ │ │ │ │ ├── Dummy.tsx
│ │ │ │ │ └── Sortable.tsx
│ │ │ │ ├── common/
│ │ │ │ │ ├── Area.tsx
│ │ │ │ │ ├── Editor.scss
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── ExtendableTable.tsx
│ │ │ │ │ ├── Image.tsx
│ │ │ │ │ ├── Link.tsx
│ │ │ │ │ ├── LoadingBar.scss
│ │ │ │ │ ├── LoadingBar.tsx
│ │ │ │ │ ├── Meta.tsx
│ │ │ │ │ ├── Notification.scss
│ │ │ │ │ ├── Notification.tsx
│ │ │ │ │ ├── ProductNoThumbnail.tsx
│ │ │ │ │ ├── RenderIfTrue.tsx
│ │ │ │ │ ├── Script.tsx
│ │ │ │ │ ├── SimplePagination.tsx
│ │ │ │ │ ├── StaticImage.tsx
│ │ │ │ │ ├── Title.tsx
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── app.tsx
│ │ │ │ │ ├── customer/
│ │ │ │ │ │ └── address/
│ │ │ │ │ │ └── AddressSummary.jsx
│ │ │ │ │ ├── form/
│ │ │ │ │ │ ├── CheckboxField.tsx
│ │ │ │ │ │ ├── DateField.tsx
│ │ │ │ │ │ ├── DateTimeLocalField.tsx
│ │ │ │ │ │ ├── Editor.scss
│ │ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ │ ├── EmailField.tsx
│ │ │ │ │ │ ├── FileField.tsx
│ │ │ │ │ │ ├── Form.tsx
│ │ │ │ │ │ ├── InputField.tsx
│ │ │ │ │ │ ├── NumberField.tsx
│ │ │ │ │ │ ├── PasswordField.tsx
│ │ │ │ │ │ ├── RadioGroupField.tsx
│ │ │ │ │ │ ├── RangeField.tsx
│ │ │ │ │ │ ├── ReactSelectCreatableField.tsx
│ │ │ │ │ │ ├── ReactSelectField.tsx
│ │ │ │ │ │ ├── SelectField.tsx
│ │ │ │ │ │ ├── TelField.tsx
│ │ │ │ │ │ ├── TextareaField.tsx
│ │ │ │ │ │ ├── TimeField.tsx
│ │ │ │ │ │ ├── ToggleField.tsx
│ │ │ │ │ │ ├── Tooltip.tsx
│ │ │ │ │ │ ├── UrlField.tsx
│ │ │ │ │ │ ├── editor/
│ │ │ │ │ │ │ ├── GetColumnClasses.tsx
│ │ │ │ │ │ │ ├── GetRowClasses.tsx
│ │ │ │ │ │ │ ├── RawToolWrapper.ts
│ │ │ │ │ │ │ └── RowTemplates.tsx
│ │ │ │ │ │ └── utils/
│ │ │ │ │ │ └── getNestedError.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── locale/
│ │ │ │ │ │ ├── CountryOption.jsx
│ │ │ │ │ │ ├── CurrencyOption.jsx
│ │ │ │ │ │ ├── LanguageOption.jsx
│ │ │ │ │ │ ├── ProvinceOption.jsx
│ │ │ │ │ │ └── TimezoneOption.jsx
│ │ │ │ │ ├── modal/
│ │ │ │ │ │ ├── Alert.jsx
│ │ │ │ │ │ └── Alert.scss
│ │ │ │ │ ├── react/
│ │ │ │ │ │ ├── Head.jsx
│ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ ├── Client.tsx
│ │ │ │ │ │ │ ├── HotReload.tsx
│ │ │ │ │ │ │ ├── Hydrate.tsx
│ │ │ │ │ │ │ ├── HydrateAdmin.tsx
│ │ │ │ │ │ │ ├── HydrateFrontStore.tsx
│ │ │ │ │ │ │ └── Index.jsx
│ │ │ │ │ │ ├── getComponents.js
│ │ │ │ │ │ └── server/
│ │ │ │ │ │ ├── Server.tsx
│ │ │ │ │ │ └── render.tsx
│ │ │ │ │ └── ui/
│ │ │ │ │ ├── Accordion.tsx
│ │ │ │ │ ├── Alert.tsx
│ │ │ │ │ ├── AlertDialog.tsx
│ │ │ │ │ ├── AspectRatio.tsx
│ │ │ │ │ ├── Avatar.tsx
│ │ │ │ │ ├── Badge.tsx
│ │ │ │ │ ├── Breadcrumb.tsx
│ │ │ │ │ ├── Button.tsx
│ │ │ │ │ ├── ButtonGroup.tsx
│ │ │ │ │ ├── Card.tsx
│ │ │ │ │ ├── Chart.tsx
│ │ │ │ │ ├── Checkbox.tsx
│ │ │ │ │ ├── Circle.tsx
│ │ │ │ │ ├── Collapsible.tsx
│ │ │ │ │ ├── ContextMenu.tsx
│ │ │ │ │ ├── Dialog.tsx
│ │ │ │ │ ├── DropdownMenu.tsx
│ │ │ │ │ ├── Empty.tsx
│ │ │ │ │ ├── Field.tsx
│ │ │ │ │ ├── HoverCard.tsx
│ │ │ │ │ ├── Input.tsx
│ │ │ │ │ ├── InputGroup.tsx
│ │ │ │ │ ├── Item.tsx
│ │ │ │ │ ├── Kbd.tsx
│ │ │ │ │ ├── Label.tsx
│ │ │ │ │ ├── Menubar.tsx
│ │ │ │ │ ├── NavigationMenu.tsx
│ │ │ │ │ ├── Pagination.tsx
│ │ │ │ │ ├── Popover.tsx
│ │ │ │ │ ├── Progress.tsx
│ │ │ │ │ ├── RadioGroup.tsx
│ │ │ │ │ ├── ScrollArea.tsx
│ │ │ │ │ ├── Select.tsx
│ │ │ │ │ ├── Separator.tsx
│ │ │ │ │ ├── Sheet.tsx
│ │ │ │ │ ├── Sidebar.tsx
│ │ │ │ │ ├── Skeleton.tsx
│ │ │ │ │ ├── Slider.tsx
│ │ │ │ │ ├── Spinner.tsx
│ │ │ │ │ ├── Switch.tsx
│ │ │ │ │ ├── Table.tsx
│ │ │ │ │ ├── Tabs.tsx
│ │ │ │ │ ├── Textarea.tsx
│ │ │ │ │ ├── Toggle.tsx
│ │ │ │ │ ├── ToggleGroup.tsx
│ │ │ │ │ ├── Tooltip.tsx
│ │ │ │ │ └── hooks/
│ │ │ │ │ └── useIsMobile.tsx
│ │ │ │ └── frontStore/
│ │ │ │ ├── Coupon.tsx
│ │ │ │ ├── CouponForm.tsx
│ │ │ │ ├── Footer.tsx
│ │ │ │ ├── Header.scss
│ │ │ │ ├── Header.tsx
│ │ │ │ ├── Og.tsx
│ │ │ │ ├── Pagination.tsx
│ │ │ │ ├── cart/
│ │ │ │ │ ├── AddToCart.tsx
│ │ │ │ │ ├── CartContext.tsx
│ │ │ │ │ ├── CartItems.tsx
│ │ │ │ │ ├── CartSummaryItems.tsx
│ │ │ │ │ ├── CartTotalSummary.tsx
│ │ │ │ │ ├── DefaultCartItemList.tsx
│ │ │ │ │ ├── DefaultMiniCartDropdown.tsx
│ │ │ │ │ ├── DefaultMiniCartDropdownEmpty.tsx
│ │ │ │ │ ├── DefaultMiniCartIcon.tsx
│ │ │ │ │ ├── DefaultMiniCartItemList.tsx
│ │ │ │ │ ├── DefaultMinicartDropdownSummary.tsx
│ │ │ │ │ ├── ItemQuantity.tsx
│ │ │ │ │ ├── MiniCart.tsx
│ │ │ │ │ └── ShoppingCartEmpty.tsx
│ │ │ │ ├── catalog/
│ │ │ │ │ ├── CategoryContext.tsx
│ │ │ │ │ ├── CategoryInfo.tsx
│ │ │ │ │ ├── CategoryProducts.tsx
│ │ │ │ │ ├── CategoryProductsFilter.tsx
│ │ │ │ │ ├── CategoryProductsPagination.tsx
│ │ │ │ │ ├── DefaultAttributeFilterRender.tsx
│ │ │ │ │ ├── DefaultCategoryFilterRender.tsx
│ │ │ │ │ ├── DefaultFilterWrapperRender.tsx
│ │ │ │ │ ├── DefaultPriceFilterRender.tsx
│ │ │ │ │ ├── DefaultProductFilterRender.tsx
│ │ │ │ │ ├── DefaultProductFilterSummary.tsx
│ │ │ │ │ ├── DefaultVariantSelectorRender.tsx
│ │ │ │ │ ├── Media.scss
│ │ │ │ │ ├── Media.tsx
│ │ │ │ │ ├── ProductContext.tsx
│ │ │ │ │ ├── ProductFilter.tsx
│ │ │ │ │ ├── ProductList.tsx
│ │ │ │ │ ├── ProductListEmptyRender.tsx
│ │ │ │ │ ├── ProductListItemRender.tsx
│ │ │ │ │ ├── ProductListLoadingSkeleton.tsx
│ │ │ │ │ ├── ProductSingleAttributes.tsx
│ │ │ │ │ ├── ProductSingleDescription.tsx
│ │ │ │ │ ├── ProductSingleForm.tsx
│ │ │ │ │ ├── ProductSingleName.tsx
│ │ │ │ │ ├── ProductSingleSku.tsx
│ │ │ │ │ ├── ProductSorting.tsx
│ │ │ │ │ ├── SearchBox.tsx
│ │ │ │ │ ├── SearchContext.tsx
│ │ │ │ │ ├── SearchInfo.tsx
│ │ │ │ │ ├── SearchProducts.tsx
│ │ │ │ │ ├── SearchProductsPagination.tsx
│ │ │ │ │ └── VariantSelector.tsx
│ │ │ │ ├── checkout/
│ │ │ │ │ ├── CheckoutButton.tsx
│ │ │ │ │ ├── CheckoutContext.tsx
│ │ │ │ │ ├── ContactInformation.tsx
│ │ │ │ │ ├── OrderSummaryItems.tsx
│ │ │ │ │ ├── OrderTotalSummary.tsx
│ │ │ │ │ ├── Payment.tsx
│ │ │ │ │ ├── Shipment.tsx
│ │ │ │ │ ├── payment/
│ │ │ │ │ │ ├── BillingAddress.tsx
│ │ │ │ │ │ └── PaymentMethods.tsx
│ │ │ │ │ └── shipment/
│ │ │ │ │ └── ShippingMethods.tsx
│ │ │ │ └── customer/
│ │ │ │ ├── AccountInfo.tsx
│ │ │ │ ├── CustomerContext.tsx
│ │ │ │ ├── LoginForm.tsx
│ │ │ │ ├── MyAddresses.tsx
│ │ │ │ ├── OrderHistory.tsx
│ │ │ │ ├── RegistrationForm.tsx
│ │ │ │ ├── ResetPasswordForm.tsx
│ │ │ │ └── address/
│ │ │ │ └── addressForm/
│ │ │ │ ├── AddressForm.tsx
│ │ │ │ ├── AddressFormLoadingSkeleton.scss
│ │ │ │ ├── AddressFormLoadingSkeleton.tsx
│ │ │ │ ├── Index.tsx
│ │ │ │ ├── NameAndTelephone.tsx
│ │ │ │ └── ProvinceAndPostcode.tsx
│ │ │ ├── lib/
│ │ │ │ ├── babel/
│ │ │ │ │ ├── config.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── componee/
│ │ │ │ │ ├── getComponentsByRoute.ts
│ │ │ │ │ ├── scanForComponents.ts
│ │ │ │ │ ├── scanForRootComponents.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ └── unit/
│ │ │ │ │ ├── __mocks__/
│ │ │ │ │ │ ├── modules/
│ │ │ │ │ │ │ ├── firstModule/
│ │ │ │ │ │ │ │ └── pages/
│ │ │ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ │ │ └── Menu.js
│ │ │ │ │ │ │ │ └── productView/
│ │ │ │ │ │ │ │ ├── Name.js
│ │ │ │ │ │ │ │ └── Price.js
│ │ │ │ │ │ │ └── secondModule/
│ │ │ │ │ │ │ └── pages/
│ │ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ │ └── Banner.js
│ │ │ │ │ │ │ └── productView/
│ │ │ │ │ │ │ ├── Description.js
│ │ │ │ │ │ │ ├── Inventory.js
│ │ │ │ │ │ │ └── Name.js
│ │ │ │ │ │ └── themes/
│ │ │ │ │ │ └── justatheme/
│ │ │ │ │ │ └── pages/
│ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ ├── CommentList.js
│ │ │ │ │ │ │ └── Shipping.js
│ │ │ │ │ │ └── productView/
│ │ │ │ │ │ ├── Name.js
│ │ │ │ │ │ ├── OutOfStock.js
│ │ │ │ │ │ └── Price.js
│ │ │ │ │ └── scanRouteComponents.test.js
│ │ │ │ ├── cronjob/
│ │ │ │ │ ├── cronjob.ts
│ │ │ │ │ ├── jobManager.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ └── unit/
│ │ │ │ │ └── jobManager.test.js
│ │ │ │ ├── event/
│ │ │ │ │ ├── callSubscibers.js
│ │ │ │ │ ├── emitter.ts
│ │ │ │ │ ├── event-manager.js
│ │ │ │ │ ├── loadSubscribers.js
│ │ │ │ │ └── subscriber.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── locale/
│ │ │ │ │ ├── countries.ts
│ │ │ │ │ ├── currencies.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── provinces.ts
│ │ │ │ │ ├── timezones.ts
│ │ │ │ │ └── translate/
│ │ │ │ │ ├── _.ts
│ │ │ │ │ └── translate.ts
│ │ │ │ ├── log/
│ │ │ │ │ ├── CustomColorize.js
│ │ │ │ │ └── logger.js
│ │ │ │ ├── mail/
│ │ │ │ │ └── emailHelper.ts
│ │ │ │ ├── middleware/
│ │ │ │ │ ├── Handler.js
│ │ │ │ │ ├── addMiddleware.js
│ │ │ │ │ ├── buildMiddlewareFunction.js
│ │ │ │ │ ├── delegate.ts
│ │ │ │ │ ├── eNext.js
│ │ │ │ │ ├── findDublicatedMiddleware.js
│ │ │ │ │ ├── getRouteFromPath.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── isErrorHandlerTriggered.js
│ │ │ │ │ ├── isNextRequired.js
│ │ │ │ │ ├── noDuplicateId.js
│ │ │ │ │ ├── parseFromFile.js
│ │ │ │ │ ├── scanForMiddlewareFunctions.js
│ │ │ │ │ ├── sort.js
│ │ │ │ │ └── tests/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ ├── app.js
│ │ │ │ │ │ └── modules/
│ │ │ │ │ │ ├── 404page/
│ │ │ │ │ │ │ └── pages/
│ │ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ │ └── product/
│ │ │ │ │ │ │ ├── [loadProduct]loadCategory.js
│ │ │ │ │ │ │ ├── [loadProduct]loadProductImage.js
│ │ │ │ │ │ │ ├── loadProduct.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── api/
│ │ │ │ │ │ │ └── api/
│ │ │ │ │ │ │ ├── createA/
│ │ │ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ └── global/
│ │ │ │ │ │ │ └── apiGlobal.js
│ │ │ │ │ │ ├── authcopy/
│ │ │ │ │ │ │ ├── api/
│ │ │ │ │ │ │ │ ├── createA/
│ │ │ │ │ │ │ │ │ └── [index]afterIndex.js
│ │ │ │ │ │ │ │ └── global/
│ │ │ │ │ │ │ │ ├── [context]auth.js
│ │ │ │ │ │ │ │ └── apiAuthGlobal.js
│ │ │ │ │ │ │ └── pages/
│ │ │ │ │ │ │ └── global/
│ │ │ │ │ │ │ └── [context]auth.js
│ │ │ │ │ │ ├── basecopy/
│ │ │ │ │ │ │ ├── api/
│ │ │ │ │ │ │ │ └── global/
│ │ │ │ │ │ │ │ ├── [apiResponse]apiErrorHandler.js
│ │ │ │ │ │ │ │ ├── [auth]apiResponse[apiErrorHandler].js
│ │ │ │ │ │ │ │ ├── [auth]payloadValidate.js
│ │ │ │ │ │ │ │ ├── [payloadValidate]escapeHtml.js
│ │ │ │ │ │ │ │ └── context.js
│ │ │ │ │ │ │ └── pages/
│ │ │ │ │ │ │ ├── admin/
│ │ │ │ │ │ │ │ ├── adminStaticAsset/
│ │ │ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ │ │ └── staticAssets.js
│ │ │ │ │ │ │ │ └── all/
│ │ │ │ │ │ │ │ └── adminTitle.js
│ │ │ │ │ │ │ ├── frontStore/
│ │ │ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ │ │ └── title.js
│ │ │ │ │ │ │ │ ├── notFound/
│ │ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ │ └── staticAsset/
│ │ │ │ │ │ │ │ ├── [context]staticAssets[auth].js
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ └── global/
│ │ │ │ │ │ │ ├── [auth]notFound[response].js
│ │ │ │ │ │ │ ├── [notFound]dummy[response].js
│ │ │ │ │ │ │ ├── [response]errorHandler.js
│ │ │ │ │ │ │ ├── context.js
│ │ │ │ │ │ │ └── response[errorHandler].js
│ │ │ │ │ │ ├── delegate/
│ │ │ │ │ │ │ └── pages/
│ │ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ │ └── delegateTest/
│ │ │ │ │ │ │ ├── asyncWithNext[collection].js
│ │ │ │ │ │ │ ├── async[collection].js
│ │ │ │ │ │ │ ├── collection.js
│ │ │ │ │ │ │ ├── returnOne[returnTwo].js
│ │ │ │ │ │ │ ├── returnThree[collection].js
│ │ │ │ │ │ │ ├── returnTwo[returnThree].js
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ ├── syncOne.js
│ │ │ │ │ │ │ ├── syncWithNext[collection].js
│ │ │ │ │ │ │ └── sync[collection].js
│ │ │ │ │ │ ├── error/
│ │ │ │ │ │ │ └── pages/
│ │ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ │ └── errorHandlerTest/
│ │ │ │ │ │ │ ├── errorInAsync.js
│ │ │ │ │ │ │ ├── errorInAsyncWithNext.js
│ │ │ │ │ │ │ ├── errorInSync.js
│ │ │ │ │ │ │ ├── errorInSyncWithNext.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── graphqlcopy/
│ │ │ │ │ │ │ └── pages/
│ │ │ │ │ │ │ └── global/
│ │ │ │ │ │ │ ├── [bodyParser]buildQuery[graphql].js
│ │ │ │ │ │ │ ├── [buildQuery]graphql[notFound].js
│ │ │ │ │ │ │ └── bodyParser[buildQuery].js
│ │ │ │ │ │ └── handler/
│ │ │ │ │ │ └── pages/
│ │ │ │ │ │ ├── admin/
│ │ │ │ │ │ │ └── productEdit/
│ │ │ │ │ │ │ ├── [loadProduct]loadCategory.js
│ │ │ │ │ │ │ ├── [loadProduct]loadProductImage.js
│ │ │ │ │ │ │ ├── loadProduct.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ └── middleware/
│ │ │ │ │ │ ├── [loadAttribute]loadOptions.js
│ │ │ │ │ │ ├── [loadProductImage]loadAttribute.js
│ │ │ │ │ │ ├── [loadProduct]loadCategory.js
│ │ │ │ │ │ ├── [loadProduct]loadProductImage.js
│ │ │ │ │ │ ├── [syncOne,asyncOne]checkExecutionOrderAsync[loadAttribute].js
│ │ │ │ │ │ ├── [syncOne,asyncOne]checkExecutionOrder[loadAttribute].js
│ │ │ │ │ │ ├── asyncOne[loadAttribute].js
│ │ │ │ │ │ ├── loadProduct[loadAttribute].js
│ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ └── syncOne[loadAttribute].js
│ │ │ │ │ └── unit/
│ │ │ │ │ ├── 404page.handling.test.js
│ │ │ │ │ ├── 500error.handling.test.js
│ │ │ │ │ ├── apiHandler.middleware.test.js
│ │ │ │ │ ├── delegate.test.js
│ │ │ │ │ ├── handler.getMiddlewaresByRoute.test.js
│ │ │ │ │ ├── handlers.middleware.test.js
│ │ │ │ │ ├── middleware.buildMiddlewareFunction.test.js
│ │ │ │ │ ├── middleware.getRouteFromPath.test.js
│ │ │ │ │ ├── middleware.noDublicateId.test.js
│ │ │ │ │ └── middleware.scanForMiddlewareFunctions.test.js
│ │ │ │ ├── middlewares/
│ │ │ │ │ ├── bodyJson.ts
│ │ │ │ │ ├── multerNone.ts
│ │ │ │ │ ├── publicStatic.ts
│ │ │ │ │ ├── static.ts
│ │ │ │ │ └── themePublicStatic.ts
│ │ │ │ ├── pathToRegexp.js
│ │ │ │ ├── postgres/
│ │ │ │ │ └── connection.ts
│ │ │ │ ├── response/
│ │ │ │ │ └── render.ts
│ │ │ │ ├── router/
│ │ │ │ │ ├── Router.js
│ │ │ │ │ ├── buildAbsoluteUrl.ts
│ │ │ │ │ ├── buildUrl.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── loadModuleRoutes.js
│ │ │ │ │ ├── registerAdminRoute.js
│ │ │ │ │ ├── registerFrontStoreRoute.js
│ │ │ │ │ ├── scanForRoutes.js
│ │ │ │ │ ├── sortRoutes.js
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── unit/
│ │ │ │ │ │ ├── a/
│ │ │ │ │ │ │ ├── invalidMethod/
│ │ │ │ │ │ │ │ └── routeOne/
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ └── invalidPath/
│ │ │ │ │ │ │ └── routeTwo/
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── b/
│ │ │ │ │ │ │ ├── routeOne/
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── routeThree/
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ └── routeTwo/
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── unit.scanForRoutes.test.js
│ │ │ │ │ │ └── unit.validateRoute.test.js
│ │ │ │ │ └── validateRoute.js
│ │ │ │ ├── util/
│ │ │ │ │ ├── assign.js
│ │ │ │ │ ├── buildFilterFromUrl.ts
│ │ │ │ │ ├── camelCase.ts
│ │ │ │ │ ├── cn.ts
│ │ │ │ │ ├── defaultPaginationFilters.js
│ │ │ │ │ ├── events.ts
│ │ │ │ │ ├── filterOperationMap.ts
│ │ │ │ │ ├── formToJson.js
│ │ │ │ │ ├── get.ts
│ │ │ │ │ ├── getBaseUrl.ts
│ │ │ │ │ ├── getConfig.ts
│ │ │ │ │ ├── getEnabledTheme.ts
│ │ │ │ │ ├── getEnv.ts
│ │ │ │ │ ├── hookable.ts
│ │ │ │ │ ├── httpStatus.ts
│ │ │ │ │ ├── isAjax.ts
│ │ │ │ │ ├── isDevelopmentMode.ts
│ │ │ │ │ ├── isPlainObject.ts
│ │ │ │ │ ├── isProductionMode.ts
│ │ │ │ │ ├── isResolvable.ts
│ │ │ │ │ ├── jsonParse.ts
│ │ │ │ │ ├── jwt.ts
│ │ │ │ │ ├── keyGenerator.ts
│ │ │ │ │ ├── merge.js
│ │ │ │ │ ├── parseImageSizes.ts
│ │ │ │ │ ├── passwordHelper.ts
│ │ │ │ │ ├── preloadScan.ts
│ │ │ │ │ ├── readCsvFile.ts
│ │ │ │ │ ├── registry.ts
│ │ │ │ │ ├── sanitizeHtml.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── unit/
│ │ │ │ │ │ ├── util.assign.test.js
│ │ │ │ │ │ ├── util.get.test.js
│ │ │ │ │ │ ├── util.getConfig.test.js
│ │ │ │ │ │ ├── util.hookable.test.js
│ │ │ │ │ │ ├── util.jwt.test.js
│ │ │ │ │ │ ├── util.merge.test.js
│ │ │ │ │ │ ├── util.parseImageSizes.test.js
│ │ │ │ │ │ ├── util.preloadScan.test.js
│ │ │ │ │ │ └── util.registry.test.js
│ │ │ │ │ ├── validateConfiguration.js
│ │ │ │ │ └── validator.ts
│ │ │ │ ├── webpack/
│ │ │ │ │ ├── createBaseConfig.js
│ │ │ │ │ ├── dev/
│ │ │ │ │ │ └── createConfigClient.js
│ │ │ │ │ ├── getRouteBuildPath.js
│ │ │ │ │ ├── getRouteBuildSubPath.js
│ │ │ │ │ ├── isBuildRequired.ts
│ │ │ │ │ ├── loaders/
│ │ │ │ │ │ ├── AreaLoader.js
│ │ │ │ │ │ ├── GraphQLAPILoader.js
│ │ │ │ │ │ ├── GraphqlLoader.js
│ │ │ │ │ │ ├── LayoutLoader.js
│ │ │ │ │ │ ├── StyleLoader.js
│ │ │ │ │ │ ├── TailwindLoader.js
│ │ │ │ │ │ ├── TranslationLoader.js
│ │ │ │ │ │ └── loadTranslationFromCsv.ts
│ │ │ │ │ ├── plugins/
│ │ │ │ │ │ ├── FileListPlugin.js
│ │ │ │ │ │ ├── GraphqlPlugin.js
│ │ │ │ │ │ ├── InjectTailwindSources.ts
│ │ │ │ │ │ ├── Tailwindcss.ts
│ │ │ │ │ │ └── ThemeWatcherPlugin.ts
│ │ │ │ │ ├── prod/
│ │ │ │ │ │ ├── createConfigClient.js
│ │ │ │ │ │ └── createConfigServer.js
│ │ │ │ │ ├── resolveAlias.js
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── unit/
│ │ │ │ │ │ ├── resolveAlias.test.js
│ │ │ │ │ │ └── theme/
│ │ │ │ │ │ └── components/
│ │ │ │ │ │ ├── a/
│ │ │ │ │ │ │ ├── A.jsx
│ │ │ │ │ │ │ └── a.scss
│ │ │ │ │ │ └── b/
│ │ │ │ │ │ ├── B.jsx
│ │ │ │ │ │ ├── B.scss
│ │ │ │ │ │ └── bb/
│ │ │ │ │ │ └── BB.jsx
│ │ │ │ │ └── util/
│ │ │ │ │ ├── getTailwindConfig.js
│ │ │ │ │ ├── getTailwindSources.ts
│ │ │ │ │ ├── parseGraphql.js
│ │ │ │ │ └── parseGraphqlByFile.js
│ │ │ │ └── widget/
│ │ │ │ ├── tests/
│ │ │ │ │ └── unit/
│ │ │ │ │ └── widgetManager.test.js
│ │ │ │ └── widgetManager.ts
│ │ │ ├── modules/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── getUserToken/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── generateToken.ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── global/
│ │ │ │ │ │ │ ├── [context]getCurrentUser.ts
│ │ │ │ │ │ │ ├── [context]jwtUserAuth[getCurrentUser].ts
│ │ │ │ │ │ │ ├── [getCurrentUser]auth.ts
│ │ │ │ │ │ │ └── [getCurrentUser]demoAccountBlocking[auth].ts
│ │ │ │ │ │ └── refreshUserToken/
│ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ ├── refreshToken.ts
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── bootstrap.js
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ └── AdminUser/
│ │ │ │ │ │ ├── AdminUser.admin.graphql
│ │ │ │ │ │ └── AdminUser.admin.resolvers.js
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ ├── Version-1.0.0.js
│ │ │ │ │ │ └── Version-1.0.1.js
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ └── admin/
│ │ │ │ │ │ ├── adminLogin/
│ │ │ │ │ │ │ ├── LoginForm.scss
│ │ │ │ │ │ │ ├── LoginForm.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── adminLoginJson/
│ │ │ │ │ │ │ ├── [bodyParser]logIn.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── adminLogoutJson/
│ │ │ │ │ │ │ ├── logout.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── all/
│ │ │ │ │ │ ├── AdminUser.jsx
│ │ │ │ │ │ └── [context]auth.js
│ │ │ │ │ └── services/
│ │ │ │ │ ├── getAdminSessionCookieName.ts
│ │ │ │ │ ├── getCookieSecret.ts
│ │ │ │ │ ├── getFrontStoreSessionCookieName.ts
│ │ │ │ │ ├── getSessionConfig.ts
│ │ │ │ │ ├── loginUserWithEmail.ts
│ │ │ │ │ └── logoutUser.ts
│ │ │ │ ├── base/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ └── global/
│ │ │ │ │ │ ├── [apiResponse]apiErrorHandler.ts
│ │ │ │ │ │ ├── [auth]apiResponse[apiErrorHandler].ts
│ │ │ │ │ │ ├── [auth]payloadValidate.ts
│ │ │ │ │ │ ├── [payloadValidate]escapeHtml.ts
│ │ │ │ │ │ └── context.js
│ │ │ │ │ ├── bootstrap.js
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ ├── Country/
│ │ │ │ │ │ │ ├── Country.graphql
│ │ │ │ │ │ │ └── Country.resolvers.js
│ │ │ │ │ │ ├── Currency/
│ │ │ │ │ │ │ ├── Currency.graphql
│ │ │ │ │ │ │ └── Currency.resolvers.js
│ │ │ │ │ │ ├── DateTime/
│ │ │ │ │ │ │ ├── DateTime.graphql
│ │ │ │ │ │ │ └── DateTime.resolvers.js
│ │ │ │ │ │ ├── Province/
│ │ │ │ │ │ │ ├── Province.graphql
│ │ │ │ │ │ │ └── Province.resolvers.js
│ │ │ │ │ │ ├── Route/
│ │ │ │ │ │ │ ├── Route.admin.graphql
│ │ │ │ │ │ │ └── Route.admin.resolvers.js
│ │ │ │ │ │ ├── Timezone/
│ │ │ │ │ │ │ ├── Timezone.graphql
│ │ │ │ │ │ │ └── Timezone.resolvers.js
│ │ │ │ │ │ ├── Url/
│ │ │ │ │ │ │ ├── Url.graphql
│ │ │ │ │ │ │ └── Url.resolvers.js
│ │ │ │ │ │ └── Version/
│ │ │ │ │ │ ├── Version.graphql
│ │ │ │ │ │ └── Version.resolvers.js
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ └── Version-1.0.1.js
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── admin/
│ │ │ │ │ │ │ └── all/
│ │ │ │ │ │ │ ├── FormCss.tsx
│ │ │ │ │ │ │ ├── GlobalCss.tsx
│ │ │ │ │ │ │ ├── Layout.tsx
│ │ │ │ │ │ │ ├── Meta.tsx
│ │ │ │ │ │ │ ├── TailwindCss.tsx
│ │ │ │ │ │ │ ├── [context]isAdmin[auth].js
│ │ │ │ │ │ │ ├── form.scss
│ │ │ │ │ │ │ ├── global.scss
│ │ │ │ │ │ │ ├── shadcn.css
│ │ │ │ │ │ │ └── tailwind.css
│ │ │ │ │ │ ├── frontStore/
│ │ │ │ │ │ │ └── all/
│ │ │ │ │ │ │ ├── Base.tsx
│ │ │ │ │ │ │ ├── Breadcrumb.tsx
│ │ │ │ │ │ │ ├── GlobalCss.tsx
│ │ │ │ │ │ │ ├── HeadTags.tsx
│ │ │ │ │ │ │ ├── Logo.tsx
│ │ │ │ │ │ │ ├── Notification.scss
│ │ │ │ │ │ │ ├── Notification.tsx
│ │ │ │ │ │ │ ├── TailwindCss.tsx
│ │ │ │ │ │ │ ├── global.scss
│ │ │ │ │ │ │ ├── shadcn.css
│ │ │ │ │ │ │ └── tailwind.css
│ │ │ │ │ │ └── global/
│ │ │ │ │ │ ├── [auth]notFound[response].ts
│ │ │ │ │ │ ├── [response]errorHandler.js
│ │ │ │ │ │ ├── context.js
│ │ │ │ │ │ └── response[errorHandler].ts
│ │ │ │ │ └── services/
│ │ │ │ │ ├── escapePayload.ts
│ │ │ │ │ ├── getAjv.js
│ │ │ │ │ ├── markSkipEscape.ts
│ │ │ │ │ ├── notifications.js
│ │ │ │ │ └── secret.js
│ │ │ │ ├── catalog/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── addProductToCategory/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── addProducts.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── addProductToCollection/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── addProducts.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── addVariantItem/
│ │ │ │ │ │ │ ├── [bodyParser]addItem.js
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createAttribute/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── createAttribute[finish].js
│ │ │ │ │ │ │ ├── finish[apiResponse].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createAttributeGroup/
│ │ │ │ │ │ │ ├── [bodyParser]saveGroup.js
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createCategory/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── createCategory[finish].ts
│ │ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createCollection/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── createCollection[finish].ts
│ │ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createProduct/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── createProduct[finish].ts
│ │ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createVariantGroup/
│ │ │ │ │ │ │ ├── [bodyParser]saveGroup.js
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteAttribute/
│ │ │ │ │ │ │ ├── deleteAttribute.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteAttributeGroup/
│ │ │ │ │ │ │ ├── deleteAttributeGroup.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteCategory/
│ │ │ │ │ │ │ ├── deleteCategory.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteCollection/
│ │ │ │ │ │ │ ├── deleteCollection.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteProduct/
│ │ │ │ │ │ │ ├── deleteProduct.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── removeProductFromCategory/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── removeProducts.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── removeProductFromCollection/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── removeProducts.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── unlinkVariant/
│ │ │ │ │ │ │ ├── [context]multerNone[auth].js
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── unlinkVariants.js
│ │ │ │ │ │ ├── updateAttribute/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updateAttribute[finish].ts
│ │ │ │ │ │ ├── updateAttributeGroup/
│ │ │ │ │ │ │ ├── [bodyParser]saveGroup.js
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── updateCategory/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updateCategory[finish].ts
│ │ │ │ │ │ ├── updateCollection/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updateCollection[finish].ts
│ │ │ │ │ │ ├── updateProduct/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updateProduct[finish].ts
│ │ │ │ │ │ └── variantSearch/
│ │ │ │ │ │ ├── loadVariants.js
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── bootstrap.js
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── CollectionProducts.tsx
│ │ │ │ │ │ └── CollectionProductsSetting.tsx
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ ├── Attribute/
│ │ │ │ │ │ │ ├── Attribute.admin.graphql
│ │ │ │ │ │ │ ├── Attribute.admin.resolvers.js
│ │ │ │ │ │ │ ├── Attribute.graphql
│ │ │ │ │ │ │ └── Attribute.resolvers.js
│ │ │ │ │ │ ├── Category/
│ │ │ │ │ │ │ ├── Category.admin.graphql
│ │ │ │ │ │ │ ├── Category.admin.resolvers.js
│ │ │ │ │ │ │ ├── Category.graphql
│ │ │ │ │ │ │ └── Category.resolvers.ts
│ │ │ │ │ │ ├── Collection/
│ │ │ │ │ │ │ ├── Collection.admin.graphql
│ │ │ │ │ │ │ ├── Collection.admin.resolvers.js
│ │ │ │ │ │ │ ├── Collection.graphql
│ │ │ │ │ │ │ └── Collection.resolvers.js
│ │ │ │ │ │ ├── FeaturedProduct/
│ │ │ │ │ │ │ ├── FeaturedProduct.graphql
│ │ │ │ │ │ │ └── FeaturedProduct.resolvers.js
│ │ │ │ │ │ ├── Product/
│ │ │ │ │ │ │ ├── Attribute/
│ │ │ │ │ │ │ │ ├── ProductAttribute.graphql
│ │ │ │ │ │ │ │ └── ProductAttribute.resolvers.js
│ │ │ │ │ │ │ ├── CustomOption/
│ │ │ │ │ │ │ │ ├── CustomOption.graphql
│ │ │ │ │ │ │ │ └── CustomOption.resolvers.js
│ │ │ │ │ │ │ ├── Image/
│ │ │ │ │ │ │ │ ├── ProductImage.graphql
│ │ │ │ │ │ │ │ └── ProductImage.resolvers.ts
│ │ │ │ │ │ │ ├── Inventory/
│ │ │ │ │ │ │ │ ├── Inventory.admin.graphql
│ │ │ │ │ │ │ │ ├── Inventory.admin.resolvers.js
│ │ │ │ │ │ │ │ ├── Inventory.graphql
│ │ │ │ │ │ │ │ └── Inventory.resolvers.js
│ │ │ │ │ │ │ ├── Price/
│ │ │ │ │ │ │ │ ├── ProductPrice.graphql
│ │ │ │ │ │ │ │ └── ProductPrice.resolvers.js
│ │ │ │ │ │ │ ├── Product.admin.graphql
│ │ │ │ │ │ │ ├── Product.admin.resolvers.ts
│ │ │ │ │ │ │ ├── Product.graphql
│ │ │ │ │ │ │ ├── Product.resolvers.ts
│ │ │ │ │ │ │ └── Variant/
│ │ │ │ │ │ │ ├── Variant.graphql
│ │ │ │ │ │ │ └── Variant.resolvers.js
│ │ │ │ │ │ └── Widget/
│ │ │ │ │ │ └── CollectionProductsWidget/
│ │ │ │ │ │ ├── CollectionProductsWidget.graphql
│ │ │ │ │ │ └── CollectionProductsWidget.resolvers.js
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ ├── Version-1.0.0.js
│ │ │ │ │ │ ├── Version-1.0.1.js
│ │ │ │ │ │ ├── Version-1.0.2.js
│ │ │ │ │ │ ├── Version-1.0.3.js
│ │ │ │ │ │ ├── Version-1.0.4.js
│ │ │ │ │ │ ├── Version-1.0.5.js
│ │ │ │ │ │ ├── Version-1.0.6.js
│ │ │ │ │ │ ├── Version-1.0.7.js
│ │ │ │ │ │ └── Version-1.0.8.ts
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── admin/
│ │ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ │ ├── CatalogMenuGroup.jsx
│ │ │ │ │ │ │ │ └── NewProductQuickLink.jsx
│ │ │ │ │ │ │ ├── attributeEdit/
│ │ │ │ │ │ │ │ ├── AttributeEditForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── attributeEdit+attributeNew/
│ │ │ │ │ │ │ │ ├── Avaibility.tsx
│ │ │ │ │ │ │ │ ├── General.scss
│ │ │ │ │ │ │ │ ├── General.tsx
│ │ │ │ │ │ │ │ └── PageHeading.tsx
│ │ │ │ │ │ │ ├── attributeGrid/
│ │ │ │ │ │ │ │ ├── Grid.jsx
│ │ │ │ │ │ │ │ ├── NewAttributeButton.tsx
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ │ └── rows/
│ │ │ │ │ │ │ │ ├── AttributeName.tsx
│ │ │ │ │ │ │ │ └── GroupRow.tsx
│ │ │ │ │ │ │ ├── attributeNew/
│ │ │ │ │ │ │ │ ├── AttributeNewForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── categoryEdit/
│ │ │ │ │ │ │ │ ├── CategoryEditForm.tsx
│ │ │ │ │ │ │ │ ├── Products.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── categoryEdit+categoryNew/
│ │ │ │ │ │ │ │ ├── General.scss
│ │ │ │ │ │ │ │ ├── General.tsx
│ │ │ │ │ │ │ │ ├── Image.scss
│ │ │ │ │ │ │ │ ├── Image.tsx
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ ├── Seo.tsx
│ │ │ │ │ │ │ │ └── Status.tsx
│ │ │ │ │ │ │ ├── categoryGrid/
│ │ │ │ │ │ │ │ ├── Grid.jsx
│ │ │ │ │ │ │ │ ├── NewCategoryButton.tsx
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ │ └── rows/
│ │ │ │ │ │ │ │ └── CategoryName.tsx
│ │ │ │ │ │ │ ├── categoryNew/
│ │ │ │ │ │ │ │ ├── CategoryNewForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── collectionEdit/
│ │ │ │ │ │ │ │ ├── CollectionEditForm.tsx
│ │ │ │ │ │ │ │ ├── Products.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── collectionEdit+collectionNew/
│ │ │ │ │ │ │ │ ├── General.scss
│ │ │ │ │ │ │ │ ├── General.tsx
│ │ │ │ │ │ │ │ └── PageHeading.tsx
│ │ │ │ │ │ │ ├── collectionGrid/
│ │ │ │ │ │ │ │ ├── Grid.jsx
│ │ │ │ │ │ │ │ ├── NewCollectionButton.tsx
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ │ └── rows/
│ │ │ │ │ │ │ │ └── CollectionNameRow.tsx
│ │ │ │ │ │ │ ├── collectionNew/
│ │ │ │ │ │ │ │ ├── CollectionNewForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── productEdit/
│ │ │ │ │ │ │ │ ├── Collection.tsx
│ │ │ │ │ │ │ │ ├── ProductEditForm.tsx
│ │ │ │ │ │ │ │ ├── VariantGroup.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ │ └── variants/
│ │ │ │ │ │ │ │ ├── CreateVariant.tsx
│ │ │ │ │ │ │ │ ├── CreateVariantGroup.tsx
│ │ │ │ │ │ │ │ ├── EditVariant.tsx
│ │ │ │ │ │ │ │ ├── New.tsx
│ │ │ │ │ │ │ │ ├── Skeleton.tsx
│ │ │ │ │ │ │ │ ├── Variant.tsx
│ │ │ │ │ │ │ │ ├── VariantModal.tsx
│ │ │ │ │ │ │ │ └── Variants.tsx
│ │ │ │ │ │ │ ├── productEdit+productNew/
│ │ │ │ │ │ │ │ ├── Attributes.tsx
│ │ │ │ │ │ │ │ ├── General.scss
│ │ │ │ │ │ │ │ ├── General.tsx
│ │ │ │ │ │ │ │ ├── Inventory.tsx
│ │ │ │ │ │ │ │ ├── Media.tsx
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ ├── Seo.tsx
│ │ │ │ │ │ │ │ ├── Shipping.tsx
│ │ │ │ │ │ │ │ └── Status.tsx
│ │ │ │ │ │ │ ├── productGrid/
│ │ │ │ │ │ │ │ ├── Grid.jsx
│ │ │ │ │ │ │ │ ├── NewProductButton.tsx
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ │ └── rows/
│ │ │ │ │ │ │ │ └── ProductName.tsx
│ │ │ │ │ │ │ └── productNew/
│ │ │ │ │ │ │ ├── ProductNewForm.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ └── SearchBox.tsx
│ │ │ │ │ │ ├── catalogSearch/
│ │ │ │ │ │ │ ├── SearchPage.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── categoryView/
│ │ │ │ │ │ │ ├── CategoryView.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── productView/
│ │ │ │ │ │ ├── ProductView.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── services/
│ │ │ │ │ │ ├── AttributeCollection.js
│ │ │ │ │ │ ├── AttributeGroupCollection.js
│ │ │ │ │ │ ├── CategoryCollection.js
│ │ │ │ │ │ ├── CollectionCollection.js
│ │ │ │ │ │ ├── ProductCollection.js
│ │ │ │ │ │ ├── attribute/
│ │ │ │ │ │ │ ├── attributeDataSchema.json
│ │ │ │ │ │ │ ├── createProductAttribute.ts
│ │ │ │ │ │ │ ├── deleteProductAttribute.ts
│ │ │ │ │ │ │ └── updateProductAttribute.ts
│ │ │ │ │ │ ├── category/
│ │ │ │ │ │ │ ├── categoryDataSchema.json
│ │ │ │ │ │ │ ├── createCategory.ts
│ │ │ │ │ │ │ ├── deleteCategory.ts
│ │ │ │ │ │ │ └── updateCategory.ts
│ │ │ │ │ │ ├── collection/
│ │ │ │ │ │ │ ├── createCollection.ts
│ │ │ │ │ │ │ ├── deleteCollection.ts
│ │ │ │ │ │ │ └── updateCollection.ts
│ │ │ │ │ │ ├── getAttributeGroupsBaseQuery.js
│ │ │ │ │ │ ├── getAttributesBaseQuery.js
│ │ │ │ │ │ ├── getCategoriesBaseQuery.ts
│ │ │ │ │ │ ├── getCollectionsBaseQuery.ts
│ │ │ │ │ │ ├── getFilterableAttributes.js
│ │ │ │ │ │ ├── getProductsBaseQuery.ts
│ │ │ │ │ │ ├── getProductsByCategoryBaseQuery.ts
│ │ │ │ │ │ ├── getProductsByCollectionBaseQuery.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── product/
│ │ │ │ │ │ │ ├── createProduct.ts
│ │ │ │ │ │ │ ├── deleteProduct.ts
│ │ │ │ │ │ │ ├── productDataSchema.json
│ │ │ │ │ │ │ └── updateProduct.ts
│ │ │ │ │ │ ├── registerCartItemProductUrlField.js
│ │ │ │ │ │ ├── registerCartItemVariantOptionsField.js
│ │ │ │ │ │ ├── registerDefaultAttributeCollectionFilters.js
│ │ │ │ │ │ ├── registerDefaultCategoryCollectionFilters.js
│ │ │ │ │ │ ├── registerDefaultCollectionCollectionFilters.js
│ │ │ │ │ │ └── registerDefaultProductCollectionFilters.js
│ │ │ │ │ ├── subscribers/
│ │ │ │ │ │ ├── category_created/
│ │ │ │ │ │ │ └── buildUrlRewrite.ts
│ │ │ │ │ │ ├── category_deleted/
│ │ │ │ │ │ │ └── deleteUrlRewrite.ts
│ │ │ │ │ │ ├── category_updated/
│ │ │ │ │ │ │ └── builUrlRewrite.ts
│ │ │ │ │ │ ├── product_created/
│ │ │ │ │ │ │ └── buildUrlRewrite.ts
│ │ │ │ │ │ ├── product_deleted/
│ │ │ │ │ │ │ └── deleteUrlRewrite.ts
│ │ │ │ │ │ └── product_updated/
│ │ │ │ │ │ └── buildUrlRewrite.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ └── intergration/
│ │ │ │ │ └── productView.test.js
│ │ │ │ ├── checkout/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── addCartAddress/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── saveAddress.ts
│ │ │ │ │ │ ├── addCartContactInfo/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── saveContactInfo.js
│ │ │ │ │ │ ├── addCartItem/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── addItemToCart.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── addCartPaymentMethod/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── savePaymentMethod.js
│ │ │ │ │ │ ├── addCartShippingMethod/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── saveShippingMethod.js
│ │ │ │ │ │ ├── addMineCartItem/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── addItemToCart.ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── addShippingNote/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── saveShippingNote.js
│ │ │ │ │ │ ├── addShippingZoneMethod/
│ │ │ │ │ │ │ ├── [context]borderParser[auth].js
│ │ │ │ │ │ │ ├── [validateMethod]addShippingZoneMethod.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── validateMethod.js
│ │ │ │ │ │ ├── cartCheckout/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── checkout.ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createCart/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── createNewCart.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createOrder/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── placeOrder.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createShippingMethod/
│ │ │ │ │ │ │ ├── [context]borderParser[auth].js
│ │ │ │ │ │ │ ├── createShippingMethod.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createShippingZone/
│ │ │ │ │ │ │ ├── [context]borderParser[auth].js
│ │ │ │ │ │ │ ├── createShippingZone.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteShippingZone/
│ │ │ │ │ │ │ ├── deleteShippingZone.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteShippingZoneMethod/
│ │ │ │ │ │ │ ├── deleteShippingZoneMethod.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── removeCartItem/
│ │ │ │ │ │ │ ├── removeItem.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── removeMineCartItem/
│ │ │ │ │ │ │ ├── removeItem.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── updateCartItemQty/
│ │ │ │ │ │ │ ├── [bodyParser]updateQty.js
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── updateMineCartItemQty/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updateQty.ts
│ │ │ │ │ │ ├── updateShippingMethod/
│ │ │ │ │ │ │ ├── [context]borderParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updateShippingMethod.js
│ │ │ │ │ │ ├── updateShippingZone/
│ │ │ │ │ │ │ ├── [context]borderParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updateShippingZone.js
│ │ │ │ │ │ └── updateShippingZoneMethod/
│ │ │ │ │ │ ├── [context]borderParser[auth].js
│ │ │ │ │ │ ├── [validateMethod]updateShippingZoneMethod.js
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ └── validateMethod.js
│ │ │ │ │ ├── bootstrap.ts
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ ├── Cart/
│ │ │ │ │ │ │ ├── Cart.graphql
│ │ │ │ │ │ │ └── Cart.resolvers.ts
│ │ │ │ │ │ ├── CheckoutSetting/
│ │ │ │ │ │ │ ├── CheckoutSetting.graphql
│ │ │ │ │ │ │ └── CheckoutSetting.resolvers.js
│ │ │ │ │ │ ├── Date/
│ │ │ │ │ │ │ ├── Date.graphql
│ │ │ │ │ │ │ └── Date.resolvers.js
│ │ │ │ │ │ ├── PaymentMethod/
│ │ │ │ │ │ │ ├── AvailablePaymentMethod.graphql
│ │ │ │ │ │ │ └── AvailablePaymentMethod.resolvers.ts
│ │ │ │ │ │ ├── Price/
│ │ │ │ │ │ │ ├── Price.graphql
│ │ │ │ │ │ │ └── Price.resolvers.js
│ │ │ │ │ │ ├── ShippingMethod/
│ │ │ │ │ │ │ ├── AvailableShippingMethod.graphql
│ │ │ │ │ │ │ ├── AvailableShippingMethod.resolvers.ts
│ │ │ │ │ │ │ ├── ShippingMethod.admin.graphql
│ │ │ │ │ │ │ └── ShippingMethod.admin.resolvers.js
│ │ │ │ │ │ ├── ShippingZone/
│ │ │ │ │ │ │ ├── ShippingZone.graphql
│ │ │ │ │ │ │ └── ShippingZone.resolvers.js
│ │ │ │ │ │ └── Weight/
│ │ │ │ │ │ ├── Weight.graphql
│ │ │ │ │ │ └── Weight.resolvers.js
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ ├── Version-1.0.0.js
│ │ │ │ │ │ ├── Version-1.0.1.js
│ │ │ │ │ │ ├── Version-1.0.2.js
│ │ │ │ │ │ ├── Version-1.0.3.js
│ │ │ │ │ │ ├── Version-1.0.4.js
│ │ │ │ │ │ ├── Version-1.0.5.js
│ │ │ │ │ │ ├── Version-1.0.6.js
│ │ │ │ │ │ └── Version-1.0.7.ts
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── admin/
│ │ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ │ └── ShippingSettingMenu.tsx
│ │ │ │ │ │ │ └── shippingSetting/
│ │ │ │ │ │ │ ├── ShippingSetting.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── shippingSetting/
│ │ │ │ │ │ │ ├── Method.tsx
│ │ │ │ │ │ │ ├── MethodForm.tsx
│ │ │ │ │ │ │ ├── Methods.tsx
│ │ │ │ │ │ │ ├── PriceBasedPrice.tsx
│ │ │ │ │ │ │ ├── WeightBasedPrice.tsx
│ │ │ │ │ │ │ ├── Zone.tsx
│ │ │ │ │ │ │ ├── ZoneForm.tsx
│ │ │ │ │ │ │ └── Zones.tsx
│ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ ├── MiniCartIcon.tsx
│ │ │ │ │ │ │ └── [auth]addCustomerToCart.ts
│ │ │ │ │ │ ├── cart/
│ │ │ │ │ │ │ ├── ShoppingCart.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── checkout/
│ │ │ │ │ │ │ ├── Checkout.scss
│ │ │ │ │ │ │ ├── Checkout.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── checkoutSuccess/
│ │ │ │ │ │ ├── CheckoutSuccess.jsx
│ │ │ │ │ │ ├── CheckoutSuccess.scss
│ │ │ │ │ │ ├── CustomerInfo.tsx
│ │ │ │ │ │ ├── ShippingNote.tsx
│ │ │ │ │ │ ├── Summary.scss
│ │ │ │ │ │ ├── Summary.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── services/
│ │ │ │ │ │ ├── addBillingAddress.ts
│ │ │ │ │ │ ├── addCartItem.ts
│ │ │ │ │ │ ├── addShippingAddress.ts
│ │ │ │ │ │ ├── cart/
│ │ │ │ │ │ │ ├── Cart.js
│ │ │ │ │ │ │ ├── DataObject.js
│ │ │ │ │ │ │ ├── registerCartBaseFields.js
│ │ │ │ │ │ │ ├── registerCartItemBaseFields.js
│ │ │ │ │ │ │ └── sortFields.js
│ │ │ │ │ │ ├── checkout.ts
│ │ │ │ │ │ ├── createNewCart.ts
│ │ │ │ │ │ ├── getAvailablePaymentMethods.ts
│ │ │ │ │ │ ├── getAvailableShippingMethods.ts
│ │ │ │ │ │ ├── getCartByUUID.ts
│ │ │ │ │ │ ├── getMyCart.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── orderCreator.ts
│ │ │ │ │ │ ├── orderValidator.ts
│ │ │ │ │ │ ├── removeCartItem.ts
│ │ │ │ │ │ ├── saveCart.ts
│ │ │ │ │ │ ├── toPrice.ts
│ │ │ │ │ │ └── updateCartItemQty.ts
│ │ │ │ │ └── tests/
│ │ │ │ │ ├── basicSetup.js
│ │ │ │ │ ├── coupons.js
│ │ │ │ │ ├── products.js
│ │ │ │ │ ├── taxRates.js
│ │ │ │ │ └── unit/
│ │ │ │ │ ├── addItemSideEffect.test.js
│ │ │ │ │ ├── discountAmount.test.js
│ │ │ │ │ ├── grandTotal.test.js
│ │ │ │ │ ├── lineTotal.test.js
│ │ │ │ │ ├── lineTotalWithDiscount.test.js
│ │ │ │ │ ├── productPrice.test.js
│ │ │ │ │ ├── removeItemSideEffect.test.js
│ │ │ │ │ ├── subTotal.test.js
│ │ │ │ │ ├── subTotalWithDiscount.test.js
│ │ │ │ │ ├── taxAmount.test.js
│ │ │ │ │ ├── taxAmountRounding.test.js
│ │ │ │ │ └── updateCartItemQtySideEffect.test.js
│ │ │ │ ├── cms/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── createCmsPage/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── createPage[finish].ts
│ │ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createWidget/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── createWidget[finish].js
│ │ │ │ │ │ │ ├── finish[apiResponse].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteCmsPage/
│ │ │ │ │ │ │ ├── deleteCmsPage.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteWidget/
│ │ │ │ │ │ │ ├── deleteWidget.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── fileBrowser/
│ │ │ │ │ │ │ ├── [context]validatePath[auth].js
│ │ │ │ │ │ │ ├── browFiles.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── fileDelete/
│ │ │ │ │ │ │ ├── [context]validatePath[auth].js
│ │ │ │ │ │ │ ├── deleteFile.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── fileUpload/
│ │ │ │ │ │ │ ├── [auth,validatePath]multerFile.js
│ │ │ │ │ │ │ ├── [multerFile]upload.js
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── validatePath.js
│ │ │ │ │ │ ├── folderCreate/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── [context]validatePath[auth].js
│ │ │ │ │ │ │ ├── createFolder.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── imageUpload/
│ │ │ │ │ │ │ ├── [auth,validatePath]multerFile.js
│ │ │ │ │ │ │ ├── [multerFile]upload.js
│ │ │ │ │ │ │ ├── [multerFile]verifyImages[upload].js
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── validatePath.js
│ │ │ │ │ │ ├── updateCmsPage/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updatePage[finish].ts
│ │ │ │ │ │ └── updateWidget/
│ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ ├── finish[apiResponse].ts
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ └── updateWidget[finish].ts
│ │ │ │ │ ├── bootstrap.ts
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Banner.tsx
│ │ │ │ │ │ ├── BannerSetting.tsx
│ │ │ │ │ │ ├── BasicMenu.tsx
│ │ │ │ │ │ ├── BasicMenuSetting.scss
│ │ │ │ │ │ ├── BasicMenuSetting.tsx
│ │ │ │ │ │ ├── Slideshow.tsx
│ │ │ │ │ │ ├── SlideshowSetting.tsx
│ │ │ │ │ │ ├── TextBlock.tsx
│ │ │ │ │ │ └── TextBlockSetting.tsx
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ ├── CmsPage/
│ │ │ │ │ │ │ ├── CmsPage.graphql
│ │ │ │ │ │ │ └── CmsPage.resolvers.ts
│ │ │ │ │ │ ├── Menu/
│ │ │ │ │ │ │ ├── Menu.graphql
│ │ │ │ │ │ │ └── Menu.resolvers.js
│ │ │ │ │ │ ├── PageInfo/
│ │ │ │ │ │ │ ├── PageInfo.graphql
│ │ │ │ │ │ │ └── PageInfo.resolvers.ts
│ │ │ │ │ │ ├── ThemeConfig/
│ │ │ │ │ │ │ ├── ThemeConfig.graphql
│ │ │ │ │ │ │ └── ThemeConfig.resolvers.js
│ │ │ │ │ │ └── Widget/
│ │ │ │ │ │ ├── Widget.graphql
│ │ │ │ │ │ └── Widget.resolvers.js
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ ├── Version-1.0.0.js
│ │ │ │ │ │ ├── Version-1.1.0.js
│ │ │ │ │ │ └── Version-1.1.1.js
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── admin/
│ │ │ │ │ │ │ ├── adminNotFound/
│ │ │ │ │ │ │ │ ├── Meta.tsx
│ │ │ │ │ │ │ │ ├── NotFound.tsx
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── adminStaticAsset/
│ │ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ │ └── staticAssets.ts
│ │ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ │ ├── CmsMenuGroup.jsx
│ │ │ │ │ │ │ │ ├── CopyRight.tsx
│ │ │ │ │ │ │ │ ├── Logo.tsx
│ │ │ │ │ │ │ │ ├── Navigation.jsx
│ │ │ │ │ │ │ │ ├── Navigation.scss
│ │ │ │ │ │ │ │ ├── Notification.jsx
│ │ │ │ │ │ │ │ ├── Notification.scss
│ │ │ │ │ │ │ │ ├── QuickLinks.jsx
│ │ │ │ │ │ │ │ ├── SearchBox.tsx
│ │ │ │ │ │ │ │ ├── Survey.tsx
│ │ │ │ │ │ │ │ ├── Version.jsx
│ │ │ │ │ │ │ │ └── search/
│ │ │ │ │ │ │ │ ├── NoResult.tsx
│ │ │ │ │ │ │ │ └── Results.jsx
│ │ │ │ │ │ │ ├── cmsPageEdit/
│ │ │ │ │ │ │ │ ├── PageEditForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── cmsPageEdit+cmsPageNew/
│ │ │ │ │ │ │ │ ├── General.tsx
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ └── Seo.tsx
│ │ │ │ │ │ │ ├── cmsPageGrid/
│ │ │ │ │ │ │ │ ├── Grid.jsx
│ │ │ │ │ │ │ │ ├── NewPageButton.tsx
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ │ └── rows/
│ │ │ │ │ │ │ │ └── PageName.tsx
│ │ │ │ │ │ │ ├── cmsPageNew/
│ │ │ │ │ │ │ │ ├── PageNewForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── dashboard/
│ │ │ │ │ │ │ │ ├── Layout.jsx
│ │ │ │ │ │ │ │ ├── Layout.scss
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── widgetEdit/
│ │ │ │ │ │ │ │ ├── WidgetEditForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── widgetEdit+widgetNew/
│ │ │ │ │ │ │ │ ├── General.tsx
│ │ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ │ └── Setting.tsx
│ │ │ │ │ │ │ ├── widgetGrid/
│ │ │ │ │ │ │ │ ├── Grid.jsx
│ │ │ │ │ │ │ │ ├── Heading.tsx
│ │ │ │ │ │ │ │ ├── NewWidgetButton.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ │ └── rows/
│ │ │ │ │ │ │ │ ├── Name.tsx
│ │ │ │ │ │ │ │ └── WidgetTypeRow.tsx
│ │ │ │ │ │ │ └── widgetNew/
│ │ │ │ │ │ │ ├── WidgetNewForm.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── typeValidate.js
│ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ ├── cmsPageView/
│ │ │ │ │ │ │ ├── CmsPageView.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── homepage/
│ │ │ │ │ │ │ ├── meta.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── images/
│ │ │ │ │ │ │ ├── images.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── notFound/
│ │ │ │ │ │ │ ├── Meta.tsx
│ │ │ │ │ │ │ ├── NotFound.tsx
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── staticAsset/
│ │ │ │ │ │ ├── [context]staticAssets[auth].ts
│ │ │ │ │ │ └── route.json
│ │ │ │ │ └── services/
│ │ │ │ │ ├── CMSPageCollection.js
│ │ │ │ │ ├── CustomMemoryStorage.js
│ │ │ │ │ ├── WidgetCollection.js
│ │ │ │ │ ├── browFiles.ts
│ │ │ │ │ ├── createFolder.ts
│ │ │ │ │ ├── deleteFile.ts
│ │ │ │ │ ├── generateFileName.js
│ │ │ │ │ ├── getCmsPagesBaseQuery.js
│ │ │ │ │ ├── getMulter.js
│ │ │ │ │ ├── getWidgetsBaseQuery.js
│ │ │ │ │ ├── imageProcessor.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── page/
│ │ │ │ │ │ ├── createPage.ts
│ │ │ │ │ │ ├── deletePage.ts
│ │ │ │ │ │ ├── pageDataSchema.json
│ │ │ │ │ │ └── updatePage.ts
│ │ │ │ │ ├── pageMetaInfo.ts
│ │ │ │ │ ├── registerDefaultPageCollectionFilters.js
│ │ │ │ │ ├── registerDefaultWidgetCollectionFilters.js
│ │ │ │ │ ├── tailwind.admin.config.ts
│ │ │ │ │ ├── tailwind.frontStore.config.ts
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ └── unit/
│ │ │ │ │ │ ├── imageProcessor.test.js
│ │ │ │ │ │ ├── root/
│ │ │ │ │ │ │ ├── images/
│ │ │ │ │ │ │ │ ├── .gitkeep
│ │ │ │ │ │ │ │ └── junk.txt
│ │ │ │ │ │ │ └── media/
│ │ │ │ │ │ │ ├── cache/
│ │ │ │ │ │ │ │ ├── .gitkeep
│ │ │ │ │ │ │ │ └── junk.txt
│ │ │ │ │ │ │ └── images/
│ │ │ │ │ │ │ ├── .gitkeep
│ │ │ │ │ │ │ └── junk.txt
│ │ │ │ │ │ └── validatePath.test.js
│ │ │ │ │ ├── uploadFile.ts
│ │ │ │ │ ├── validatePath.js
│ │ │ │ │ └── widget/
│ │ │ │ │ ├── createWidget.js
│ │ │ │ │ ├── deleteWidget.js
│ │ │ │ │ ├── loadWidgetInstances.js
│ │ │ │ │ ├── updateWidget.js
│ │ │ │ │ └── widgetDataSchema.json
│ │ │ │ ├── cod/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ └── codCapturePayment/
│ │ │ │ │ │ ├── [bodyParser]capture.js
│ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── bootstrap.ts
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ └── CODSetting/
│ │ │ │ │ │ ├── CODSetting.graphql
│ │ │ │ │ │ └── CODSetting.resolvers.js
│ │ │ │ │ └── pages/
│ │ │ │ │ ├── admin/
│ │ │ │ │ │ ├── orderEdit/
│ │ │ │ │ │ │ └── CaptureButton.jsx
│ │ │ │ │ │ └── paymentSetting/
│ │ │ │ │ │ └── CODSetting.tsx
│ │ │ │ │ └── frontStore/
│ │ │ │ │ └── checkout/
│ │ │ │ │ └── CashOnDelivery.tsx
│ │ │ │ ├── customer/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── createCustomer/
│ │ │ │ │ │ │ ├── [bodyParser]createCustomer.ts
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createCustomerAddress/
│ │ │ │ │ │ │ ├── [bodyParser]createCustomerAddress.js
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteCustomer/
│ │ │ │ │ │ │ ├── deleteCustomer.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteCustomerAddress/
│ │ │ │ │ │ │ ├── deleteCustomerAddress.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── getCustomerToken/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── generateToken.ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── global/
│ │ │ │ │ │ │ ├── [context]getCurrentCustomer[auth].js
│ │ │ │ │ │ │ └── [context]jwtCustomerAuth[getCurrentCustomer].ts
│ │ │ │ │ │ ├── refreshCustomerToken/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── refreshToken.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── resetPassword/
│ │ │ │ │ │ │ ├── [bodyParser]resetPassword.ts
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── updateCustomer/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updateCustomer.js
│ │ │ │ │ │ ├── updateCustomerAddress/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── updateCustomerAddress.js
│ │ │ │ │ │ └── updatePassword/
│ │ │ │ │ │ ├── [bodyParser]updatePassword.js
│ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── bootstrap.ts
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ ├── Customer/
│ │ │ │ │ │ │ ├── Customer.admin.graphql
│ │ │ │ │ │ │ ├── Customer.admin.resolvers.js
│ │ │ │ │ │ │ ├── Customer.graphql
│ │ │ │ │ │ │ └── Customer.resolvers.ts
│ │ │ │ │ │ └── CustomerGroup/
│ │ │ │ │ │ ├── CustomerGroup.admin.graphql
│ │ │ │ │ │ ├── CustomerGroup.admin.resolvers.js
│ │ │ │ │ │ ├── CustomerGroup.graphql
│ │ │ │ │ │ └── CustomerGroup.resolvers.js
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ ├── Version-1.0.0.js
│ │ │ │ │ │ ├── Version-1.0.1.js
│ │ │ │ │ │ ├── Version-1.0.2.js
│ │ │ │ │ │ └── Version-1.0.3.js
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── admin/
│ │ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ │ └── CustomerMenuGroup.jsx
│ │ │ │ │ │ │ ├── customerEdit/
│ │ │ │ │ │ │ │ ├── CustomerEditForm.jsx
│ │ │ │ │ │ │ │ ├── CustomerEditForm.scss
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ │ ├── customerEdit+customerNew/
│ │ │ │ │ │ │ │ ├── General.jsx
│ │ │ │ │ │ │ │ ├── OrderHistory.jsx
│ │ │ │ │ │ │ │ └── PageHeading.tsx
│ │ │ │ │ │ │ └── customerGrid/
│ │ │ │ │ │ │ ├── Grid.jsx
│ │ │ │ │ │ │ ├── Heading.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── rows/
│ │ │ │ │ │ │ └── CustomerName.tsx
│ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ ├── account/
│ │ │ │ │ │ │ ├── MyAccount.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ ├── CustomerIcon.tsx
│ │ │ │ │ │ │ └── [context]auth.js
│ │ │ │ │ │ ├── customerLoginJson/
│ │ │ │ │ │ │ ├── [bodyParser]login.ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── customerLogoutJson/
│ │ │ │ │ │ │ ├── logout.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── login/
│ │ │ │ │ │ │ ├── LoginPage.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── register/
│ │ │ │ │ │ │ ├── RegisterPage.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── resetPasswordPage/
│ │ │ │ │ │ ├── ResetPasswordPage.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── services/
│ │ │ │ │ │ ├── CustomerCollection.js
│ │ │ │ │ │ ├── CustomerGroupCollection.js
│ │ │ │ │ │ ├── customer/
│ │ │ │ │ │ │ ├── address/
│ │ │ │ │ │ │ │ ├── addressValidators.ts
│ │ │ │ │ │ │ │ ├── createCustomerAddress.ts
│ │ │ │ │ │ │ │ ├── deleteCustomerAddress.ts
│ │ │ │ │ │ │ │ └── updateCustomerAddress.ts
│ │ │ │ │ │ │ ├── createCustomer.ts
│ │ │ │ │ │ │ ├── customerDataSchema.json
│ │ │ │ │ │ │ ├── deleteCustomer.ts
│ │ │ │ │ │ │ ├── loginCustomerWithEmail.ts
│ │ │ │ │ │ │ ├── logoutCustomer.js
│ │ │ │ │ │ │ ├── updateCustomer.ts
│ │ │ │ │ │ │ └── updatePassword.ts
│ │ │ │ │ │ ├── getCustomerGroupsBaseQuery.js
│ │ │ │ │ │ ├── getCustomersBaseQuery.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── registerDefaultCustomerCollectionFilters.js
│ │ │ │ │ │ ├── registerDefaultCustomerGroupCollectionFilters.js
│ │ │ │ │ │ └── sendResetPasswordEmail.ts
│ │ │ │ │ └── subscribers/
│ │ │ │ │ └── customer_registered/
│ │ │ │ │ └── sendWelcomeEmail.ts
│ │ │ │ ├── graphql/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── adminGraphql/
│ │ │ │ │ │ │ ├── [bodyParser]graphql.js
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── graphql/
│ │ │ │ │ │ ├── [auth]removeUser[graphql].ts
│ │ │ │ │ │ ├── [bodyParser]graphql.js
│ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── bootstrap.js
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ └── Query/
│ │ │ │ │ │ ├── Query.graphql
│ │ │ │ │ │ └── Query.resolvers.js
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ └── global/
│ │ │ │ │ │ ├── [bodyParser,notFound]buildQuery[graphql].js
│ │ │ │ │ │ ├── [buildQuery]graphql[response].js
│ │ │ │ │ │ └── bodyParser[buildQuery].ts
│ │ │ │ │ └── services/
│ │ │ │ │ ├── buildResolvers.js
│ │ │ │ │ ├── buildSchema.js
│ │ │ │ │ ├── buildStoreFrontSchema.js
│ │ │ │ │ ├── buildTypes.js
│ │ │ │ │ ├── contextHelper.ts
│ │ │ │ │ ├── graphqlErrorMessageFormat.js
│ │ │ │ │ ├── graphqlMiddleware.js
│ │ │ │ │ └── index.ts
│ │ │ │ ├── oms/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── cancelOrder/
│ │ │ │ │ │ │ ├── [context]borderParser[auth].js
│ │ │ │ │ │ │ ├── cancelOrder.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createShipment/
│ │ │ │ │ │ │ ├── [context]borderParser[auth].ts
│ │ │ │ │ │ │ ├── createShipment.ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── lifetimesales/
│ │ │ │ │ │ │ ├── loadData.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── markDelivered/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── markDelivered.ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── salestatistic/
│ │ │ │ │ │ │ ├── loadData.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── updateShipment/
│ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ └── updateShipment.ts
│ │ │ │ │ ├── bootstrap.ts
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ ├── BestSeller/
│ │ │ │ │ │ │ ├── BestSeller.admin.graphql
│ │ │ │ │ │ │ └── BestSeller.admin.resolvers.js
│ │ │ │ │ │ ├── Carrier/
│ │ │ │ │ │ │ ├── Carrier.admin.graphql
│ │ │ │ │ │ │ └── Carrier.admin.resolvers.js
│ │ │ │ │ │ ├── Order/
│ │ │ │ │ │ │ ├── Order.admin.graphql
│ │ │ │ │ │ │ ├── Order.admin.resolvers.js
│ │ │ │ │ │ │ ├── Order.graphql
│ │ │ │ │ │ │ └── Order.resolvers.js
│ │ │ │ │ │ ├── PaymentTransaction/
│ │ │ │ │ │ │ ├── PaymentTransaction.admin.graphql
│ │ │ │ │ │ │ └── PaymentTransaction.admin.resolvers.js
│ │ │ │ │ │ └── Status/
│ │ │ │ │ │ ├── Status.graphql
│ │ │ │ │ │ └── Status.resolvers.js
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ ├── Version-1.0.0.js
│ │ │ │ │ │ ├── Version-1.0.1.js
│ │ │ │ │ │ └── Version-1.0.2.ts
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ └── admin/
│ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ └── OmsMenuGroup.jsx
│ │ │ │ │ │ ├── dashboard/
│ │ │ │ │ │ │ ├── Bestcustomers.jsx
│ │ │ │ │ │ │ ├── Bestsellers.scss
│ │ │ │ │ │ │ ├── Bestsellers.tsx
│ │ │ │ │ │ │ ├── Lifetimesales.jsx
│ │ │ │ │ │ │ ├── Lifetimesales.scss
│ │ │ │ │ │ │ ├── Statistic.jsx
│ │ │ │ │ │ │ └── Statistic.scss
│ │ │ │ │ │ ├── orderEdit/
│ │ │ │ │ │ │ ├── Activities.jsx
│ │ │ │ │ │ │ ├── AddTrackingButton.tsx
│ │ │ │ │ │ │ ├── CancelButton.tsx
│ │ │ │ │ │ │ ├── Customer.tsx
│ │ │ │ │ │ │ ├── CustomerNotes.tsx
│ │ │ │ │ │ │ ├── Items.jsx
│ │ │ │ │ │ │ ├── Layout.jsx
│ │ │ │ │ │ │ ├── Layout.scss
│ │ │ │ │ │ │ ├── MarkDeliveredButton.tsx
│ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ ├── Payment.jsx
│ │ │ │ │ │ │ ├── ShipButton.tsx
│ │ │ │ │ │ │ ├── Status.jsx
│ │ │ │ │ │ │ ├── TrackingButton.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── items/
│ │ │ │ │ │ │ │ ├── ItemVariantOptions.tsx
│ │ │ │ │ │ │ │ ├── Name.tsx
│ │ │ │ │ │ │ │ ├── Price.tsx
│ │ │ │ │ │ │ │ └── Thumbnail.tsx
│ │ │ │ │ │ │ ├── payment/
│ │ │ │ │ │ │ │ ├── Discount.tsx
│ │ │ │ │ │ │ │ ├── Shipping.tsx
│ │ │ │ │ │ │ │ ├── SubTotal.tsx
│ │ │ │ │ │ │ │ ├── Tax.tsx
│ │ │ │ │ │ │ │ └── Total.tsx
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── orderGrid/
│ │ │ │ │ │ ├── Grid.jsx
│ │ │ │ │ │ ├── Heading.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ └── rows/
│ │ │ │ │ │ ├── OrderNumber.tsx
│ │ │ │ │ │ ├── PaymentStatus.tsx
│ │ │ │ │ │ └── ShipmentStatus.tsx
│ │ │ │ │ ├── services/
│ │ │ │ │ │ ├── OrderCollection.js
│ │ │ │ │ │ ├── addOrderActivityLog.ts
│ │ │ │ │ │ ├── cancelOrder.ts
│ │ │ │ │ │ ├── createShipment.ts
│ │ │ │ │ │ ├── getOrdersBaseQuery.js
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── registerDefaultOrderCollectionFilters.js
│ │ │ │ │ │ ├── updateOrderStatus.ts
│ │ │ │ │ │ ├── updatePaymentStatus.ts
│ │ │ │ │ │ └── updateShipmentStatus.ts
│ │ │ │ │ └── subscribers/
│ │ │ │ │ └── order_placed/
│ │ │ │ │ └── sendOrderConfirmationEmail.ts
│ │ │ │ ├── paypal/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── paypalAuthorizePayment/
│ │ │ │ │ │ │ ├── [bodyParser]authorize.ts
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── paypalCaptureAuthorizedPayment/
│ │ │ │ │ │ │ ├── [bodyParser]capture.ts
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── paypalCapturePayment/
│ │ │ │ │ │ │ ├── [bodyParser]capture.ts
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── paypalCreateOrder/
│ │ │ │ │ │ ├── [bodyParser]createOrder.ts
│ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── bootstrap.js
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ └── PaypalSetting/
│ │ │ │ │ │ ├── PaypalSetting.admin.graphql
│ │ │ │ │ │ ├── PaypalSetting.admin.resolvers.js
│ │ │ │ │ │ ├── PaypalSetting.graphql
│ │ │ │ │ │ └── PaypalSetting.resolvers.js
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── admin/
│ │ │ │ │ │ │ ├── orderEdit/
│ │ │ │ │ │ │ │ └── PaypalCaptureButton.tsx
│ │ │ │ │ │ │ └── paymentSetting/
│ │ │ │ │ │ │ └── PaypalSetting.tsx
│ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ ├── checkout/
│ │ │ │ │ │ │ └── Paypal.tsx
│ │ │ │ │ │ ├── paypalCancel/
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── paypalReturn/
│ │ │ │ │ │ ├── Error.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── route.json
│ │ │ │ │ └── services/
│ │ │ │ │ ├── getApiBaseUrl.js
│ │ │ │ │ ├── requester.js
│ │ │ │ │ └── voidPaymentTransaction.js
│ │ │ │ ├── promotion/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── couponApply/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ │ ├── [validateCouponCode]applyCoupon.ts
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── validateCouponCode.js
│ │ │ │ │ │ ├── couponRemove/
│ │ │ │ │ │ │ ├── removeCoupon.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createCoupon/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── createCoupon[finish].js
│ │ │ │ │ │ │ ├── finish[apiResponse].js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── deleteCoupon/
│ │ │ │ │ │ │ ├── deleteCoupon.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── updateCoupon/
│ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ ├── finish[apiResponse].js
│ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ └── updateCoupon[finish].js
│ │ │ │ │ ├── bootstrap.js
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ └── Coupon/
│ │ │ │ │ │ ├── Coupon.admin.graphql
│ │ │ │ │ │ ├── Coupon.admin.resolvers.js
│ │ │ │ │ │ ├── Coupon.graphql
│ │ │ │ │ │ └── Coupon.resolvers.js
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ ├── Version-1.0.0.js
│ │ │ │ │ │ └── Version-1.0.1.js
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ └── admin/
│ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ ├── CouponMenuGroup.tsx
│ │ │ │ │ │ │ └── NewCouponQuickLink.tsx
│ │ │ │ │ │ ├── couponEdit/
│ │ │ │ │ │ │ ├── CouponEditForm.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── couponEdit+couponNew/
│ │ │ │ │ │ │ ├── CustomerCondition.tsx
│ │ │ │ │ │ │ ├── DiscountType.tsx
│ │ │ │ │ │ │ ├── General.scss
│ │ │ │ │ │ │ ├── General.tsx
│ │ │ │ │ │ │ ├── OrderCondition.tsx
│ │ │ │ │ │ │ ├── PageHeading.tsx
│ │ │ │ │ │ │ └── components/
│ │ │ │ │ │ │ ├── AttributeGroupConditionValueSelector.tsx
│ │ │ │ │ │ │ ├── BuyXGetY.tsx
│ │ │ │ │ │ │ ├── CategoryConditionValueSelector.tsx
│ │ │ │ │ │ │ ├── CollectionConditionValueSelector.tsx
│ │ │ │ │ │ │ ├── PriceConditionValueSelector.tsx
│ │ │ │ │ │ │ ├── RequireProducts.tsx
│ │ │ │ │ │ │ ├── Setting.tsx
│ │ │ │ │ │ │ ├── SkuConditionValueSelector.tsx
│ │ │ │ │ │ │ ├── TargetProducts.tsx
│ │ │ │ │ │ │ ├── ValueSelector.tsx
│ │ │ │ │ │ │ └── conditionCriterias.ts
│ │ │ │ │ │ ├── couponGrid/
│ │ │ │ │ │ │ ├── Grid.jsx
│ │ │ │ │ │ │ ├── Heading.tsx
│ │ │ │ │ │ │ ├── NewCouponButton.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ │ └── rows/
│ │ │ │ │ │ │ └── CouponName.tsx
│ │ │ │ │ │ ├── couponNew/
│ │ │ │ │ │ │ ├── CouponNewForm.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── navigation/
│ │ │ │ │ │ ├── CouponNewMenuItem.tsx
│ │ │ │ │ │ └── CouponsMenuItem.tsx
│ │ │ │ │ └── services/
│ │ │ │ │ ├── CouponCollection.js
│ │ │ │ │ ├── coupon/
│ │ │ │ │ │ ├── couponDataSchema.json
│ │ │ │ │ │ ├── createCoupon.js
│ │ │ │ │ │ ├── deleteCoupon.js
│ │ │ │ │ │ └── updateCoupon.js
│ │ │ │ │ ├── couponValidator.js
│ │ │ │ │ ├── discountCalculator.js
│ │ │ │ │ ├── getCartTotalBeforeDiscount.js
│ │ │ │ │ ├── getCouponsBaseQuery.js
│ │ │ │ │ ├── registerCartItemPromotionFields.js
│ │ │ │ │ ├── registerCartPromotionFields.js
│ │ │ │ │ ├── registerDefaultCalculators.js
│ │ │ │ │ ├── registerDefaultCouponCollectionFilters.js
│ │ │ │ │ └── registerDefaultValidators.js
│ │ │ │ ├── setting/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ └── saveSetting/
│ │ │ │ │ │ ├── [context]bodyParser[auth].ts
│ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ └── saveSetting.js
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ ├── Setting/
│ │ │ │ │ │ │ ├── Setting.graphql
│ │ │ │ │ │ │ └── Setting.resolvers.js
│ │ │ │ │ │ ├── ShippingSetting/
│ │ │ │ │ │ │ ├── ShippingSetting.graphql
│ │ │ │ │ │ │ └── ShippingSetting.resolvers.js
│ │ │ │ │ │ └── StoreSetting/
│ │ │ │ │ │ ├── StoreSetting.graphql
│ │ │ │ │ │ └── StoreSetting.resolvers.js
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ └── Version-1.0.0.js
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ └── admin/
│ │ │ │ │ │ ├── all/
│ │ │ │ │ │ │ ├── PaymentSettingMenu.tsx
│ │ │ │ │ │ │ ├── SettingMenuGroup.tsx
│ │ │ │ │ │ │ └── StoreSettingMenu.tsx
│ │ │ │ │ │ ├── paymentSetting/
│ │ │ │ │ │ │ ├── PaymentSetting.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── storeSetting/
│ │ │ │ │ │ ├── StoreSetting.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── route.json
│ │ │ │ │ └── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── setting.ts
│ │ │ │ ├── stripe/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── capturePaymentIntent/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── capturePaymentIntent.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── createPaymentIntent/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── createPaymentIntent.js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ ├── refundPaymentIntent/
│ │ │ │ │ │ │ ├── [context]bodyParser[auth].js
│ │ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ │ ├── refundPaymentIntent.js
│ │ │ │ │ │ │ └── route.json
│ │ │ │ │ │ └── stripeWebHook/
│ │ │ │ │ │ ├── [bodyJson]webhook.js
│ │ │ │ │ │ ├── bodyJson.js
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── bootstrap.js
│ │ │ │ │ ├── graphql/
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ └── StripeSetting/
│ │ │ │ │ │ ├── StripeSetting.admin.graphql
│ │ │ │ │ │ ├── StripeSetting.admin.resolvers.js
│ │ │ │ │ │ ├── StripeSetting.graphql
│ │ │ │ │ │ └── StripeSetting.resolvers.js
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── admin/
│ │ │ │ │ │ │ ├── orderEdit/
│ │ │ │ │ │ │ │ ├── StripeCaptureButton.jsx
│ │ │ │ │ │ │ │ └── StripeRefundButton.tsx
│ │ │ │ │ │ │ └── paymentSetting/
│ │ │ │ │ │ │ └── StripePayment.tsx
│ │ │ │ │ │ └── frontStore/
│ │ │ │ │ │ ├── checkout/
│ │ │ │ │ │ │ └── Stripe.tsx
│ │ │ │ │ │ └── stripeReturn/
│ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ └── route.json
│ │ │ │ │ └── services/
│ │ │ │ │ └── cancelPayment.js
│ │ │ │ └── tax/
│ │ │ │ ├── api/
│ │ │ │ │ ├── createTaxClass/
│ │ │ │ │ │ ├── [context]borderParser[auth].ts
│ │ │ │ │ │ ├── createTaxClass.ts
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── createTaxRate/
│ │ │ │ │ │ ├── [context]borderParser[auth].ts
│ │ │ │ │ │ ├── createTaxRate.ts
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── deleteTaxRate/
│ │ │ │ │ │ ├── [context]borderParser[auth].ts
│ │ │ │ │ │ ├── deleteTaxRate.ts
│ │ │ │ │ │ └── route.json
│ │ │ │ │ ├── updateTaxClass/
│ │ │ │ │ │ ├── [context]borderParser[auth].js
│ │ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ │ ├── route.json
│ │ │ │ │ │ └── updateTaxClass.js
│ │ │ │ │ └── updateTaxRate/
│ │ │ │ │ ├── [context]borderParser[auth].js
│ │ │ │ │ ├── payloadSchema.json
│ │ │ │ │ ├── route.json
│ │ │ │ │ └── updateTaxRate.js
│ │ │ │ ├── bootstrap.js
│ │ │ │ ├── graphql/
│ │ │ │ │ └── types/
│ │ │ │ │ ├── Product/
│ │ │ │ │ │ └── Price/
│ │ │ │ │ │ └── ProductPrice.resolvers.js
│ │ │ │ │ ├── TaxClass/
│ │ │ │ │ │ ├── TaxClass.admin.graphql
│ │ │ │ │ │ └── TaxClass.admin.resolvers.js
│ │ │ │ │ └── TaxSetting/
│ │ │ │ │ ├── TaxSetting.admin.graphql
│ │ │ │ │ ├── TaxSetting.admin.resolvers.js
│ │ │ │ │ ├── TaxSetting.graphql
│ │ │ │ │ └── TaxSetting.resolvers.js
│ │ │ │ ├── migration/
│ │ │ │ │ └── Version-1.0.0.js
│ │ │ │ ├── pages/
│ │ │ │ │ └── admin/
│ │ │ │ │ ├── all/
│ │ │ │ │ │ └── TaxSettingMenu.tsx
│ │ │ │ │ └── taxSetting/
│ │ │ │ │ ├── TaxSetting.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Rate.tsx
│ │ │ │ │ │ ├── RateForm.tsx
│ │ │ │ │ │ ├── Rates.tsx
│ │ │ │ │ │ ├── TaxClass.tsx
│ │ │ │ │ │ ├── TaxClassForm.tsx
│ │ │ │ │ │ └── TaxClasses.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── route.json
│ │ │ │ └── services/
│ │ │ │ ├── TaxClassCollection.js
│ │ │ │ ├── calculateTaxAmount.js
│ │ │ │ ├── getTaxPercent.js
│ │ │ │ ├── getTaxRates.js
│ │ │ │ ├── registerCartItemTaxPercentField.js
│ │ │ │ └── registerDefaultTaxClassCollectionFilters.js
│ │ │ └── types/
│ │ │ ├── apiResponse.ts
│ │ │ ├── appContext.tsx
│ │ │ ├── atLeastOne.ts
│ │ │ ├── checkoutData.ts
│ │ │ ├── componentLayout.ts
│ │ │ ├── cronjob.ts
│ │ │ ├── customerAddress.ts
│ │ │ ├── db/
│ │ │ │ └── index.ts
│ │ │ ├── event.ts
│ │ │ ├── extension.ts
│ │ │ ├── graphqlFilter.ts
│ │ │ ├── middleware.ts
│ │ │ ├── order.ts
│ │ │ ├── pageMeta.ts
│ │ │ ├── request.d.ts
│ │ │ ├── request.ts
│ │ │ ├── response.ts
│ │ │ ├── route.ts
│ │ │ └── widget.ts
│ │ └── tsconfig.json
│ └── postgres-query-builder/
│ ├── .swcrc
│ ├── LICENSE
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── fieldResolve.js
│ │ ├── index.ts
│ │ ├── isValueASQL.js
│ │ └── toString.js
│ └── tsconfig.json
├── translations/
│ ├── de/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── es/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── fa/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── fr/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── gr/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── hu/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ └── general.csv
│ ├── it/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── mn/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── nb/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── ne/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── nl/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── pt/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── rs/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── ru/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── ta/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ ├── vn/
│ │ ├── account.csv
│ │ ├── catalog.csv
│ │ ├── checkout.csv
│ │ ├── general.csv
│ │ └── paypal.csv
│ └── zh/
│ ├── account.csv
│ ├── catalog.csv
│ ├── checkout.csv
│ ├── general.csv
│ └── paypal.csv
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
open_collective: evershopcommerce
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: ''
assignees: treoden
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Background (please complete the following information):**
- NodeJS Version
- Postgres Version
- EverShop Version
- OS: [e.g. Window, Ubuntu, Mac-OS]
- Browser [e.g. Chrome, Safari]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: "[FEATURE REQUEST]"
labels: ''
assignees: treoden
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/pull_request_template.md
================================================
## PR Checklist
Please check if your PR fulfills the following requirements:
- [ ] Tests for the changes have been added (for bug fixes / features)
## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x". -->
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, local variables)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] CI related changes
- [ ] Other... Please describe:
## What is the current behavior?
<!-- Please describe the current behavior that you are modifying, or link to a relevant issue. -->
Issue Number: N/A
## What is the new behavior?
## Does this PR introduce a breaking change?
- [ ] Yes
- [ ] No
<!-- If this PR contains a breaking change, please describe the impact and migration path for existing applications below. -->
## Other information
================================================
FILE: .github/workflows/build_test.yml
================================================
name: Github build
on: [pull_request]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node: [ '20', '22']
name: Node ${{ matrix.node }}
steps:
- uses: actions/checkout@v2
- name: Setup node js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node }}
- run: npm install -g npm@9
- run: npm install
- run: npm run compile
- run: npm run compile:db
- run: npm run test
================================================
FILE: .gitignore
================================================
node_modules
.env
dist
!packages/create-evershop-app/sample/extensions/sample/dist
!packages/create-evershop-app/sample/themes/sample/dist
/extensions/*
!extensions/agegate
!extensions/azure_file_storage
!extensions/google_login
!extensions/s3_file_storage
!extensions/resend
!extensions/sendgrid
!extensions/product_review
/themes
.idea/*
.evershop
.vscode
npm-debug.log
/package-log.json
/media
/public
.DS_Store
.log
coverage
cypress
.turbo
/config
/packages/evershop/config
.prettierignore
.prettierrc
mysqlToPostgres.js
/docs
extensions
================================================
FILE: .husky/pre-commit
================================================
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
#FORCE_COLOR=1 npm run lint
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[support@evershop.io](mailto:support@evershop.io).
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
# License
EverShop is licensed under the GNU General Public License v3.0
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to EverShop
We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's:
- Reporting a bug
- Discussing the current state of the code
- Submitting a fix
- Proposing new features
---
- Read about our [Code Of Conduct](https://github.com/evershopcommerce/evershop/blob/main/CODE_OF_CONDUCT.md).
## Developing
To develop locally:
1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your
own GitHub account and then
[clone](https://help.github.com/articles/cloning-a-repository/) it to your local device.
```sh
git clone https://github.com/evershopcommerce/evershop.git
```
2. Create a new branch:
```
git checkout -b MY_BRANCH_NAME
```
3. Install the dependencies with:
```
npm install
```
4. Create a Postgres database:
```
// EverShop use Postgres for database storage
```
5. Run installation command to create a database schema:
```
npm run setup
```
6. Start development server:
```
npm run dev
```
7. Building
You can build with:
```bash
npm run build
```
8. Testing the production build
```bash
npm run start
```
9. Running tests
Run the [Jest](https://jestjs.io/) unit testing
```sh
npm run test
```
10. Running linting
```sh
npm run lint
```
11. Issue that [pull request!](https://github.com/github/docs/blob/main/CONTRIBUTING.md) to the `dev` branch.
## Any contributions you make will be under the GNU General Public License v3.0 Software License
In short, when you submit code changes, your submissions are understood to be under the same [GNU General Public License v3.0](https://github.com/evershopcommerce/evershop/blob/main/LICENSE) that covers the project. Feel free to contact the maintainers if that's a concern.
## Report bugs using Github's [issues](https://github.com/evershopcommerce/evershop/issues)
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](); it's that easy!
## Write bug reports with detail, background, and sample code
**Great Bug Reports** tend to have:
- A quick summary and/or background
- What EverShop version you are using
- What NodeJs version you are using
- What OS system you are using
- What Postgres version you are using
- Steps to reproduce
- Be specific!
- Give sample code if you can
- What you expected would happen
- What actually happens
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
## License
By contributing, you agree that your contributions will be licensed under its GNU General Public License v3.0 License.
================================================
FILE: Dockerfile
================================================
FROM node:18-alpine
WORKDIR /app
RUN npm install -g npm@9
COPY package*.json .
COPY packages ./packages
COPY themes ./themes
COPY extensions ./extensions
COPY public ./public
COPY media ./media
COPY config ./config
COPY translations ./translations
RUN npm install
RUN npm run build
EXPOSE 80
CMD ["npm", "run", "start"]
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
<p> </p>
<p align="center">
<img width="60" height="68" alt="EverShop Logo" src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/logo-green.png"/>
</p>
<p align="center">
<h1 align="center">EverShop</h1>
</p>
<h4 align="center">
<a href="https://evershop.io/docs/development/getting-started/introduction">Documentation</a> |
<a href="https://demo.evershop.io/">Demo</a>
</h4>
<p align="center">
<img src="https://github.com/evershopcommerce/evershop/actions/workflows/build_test.yml/badge.svg" alt="Github Action"> <a href="https://twitter.com/evershopjs"><img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/evershopjs?style=social"></a> <a href="https://discord.gg/GSzt7dt7RM"><img src="https://img.shields.io/discord/757179260417867879?label=discord" alt="Discord"></a> <a href="https://opensource.org/licenses/GPL-3.0"><img src="https://img.shields.io/badge/License-GPLv3-blue.svg" alt="License"></a>
</p>
<p align="center">
<img alt="EverShop" width="950" src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/banner.png"/>
</p>
## Introduction
EverShop is a modern, TypeScript-first eCommerce platform built with GraphQL and React. Designed for developers, it offers essential commerce features in a modular, fully customizable architecture—perfect for building tailored shopping experiences with confidence and speed.
## Installation Using Docker
You can get started with EverShop in minutes by using the Docker image. The Docker image is a great way to get started with EverShop without having to worry about installing dependencies or configuring your environment.
```bash
curl -sSL https://raw.githubusercontent.com/evershopcommerce/evershop/main/docker-compose.yml > docker-compose.yml
docker compose up -d
```
For the full installation guide, please refer to our [Installation guide](https://evershop.io/docs/development/getting-started/installation-guide).
## Documentation
- [Installation guide](https://evershop.io/docs/development/getting-started/installation-guide).
- [Extension development](https://evershop.io/docs/development/module/create-your-first-extension).
- [Theme development](https://evershop.io/docs/development/theme/theme-overview).
## Demo
Explore our demo store.
<p align="left">
<a href="https://demo.evershop.io/admin" target="_blank">
<img alt="evershop-backend-demo" height="35" alt="EverShop Admin Demo" src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/evershop-demo-back.png"/>
</a>
<a href="https://demo.evershop.io/" target="_blank">
<img alt="evershop-store-demo" height="35" alt="EverShop Store Demo" src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/evershop-demo-front.png"/>
</a>
</p>
<b>Demo user:</b>
Email: demo@evershop.io<br/>
Password: 123456
## Support
If you like my work, feel free to:
- ⭐ this repository. It helps.
- [][tweet] about EverShop. Thank you!
[tweet]: https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fevershopcommerce%2Fevershop&text=Awesome%20React%20Ecommerce%20Project&hashtags=react,ecommerce,expressjs,graphql
## Contributing
EverShop is an open-source project. We are committed to a fully transparent development process and appreciate highly any contributions. Whether you are helping us fix bugs, proposing new features, improving our documentation or spreading the word - we would love to have you as part of the EverShop community.
### Ask a question about EverShop
You can ask questions, and participate in discussions about EverShop-related topics in the EverShop Discord channel.
<a href="https://discord.gg/GSzt7dt7RM"><img src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/discord_banner_github.svg" /></a>
### Create a bug report
If you see an error message or run into an issue, please [create bug report](https://github.com/evershopcommerce/evershop/issues/new). This effort is valued and it will help all EverShop users.
### Submit a feature request
If you have an idea, or you're missing a capability that would make development easier and more robust, please [Submit feature request](https://github.com/evershopcommerce/evershop/issues/new).
If a similar feature request already exists, don't forget to leave a "+1".
If you add some more information such as your thoughts and vision about the feature, your comments will be embraced warmly :)
Please refer to our [Contribution Guidelines](./CONTRIBUTING.md) and [Code of Conduct](./CODE_OF_CONDUCT.md).
## 🚀 The Future of EverShop
EverShop is seeing rapid organic growth and strong adoption from the developer community. We are now scaling our operations and building **EverShop Cloud**.
If you are a strategic investor interested in the future of Node.js commerce and our mission to set a new standard for modern eCommerce, we’d love to share our vision and roadmap with you.
📩 **Get in touch:** support@evershop.io
## License
[GPL-3.0 License](https://github.com/evershopcommerce/evershop/blob/main/LICENSE)
================================================
FILE: docker-compose.yml
================================================
version: '3.8'
services:
app:
image: evershop/evershop:latest
restart: always
environment:
DB_HOST: database
DB_PORT: 5432
DB_PASSWORD: postgres
DB_USER: postgres
DB_NAME: postgres
networks:
- myevershop
depends_on:
- database
ports:
- 3000:3000
#The postgres database:
database:
image: postgres:16
restart: unless-stopped
volumes:
- postgres-data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: postgres
ports:
- "5432:5432"
networks:
- myevershop
networks:
myevershop:
name: MyEverShop
driver: bridge
volumes:
postgres-data:
================================================
FILE: eslint.config.js
================================================
// eslint.config.js
import eslintPluginTypescript from '@typescript-eslint/eslint-plugin';
import typescriptParser from '@typescript-eslint/parser';
import pluginImport from 'eslint-plugin-import';
import jsxA11y from 'eslint-plugin-jsx-a11y';
import pluginReact from 'eslint-plugin-react';
export default [
{
ignores: [
"/node_modules/",
"**/*test.js",
"**/tests/**",
"**/create-evershop-app/**",
"**/.evershop/**",
"/.vscode/**",
"/.git/**",
"/.idea/**",
"**/extensions/**",
"**/public/**",
"**/themes/**",
"**/media/**",
"**/dist/**",
"**/packages/*/dist/**",
"**/packages/evershop/dist/**",
"**/packages/postgres-query-builder/dist/**",
"**/packages/product_review/**",
"**/packages/resend/**"
]},
pluginReact.configs.flat.recommended,
pluginReact.configs.flat['jsx-runtime'],
jsxA11y.flatConfigs.recommended,
{
files: ["**/*.ts", "**/*.tsx", "**/*.d.ts"],
plugins: {
"@typescript-eslint": eslintPluginTypescript
},
languageOptions: {
parser: typescriptParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module'
}
}
},
{
plugins: {
"import": pluginImport
},
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
parserOptions : {
ecmaFeatures: {
jsx: true
}
}
},
rules: {
semi: "off",
"prefer-const": "error",
"import/no-dynamic-require": 0,
"no-else-return": "off",
"import/prefer-default-export": 0,
"jsx-a11y/anchor-is-valid": 0,
"import/no-extraneous-dependencies": "off",
"import/no-unresolved": "off",
"camelcase": "off",
"no-multi-assign": "off",
"no-template-curly-in-string": "off",
"react/no-array-index-key": "off",
"react/no-unstable-nested-components": "off",
"no-continue": "off",
"no-await-in-loop": "off",
"no-use-before-define" : "off",
"global-require": "off",
"import/extensions": "off",
"no-shadow": "off",
"no-lonely-if": "warn",
"no-console": "error",
"no-useless-return": "off",
"react/display-name": "off",
"jsx-a11y/label-has-associated-control": "off",
"jsx-a11y/role-supports-aria-props": "warn",
"jsx-a11y/no-noninteractive-element-interactions": "warn",
// Add import sorting rules
"import/order": ["warn", {
"groups": ["builtin", "external", "internal", "parent", "sibling", "index"],
"newlines-between": "never",
"alphabetize": {
"order": "asc",
"caseInsensitive": true
}
}]
},
settings: {
react: {
version: "detect"
}
}
}
]
================================================
FILE: jest.config.js
================================================
export default {
testEnvironment: "node",
moduleNameMapper: {
'^@evershop/postgres-query-builder$': '<rootDir>/packages/postgres-query-builder/dist/index.js',
'^@evershop/postgres-query-builder/(.*)$': '<rootDir>/packages/postgres-query-builder/dist/$1',
'^(\\.{1,2}/.*)\\.js$': '$1'
},
transformIgnorePatterns: [
"/node_modules/(?!(@evershop)/)"
],
testMatch: ["**/dist/**/tests/**/unit/**/*.test.[jt]s"],
modulePathIgnorePatterns: ["<rootDir>/packages/evershop/src/"]
};
================================================
FILE: package.json
================================================
{
"name": "evershop",
"version": "2.1.0",
"type": "module",
"description": "A shopping cart platform with Express, React and Postgres",
"workspaces": [
"packages/*",
"extensions/*"
],
"scripts": {
"dev": "node ./packages/evershop/dist/bin/dev/index.js",
"start": "node ./packages/evershop/dist/bin/start/index.js",
"build": "node ./packages/evershop/dist/bin/build/index.js",
"build-fast": "evershop build -- --skip-minify",
"setup": "evershop install",
"theme:active": "evershop theme:active",
"theme:twizz": "evershop theme:twizz",
"theme:create": "evershop theme:create",
"compile": "rimraf ./packages/evershop/dist && cd ./packages/evershop && swc ./src/ -d dist/ --config-file .swcrc --copy-files --strip-leading-paths",
"compile:db": "rimraf ./packages/postgres-query-builder/dist && cd ./packages/postgres-query-builder && swc ./src/ -d dist/ --config-file .swcrc --copy-files --strip-leading-paths",
"compile:tsc": "rimraf ./packages/evershop/dist && cd ./packages/evershop && tsc && copyfiles -u 1 \"src/**/*.{graphql,scss,css,json}\" dist",
"start:debug": "node ./packages/evershop/dist/bin/start/index.js --debug",
"test": "ALLOW_CONFIG_MUTATIONS=true NODE_OPTIONS=--experimental-vm-modules node_modules/jest/bin/jest.js",
"lint": "eslint --fix --ext .js,.jsx,.ts,.tsx ./packages",
"prepare": "husky install"
},
"author": "The Nguyen (https://evershop.io)",
"license": "GNU GENERAL PUBLIC LICENSE 3.0",
"devDependencies": {
"@parcel/watcher": "^2.5.1",
"@swc/cli": "^0.7.7",
"@swc/core": "^1.11.29",
"@types/jest": "^29.5.14",
"@types/jsonwebtoken": "^9.0.10",
"@typescript-eslint/eslint-plugin": "^8.32.0",
"@typescript-eslint/parser": "^8.32.0",
"copyfiles": "^2.4.1",
"cypress": "^13.15.1",
"eslint": "^9.24.0",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"execa": "^9.6.0",
"husky": "^8.0.3",
"jest": "^29.7.0",
"prettier": "2.8.4",
"reflect-metadata": "^0.1.13",
"rimraf": "^6.0.1",
"swc-minify-webpack-plugin": "^2.1.3",
"tailwindcss": "^4.1.18",
"typescript": "^5.8.3",
"webpack-bundle-analyzer": "^4.10.2"
},
"dependencies": {
"@sendgrid/mail": "^8.1.6",
"@types/react-slick": "^0.23.13",
"@types/uuid": "^10.0.0",
"uuid": "^13.0.0"
}
}
================================================
FILE: packages/create-evershop-app/README.md
================================================
# create-evershop-app
This package includes the global command for [Create EverShop App](https://evershop.io/).<br> Please refer to its documentation:
- [Getting Started](https://evershop.io/docs/development/getting-started/introduction) – How to create a new app.
- [Development Guide](https://evershop.io/docs/development/) – How to develop an ecommerce web app with EverShop.
================================================
FILE: packages/create-evershop-app/createEverShopApp.js
================================================
const https = require('https');
const chalk = require('chalk');
const commander = require('commander');
const dns = require('dns');
const { execSync } = require('child_process');
const fs = require('fs-extra');
const os = require('os');
const path = require('path');
const semver = require('semver');
const spawn = require('cross-spawn');
const url = require('url');
const validateProjectName = require('validate-npm-package-name');
const { mkdir } = require('fs/promises');
const packageJson = require('./package.json');
function isUsingYarn() {
return (process.env.npm_config_user_agent || '').indexOf('yarn') === 0;
}
let projectName;
function init() {
const program = new commander.Command(packageJson.name)
.version(packageJson.version)
.arguments('[project-directory]')
.usage(`${chalk.green('<project-directory>')} [options]`)
.action((name) => {
projectName = name;
})
.option('--verbose', 'Print additional logs')
.option('--info', 'Print environment debug info')
.on('--help', () => {
console.log(
` Only ${chalk.green('<project-directory>')} is required.`
);
console.log();
console.log(
` If you have any problems, do not hesitate to file an issue:`
);
console.log(
` ${chalk.cyan(
'https://github.com/evershop/create-evershop-app/issues/new'
)}`
);
console.log();
})
.parse(process.argv);
const options = program.opts();
if (typeof projectName === 'undefined') {
console.error('Please specify the project directory:');
console.log(
` ${chalk.cyan(program.name())} ${chalk.green('<project-directory>')}`
);
console.log();
console.log('For example:');
console.log(
` ${chalk.cyan(program.name())} ${chalk.green('my-evershop-app')}`
);
console.log();
console.log(
`Run ${chalk.cyan(`${program.name()} --help`)} to see all options.`
);
process.exit(1);
}
// We first check the registry directly via the API, and if that fails, we try
// the slower `npm view [package] version` command.
//
// This is important for users in environments where direct access to npm is
// blocked by a firewall, and packages are provided exclusively via a private
// registry.
checkForLatestVersion()
.catch(() => {
try {
return execSync('npm view create-evershop-app version')
.toString()
.trim();
} catch (e) {
return null;
}
})
.then((latest) => {
if (latest && semver.lt(packageJson.version, latest)) {
console.log();
console.error(
chalk.yellow(
`You are running \`create-evershop-app\` ${packageJson.version}, which is behind the latest release (${latest}).\n\n` +
'We recommend always using the latest version of create-evershop-app if possible.'
)
);
console.log();
console.log(
'The latest instructions for creating a new app can be found here:\n' +
'https://evershop.io/docs/development/getting-started/installation-guide/'
);
console.log();
} else {
const useYarn = isUsingYarn();
createApp(projectName, options.verbose, useYarn);
}
});
}
function createApp(name, verbose, useYarn) {
const root = path.resolve(name);
const appName = path.basename(root);
checkAppName(appName);
fs.ensureDirSync(name);
if (!isSafeToCreateProjectIn(root, name)) {
process.exit(1);
}
console.log();
console.log(`Creating a new EverShop app in ${chalk.green(root)}.`);
console.log();
const packageJson = {
name: appName,
version: '0.1.0',
type: 'module',
private: true,
scripts: {
setup: 'evershop install',
start: 'evershop start',
build: 'evershop build',
dev: 'evershop dev'
}
};
fs.writeFileSync(
path.join(root, 'package.json'),
JSON.stringify(packageJson, null, 2) + os.EOL
);
const originalDirectory = process.cwd();
process.chdir(root);
if (!useYarn && !checkThatNpmCanReadCwd()) {
process.exit(1);
}
if (!useYarn) {
const npmInfo = checkNpmVersion();
if (!npmInfo.hasMinNpm) {
if (npmInfo.npmVersion) {
console.log(
chalk.yellow(
`Please update to npm 7 or higher for a workspaces feature.\n`
)
);
}
}
}
run(root, appName, verbose, originalDirectory, useYarn);
}
function install(root, useYarn, dependencies, verbose, isOnline) {
return new Promise((resolve, reject) => {
let command;
let args;
if (useYarn) {
command = 'yarnpkg';
args = ['add', '--exact'];
if (!isOnline) {
args.push('--offline');
}
[].push.apply(args, dependencies);
// Explicitly set cwd() to work around issues like
// https://github.com/facebook/create-react-app/issues/3326.
// Unfortunately we can only do this for Yarn because npm support for
// equivalent --prefix flag doesn't help with this issue.
// This is why for npm, we run checkThatNpmCanReadCwd() early instead.
args.push('--cwd');
args.push(root);
if (!isOnline) {
console.log(chalk.yellow('You appear to be offline.'));
console.log(chalk.yellow('Falling back to the local Yarn cache.'));
console.log();
}
} else {
command = 'npm';
args = [
'install',
'--no-audit', // https://github.com/facebook/create-evershop-app/issues/11174
'--save',
'--save-exact',
'--loglevel',
'error'
].concat(dependencies);
}
if (verbose) {
args.push('--verbose');
}
const child = spawn(command, args, { stdio: 'inherit' });
child.on('close', (code) => {
if (code !== 0) {
reject({
command: `${command} ${args.join(' ')}`
});
return;
}
resolve();
});
});
}
function installDevDependencies(
root,
useYarn,
devDependencies,
verbose,
isOnline
) {
console.log(`Installing some development dependencies...`);
return new Promise((resolve, reject) => {
let command;
let args;
if (useYarn) {
command = 'yarnpkg';
args = ['add', '--exact'];
if (!isOnline) {
args.push('--offline');
}
[].push.apply(args, devDependencies);
args.push('--dev');
// Explicitly set cwd() to work around issues like
// https://github.com/facebook/create-react-app/issues/3326.
// Unfortunately we can only do this for Yarn because npm support for
// equivalent --prefix flag doesn't help with this issue.
// This is why for npm, we run checkThatNpmCanReadCwd() early instead.
args.push('--cwd');
args.push(root);
if (!isOnline) {
console.log(chalk.yellow('You appear to be offline.'));
console.log(chalk.yellow('Falling back to the local Yarn cache.'));
console.log();
}
} else {
command = 'npm';
args = [
'install',
'--no-audit', // https://github.com/facebook/create-evershop-app/issues/11174
'--save',
'--save-exact',
'--loglevel',
'error'
].concat(devDependencies);
args.push('--save-dev');
}
if (verbose) {
args.push('--verbose');
}
const child = spawn(command, args, { stdio: 'inherit' });
child.on('close', (code) => {
if (code !== 0) {
reject({
command: `${command} ${args.join(' ')}`
});
return;
}
resolve();
});
});
}
function run(root, appName, verbose, originalDirectory, useYarn) {
console.log(`Installing ${chalk.cyan('@evershop/evershop')}`);
checkIfOnline(useYarn)
.then((isOnline) => ({
isOnline
}))
.then(({ isOnline }) => {
const allDependencies = ['@evershop/evershop'];
return install(root, useYarn, allDependencies, verbose, isOnline).then(
async () => {
await installDevDependencies(
root,
useYarn,
[
'@parcel/watcher',
'@types/config',
'@types/express',
'@types/node',
'@types/pg',
'@types/react',
'execa',
'typescript'
],
verbose,
isOnline
);
await createConfigFile(root);
await createSampleExtension(root);
await createSampleTheme(root);
await setUpEverShop(root);
}
);
})
.catch((reason) => {
console.log(reason);
console.log();
console.log('Aborting installation.');
if (reason.command) {
console.log(` ${chalk.cyan(reason.command)} has failed.`);
} else {
console.log(chalk.red('Unexpected error. Please report it as a bug:'));
console.log(reason);
}
console.log();
// On 'exit' we will delete these files from target directory.
const knownGeneratedFiles = [
'package.json',
'node_modules',
'package-lock.json'
];
const currentFiles = fs.readdirSync(path.join(root));
currentFiles.forEach((file) => {
knownGeneratedFiles.forEach((fileToMatch) => {
// This removes all knownGeneratedFiles.
if (file === fileToMatch) {
console.log(`Deleting generated file... ${chalk.cyan(file)}`);
fs.removeSync(path.join(root, file));
}
});
});
const remainingFiles = fs.readdirSync(path.join(root));
if (!remainingFiles.length) {
// Delete target folder if empty
console.log(
`Deleting ${chalk.cyan(`${appName}/`)} from ${chalk.cyan(
path.resolve(root, '..')
)}`
);
process.chdir(path.resolve(root, '..'));
fs.removeSync(path.join(root));
}
console.log('Done.');
process.exit(1);
});
}
function checkNpmVersion() {
let hasMinNpm = true;
let npmVersion = null;
try {
npmVersion = execSync('npm --version').toString().trim();
hasMinNpm = semver.gte(npmVersion, '7.0.0');
} catch (err) {
// ignore
}
return {
hasMinNpm,
npmVersion
};
}
function checkAppName(appName) {
const validationResult = validateProjectName(appName);
if (appName === 'dist') {
console.error(
chalk.red(
`Cannot create a project named ${chalk.green(
`"${appName}"`
)} because it is reserved for the distribution files.\n` +
`Please choose a different project name.`
)
);
process.exit(1);
}
if (!validationResult.validForNewPackages) {
console.error(
chalk.red(
`Cannot create a project named ${chalk.green(
`"${appName}"`
)} because of npm naming restrictions:\n`
)
);
[
...(validationResult.errors || []),
...(validationResult.warnings || [])
].forEach((error) => {
console.error(chalk.red(` * ${error}`));
});
console.error(chalk.red('\nPlease choose a different project name.'));
process.exit(1);
}
// TODO: there should be a single place that holds the dependencies
const dependencies = ['react', 'react-dom', 'react-scripts'].sort();
if (dependencies.includes(appName)) {
console.error(
chalk.red(
`Cannot create a project named ${chalk.green(
`"${appName}"`
)} because a dependency with the same name exists.\n` +
`Due to the way npm works, the following names are not allowed:\n\n`
) +
chalk.cyan(dependencies.map((depName) => ` ${depName}`).join('\n')) +
chalk.red('\n\nPlease choose a different project name.')
);
process.exit(1);
}
}
// If project only contains files generated by GH, it’s safe.
// Also, if project contains remnant error logs from a previous
// installation, lets remove them now.
// We also special case IJ-based products .idea because it integrates with CRA:
// https://github.com/facebook/create-evershop-app/pull/368#issuecomment-243446094
function isSafeToCreateProjectIn(root, name) {
const validFiles = [
'.DS_Store',
'.git',
'.gitattributes',
'.gitignore',
'.gitlab-ci.yml',
'.hg',
'.hgcheck',
'.hgignore',
'.idea',
'.npmignore',
'.travis.yml',
'docs',
'LICENSE',
'README.md',
'mkdocs.yml',
'Thumbs.db'
];
// These files should be allowed to remain on a failed install, but then
// silently removed during the next create.
const errorLogFilePatterns = [
'npm-debug.log',
'yarn-error.log',
'yarn-debug.log'
];
const isErrorLog = (file) =>
errorLogFilePatterns.some((pattern) => file.startsWith(pattern));
const conflicts = fs
.readdirSync(root)
.filter((file) => !validFiles.includes(file))
// IntelliJ IDEA creates module files before CRA is launched
.filter((file) => !/\.iml$/.test(file))
// Don't treat log files from previous installation as conflicts
.filter((file) => !isErrorLog(file));
if (conflicts.length > 0) {
console.log(
`The directory ${chalk.green(name)} contains files that could conflict:`
);
console.log();
for (const file of conflicts) {
try {
const stats = fs.lstatSync(path.join(root, file));
if (stats.isDirectory()) {
console.log(` ${chalk.blue(`${file}/`)}`);
} else {
console.log(` ${file}`);
}
} catch (e) {
console.log(` ${file}`);
}
}
console.log();
console.log(
'Either try using a new directory name, or remove the files listed above.'
);
return false;
}
// Remove any log files from a previous installation.
fs.readdirSync(root).forEach((file) => {
if (isErrorLog(file)) {
fs.removeSync(path.join(root, file));
}
});
return true;
}
function getProxy() {
if (process.env.https_proxy) {
return process.env.https_proxy;
} else {
try {
// Trying to read https-proxy from .npmrc
const httpsProxy = execSync('npm config get https-proxy')
.toString()
.trim();
return httpsProxy !== 'null' ? httpsProxy : undefined;
} catch (e) {}
}
}
// See https://github.com/facebook/create-evershop-app/pull/3355
function checkThatNpmCanReadCwd() {
const cwd = process.cwd();
let childOutput = null;
try {
// Note: intentionally using spawn over exec since
// the problem doesn't reproduce otherwise.
// `npm config list` is the only reliable way I could find
// to reproduce the wrong path. Just printing process.cwd()
// in a Node process was not enough.
childOutput = spawn.sync('npm', ['config', 'list']).output.join('');
} catch (err) {
// Something went wrong spawning node.
// Not great, but it means we can't do this check.
// We might fail later on, but let's continue.
return true;
}
if (typeof childOutput !== 'string') {
return true;
}
const lines = childOutput.split('\n');
// `npm config list` output includes the following line:
// "; cwd = C:\path\to\current\dir" (unquoted)
// I couldn't find an easier way to get it.
const prefix = '; cwd = ';
const line = lines.find((line) => line.startsWith(prefix));
if (typeof line !== 'string') {
// Fail gracefully. They could remove it.
return true;
}
const npmCWD = line.substring(prefix.length);
if (npmCWD === cwd) {
return true;
}
console.error(
chalk.red(
`Could not start an npm process in the right directory.\n\n` +
`The current directory is: ${chalk.bold(cwd)}\n` +
`However, a newly started npm process runs in: ${chalk.bold(
npmCWD
)}\n\n` +
`This is probably caused by a misconfigured system terminal shell.`
)
);
if (process.platform === 'win32') {
console.error(
`${chalk.red(
`On Windows, this can usually be fixed by running:\n\n`
)} ${chalk.cyan(
'reg'
)} delete "HKCU\\Software\\Microsoft\\Command Processor" /v AutoRun /f\n` +
` ${chalk.cyan(
'reg'
)} delete "HKLM\\Software\\Microsoft\\Command Processor" /v AutoRun /f\n\n${chalk.red(
`Try to run the above two lines in the terminal.\n`
)}${chalk.red(
`To learn more about this problem, read: https://blogs.msdn.microsoft.com/oldnewthing/20071121-00/?p=24433/`
)}`
);
}
return false;
}
function checkIfOnline(useYarn) {
if (!useYarn) {
// Don't ping the Yarn registry.
// We'll just assume the best case.
return Promise.resolve(true);
}
return new Promise((resolve) => {
dns.lookup('registry.yarnpkg.com', (err) => {
let proxy;
if (err != null && (proxy = getProxy())) {
// If a proxy is defined, we likely can't resolve external hostnames.
// Try to resolve the proxy name as an indication of a connection.
dns.lookup(url.parse(proxy).hostname, (proxyErr) => {
resolve(proxyErr == null);
});
} else {
resolve(err == null);
}
});
});
}
async function setUpEverShop(projectDir) {
// Use spawn to run 'npm run setup' command from the project directory
await new Promise((resolve, reject) => {
const child = spawn('npm', ['run', 'setup'], {
cwd: projectDir,
stdio: 'inherit'
});
child.on('close', (code) => {
if (code !== 0) {
reject({
command: 'npm run setup'
});
return;
}
resolve();
});
});
}
async function createConfigFile(projectDir) {
console.log(
`Creating ${chalk.cyan('config/default.json')} in ${chalk.green(
projectDir
)}`
);
const config = {
shop: {
language: 'en',
currency: 'USD'
},
system: {
extensions: [
{
name: 'sample',
resolve: 'extensions/sample',
enabled: true
}
],
theme: 'sample'
}
};
await mkdir(path.resolve(projectDir, 'config'), { recursive: true });
fs.writeFileSync(
path.join(projectDir, 'config', 'default.json'),
JSON.stringify(config, null, 2) + os.EOL
);
}
async function createSampleExtension(projectDir) {
console.log(
`Creating ${chalk.cyan('extensions/sample')} in ${chalk.green(projectDir)}`
);
// Copy the extensions folder from the package to the project directory
const sourceDir = path.resolve(__dirname, 'sample/extensions');
const targetDir = path.resolve(projectDir, 'extensions');
await fs.copy(sourceDir, targetDir);
}
async function createSampleTheme(projectDir) {
console.log(
`Creating ${chalk.cyan('themes/sample')} in ${chalk.green(projectDir)}`
);
// Copy the themes folder from the package to the project directory
const sourceDir = path.resolve(__dirname, 'sample/themes');
const targetDir = path.resolve(projectDir, 'themes');
await fs.copy(sourceDir, targetDir);
}
function checkForLatestVersion() {
return new Promise((resolve, reject) => {
https
.get(
'https://registry.npmjs.org/-/package/create-evershop-app/dist-tags',
(res) => {
if (res.statusCode === 200) {
let body = '';
res.on('data', (data) => (body += data));
res.on('end', () => {
resolve(JSON.parse(body).latest);
});
} else {
reject();
}
}
)
.on('error', () => {
reject();
});
});
}
module.exports = {
init
};
================================================
FILE: packages/create-evershop-app/index.js
================================================
#!/usr/bin/env node
const currentNodeVersion = process.versions.node;
const semver = currentNodeVersion.split('.');
const major = semver[0];
if (major < 14) {
console.error(
`You are running Node ${currentNodeVersion}.\n` +
`Create React App requires Node 14 or higher. \n` +
`Please update your version of Node.`
);
process.exit(1);
}
const { init } = require('./createEverShopApp');
init();
================================================
FILE: packages/create-evershop-app/package.json
================================================
{
"name": "create-evershop-app",
"version": "2.3.0",
"description": "Create EverShop App",
"main": "index.js",
"files": [
"index.js",
"createEverShopApp.js",
"sample"
],
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"bin": {
"create-evershop-app": "./index.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/evershopcommerce/evershop.git"
},
"author": "The Nguyen",
"license": "ISC",
"bugs": {
"url": "https://github.com/evershopcommerce/evershop/issues"
},
"homepage": "https://github.com/evershopcommerce/evershop#readme",
"dependencies": {
"boxen": "^5.1.2",
"chalk": "^4.1.2",
"commander": "^9.4.1",
"cross-spawn": "^7.0.3",
"fs-extra": "^10.0.0",
"semver": "^7.6.3",
"validate-npm-package-name": "^4.0.0"
}
}
================================================
FILE: packages/create-evershop-app/sample/themes/sample/dist/pages/all/EveryWhere.d.ts
================================================
import React from 'react';
export default function EveryWhere(): React.JSX.Element;
export declare const layout: {
areaId: string;
sortOrder: number;
};
================================================
FILE: packages/create-evershop-app/sample/themes/sample/dist/pages/all/EveryWhere.js
================================================
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.layout = void 0;
exports.default = EveryWhere;
const react_1 = __importDefault(require("react"));
function EveryWhere() {
return (react_1.default.createElement("div", { className: "container mx-auto px-4 py-8 bg-gray-100 rounded-lg shadow-md mt-10" },
react_1.default.createElement("h1", { className: "font-bold text-center mb-6" }, "Everywhere"),
react_1.default.createElement("p", { className: "text-gray-700 text-center" }, "This component is rendered on every page of the store front."),
react_1.default.createElement("p", { className: "text-gray-700 text-center" },
"You can modify this component at",
' ',
react_1.default.createElement("code", null, "`themes/sample/src/pages/all/EveryWhere.tsx`")),
react_1.default.createElement("p", { className: " text-gray-700 text-center" }, "You can also remove this by disabling the theme `sample`.")));
}
exports.layout = {
areaId: 'content',
sortOrder: 20
};
//# sourceMappingURL=EveryWhere.js.map
================================================
FILE: packages/create-evershop-app/sample/themes/sample/dist/pages/all/EveryWhere.js.map
================================================
{"version":3,"file":"EveryWhere.js","sourceRoot":"","sources":["../../../src/pages/all/EveryWhere.tsx"],"names":[],"mappings":";;;;;;AAEA,6BAgBC;AAlBD,kDAA0B;AAE1B,SAAwB,UAAU;IAChC,OAAO,CACL,uCAAK,SAAS,EAAC,oEAAoE;QACjF,sCAAI,SAAS,EAAC,4BAA4B,iBAAgB;QAC1D,qCAAG,SAAS,EAAC,2BAA2B,mEAEpC;QACJ,qCAAG,SAAS,EAAC,2BAA2B;;YACL,GAAG;YACpC,2FAAyD,CACvD;QACJ,qCAAG,SAAS,EAAC,4BAA4B,gEAErC,CACA,CACP,CAAC;AACJ,CAAC;AAEY,QAAA,MAAM,GAAG;IACpB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,EAAE;CACd,CAAC"}
================================================
FILE: packages/create-evershop-app/sample/themes/sample/dist/pages/homepage/OnlyHomePage.d.ts
================================================
import React from 'react';
export default function OnlyHomePage(): React.JSX.Element;
export declare const layout: {
areaId: string;
sortOrder: number;
};
================================================
FILE: packages/create-evershop-app/sample/themes/sample/dist/pages/homepage/OnlyHomePage.js
================================================
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.layout = void 0;
exports.default = OnlyHomePage;
const react_1 = __importDefault(require("react"));
function OnlyHomePage() {
return (react_1.default.createElement("div", { className: "container mx-auto px-4 py-8 bg-gray-100 rounded-lg shadow-md mt-10" },
react_1.default.createElement("h1", { className: "font-bold text-center mb-6" }, "Home Page Only"),
react_1.default.createElement("p", { className: " text-gray-700 text-center" }, "This component is only rendered on the home page."),
react_1.default.createElement("p", { className: " text-gray-700 text-center" },
"You can modify this component at",
' ',
react_1.default.createElement("code", null, "`themes/sample/src/pages/homepage/OnlyHomePage.tsx`")),
react_1.default.createElement("p", { className: " text-gray-700 text-center" }, "You can also remove this by disabling the theme `sample`.")));
}
exports.layout = {
areaId: 'content',
sortOrder: 10
};
//# sourceMappingURL=OnlyHomePage.js.map
================================================
FILE: packages/create-evershop-app/sample/themes/sample/dist/pages/homepage/OnlyHomePage.js.map
================================================
{"version":3,"file":"OnlyHomePage.js","sourceRoot":"","sources":["../../../src/pages/homepage/OnlyHomePage.tsx"],"names":[],"mappings":";;;;;;AAEA,+BAgBC;AAlBD,kDAA0B;AAE1B,SAAwB,YAAY;IAClC,OAAO,CACL,uCAAK,SAAS,EAAC,oEAAoE;QACjF,sCAAI,SAAS,EAAC,4BAA4B,qBAAoB;QAC9D,qCAAG,SAAS,EAAC,4BAA4B,wDAErC;QACJ,qCAAG,SAAS,EAAC,4BAA4B;;YACN,GAAG;YACpC,kGAAgE,CAC9D;QACJ,qCAAG,SAAS,EAAC,4BAA4B,gEAErC,CACA,CACP,CAAC;AACJ,CAAC;AAEY,QAAA,MAAM,GAAG;IACpB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,EAAE;CACd,CAAC"}
================================================
FILE: packages/create-evershop-app/sample/themes/sample/package.json
================================================
{
"name": "sample-evershop-theme",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"tsc": "tsc"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": ""
}
================================================
FILE: packages/create-evershop-app/sample/themes/sample/src/pages/all/EveryWhere.tsx
================================================
import React from 'react';
export default function EveryWhere() {
return (
<div className="container mx-auto px-4 py-8 bg-gray-100 rounded-lg shadow-md mt-10">
<h1 className="font-bold text-center mb-6">Everywhere</h1>
<p className="text-gray-700 text-center">
This component is rendered on every page of the store front.
</p>
<p className="text-gray-700 text-center">
You can modify this component at{' '}
<code>`themes/sample/src/pages/all/EveryWhere.tsx`</code>
</p>
<p className=" text-gray-700 text-center">
You can also remove this by disabling the theme `sample`.
</p>
</div>
);
}
export const layout = {
areaId: 'content',
sortOrder: 20
};
================================================
FILE: packages/create-evershop-app/sample/themes/sample/src/pages/homepage/OnlyHomePage.tsx
================================================
import React from 'react';
export default function OnlyHomePage() {
return (
<div className="container mx-auto px-4 py-8 bg-gray-100 rounded-lg shadow-md mt-10">
<h1 className="font-bold text-center mb-6">Home Page Only</h1>
<p className=" text-gray-700 text-center">
This component is only rendered on the home page.
</p>
<p className=" text-gray-700 text-center">
You can modify this component at{' '}
<code>`themes/sample/src/pages/homepage/OnlyHomePage.tsx`</code>
</p>
<p className=" text-gray-700 text-center">
You can also remove this by disabling the theme `sample`.
</p>
</div>
);
}
export const layout = {
areaId: 'content',
sortOrder: 10
};
================================================
FILE: packages/create-evershop-app/sample/themes/sample/tsconfig.json
================================================
{
"compilerOptions": {
"module": "NodeNext",
"target": "ES2018",
"lib": ["dom", "dom.iterable", "esnext"],
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"declaration": true,
"sourceMap": true,
"allowJs": true,
"checkJs": false,
"jsx": "react",
"outDir": "./dist",
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
"allowArbitraryExtensions": true,
"strictNullChecks": true,
"isolatedModules": false,
"baseUrl": ".",
"rootDir": "./src"
},
"include": ["src"]
}
================================================
FILE: packages/evershop/.swcrc
================================================
{
"$schema": "https://swc.rs/schema.json",
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"dynamicImport": true,
"privateMethod": false,
"functionBind": true,
"exportDefaultFrom": true,
"exportNamespaceFrom": false,
"decorators": true,
"decoratorsBeforeExport": false,
"topLevelAwait": true,
"importMeta": true,
"importAs": true,
"preserveAllComments": false
},
"target": "es2022",
"experimental": { "keepImportAssertions": true },
"loose": false,
"keepClassNames": false
},
"module": {
"type": "es6"
}
}
================================================
FILE: packages/evershop/README.md
================================================
<p> </p>
<p align="center">
<img width="60" height="68" alt="EverShop Logo" src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/logo-green.png"/>
</p>
<p align="center">
<h1 align="center">EverShop</h1>
</p>
<h4 align="center">
<a href="https://evershop.io/docs/development/getting-started/introduction">Documentation</a> |
<a href="https://demo.evershop.io/">Demo</a>
</h4>
<p align="center">
<img src="https://github.com/evershopcommerce/evershop/actions/workflows/build_test.yml/badge.svg" alt="Github Action">
<a href="https://twitter.com/evershopjs">
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/evershopjs?style=social">
</a>
<a href="https://discord.gg/GSzt7dt7RM">
<img src="https://img.shields.io/discord/757179260417867879?label=discord" alt="Discord">
</a>
<a href="https://opensource.org/licenses/GPL-3.0">
<img src="https://img.shields.io/badge/License-GPLv3-blue.svg" alt="License">
</a>
</p>
<p align="center">
<img alt="EverShop" width="950" src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/banner.png"/>
</p>
## Introduction
EverShop is a modern, TypeScript-first eCommerce platform built with GraphQL and React. Designed for developers, it offers essential commerce features in a modular, fully customizable architecture—perfect for building tailored shopping experiences with confidence and speed.
## Installation Using Docker
You can get started with EverShop in minutes by using the Docker image. The Docker image is a great way to get started with EverShop without having to worry about installing dependencies or configuring your environment.
```bash
curl -sSL https://raw.githubusercontent.com/evershopcommerce/evershop/main/docker-compose.yml > docker-compose.yml
docker-compose up -d
```
For the full installation guide, please refer to our [Installation guide](https://evershop.io/docs/development/getting-started/installation-guide).
## Documentation
- [Installation guide](https://evershop.io/docs/development/getting-started/installation-guide).
- [Extension development](https://evershop.io/docs/development/module/create-your-first-extension).
- [Theme development](https://evershop.io/docs/development/theme/theme-overview).
## Demo
Explore our demo store.
<p align="left">
<a href="https://demo.evershop.io/admin" target="_blank">
<img alt="evershop-backend-demo" height="35" alt="EverShop Admin Demo" src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/evershop-demo-back.png"/>
</a>
<a href="https://demo.evershop.io/" target="_blank">
<img alt="evershop-store-demo" height="35" alt="EverShop Store Demo" src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/evershop-demo-front.png"/>
</a>
</p>
<b>Demo user:</b>
Email: demo@evershop.io<br/>
Password: 123456
## Support
If you like my work, feel free to:
- ⭐ this repository. It helps.
- [][tweet] about EverShop. Thank you!
[tweet]: https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fevershopcommerce%2Fevershop&text=Awesome%20React%20Ecommerce%20Project&hashtags=react,ecommerce,expressjs,graphql
## Contributing
EverShop is an open-source project. We are committed to a fully transparent development process and appreciate highly any contributions. Whether you are helping us fix bugs, proposing new features, improving our documentation or spreading the word - we would love to have you as part of the EverShop community.
### Ask a question about EverShop
You can ask questions, and participate in discussions about EverShop-related topics in the EverShop Discord channel.
<a href="https://discord.gg/GSzt7dt7RM"><img src="https://raw.githubusercontent.com/evershopcommerce/evershop/dev/.github/images/discord_banner_github.svg" /></a>
### Create a bug report
If you see an error message or run into an issue, please [create bug report](https://github.com/evershopcommerce/evershop/issues/new). This effort is valued and it will help all EverShop users.
### Submit a feature request
If you have an idea, or you're missing a capability that would make development easier and more robust, please [Submit feature request](https://github.com/evershopcommerce/evershop/issues/new).
If a similar feature request already exists, don't forget to leave a "+1".
If you add some more information such as your thoughts and vision about the feature, your comments will be embraced warmly :)
Please refer to our [Contribution Guidelines](./CONTRIBUTING.md) and [Code of Conduct](./CODE_OF_CONDUCT.md).
## License
[GPL-3.0 License](https://github.com/evershopcommerce/evershop/blob/main/LICENSE)
================================================
FILE: packages/evershop/package.json
================================================
{
"name": "@evershop/evershop",
"version": "2.1.1",
"type": "module",
"description": "The React Ecommerce platform. Built with Typescript, React and Postgres. Open-source and free. Fast and customizable.",
"files": [
"dist",
"src",
".swcrc"
],
"bin": {
"evershop": "./dist/bin/evershop.js"
},
"exports": {
"./types/*": {
"types": "./dist/types/*.d.ts"
},
"./lib/helpers": {
"import": "./dist/lib/helpers.js",
"types": "./dist/lib/helpers.d.ts"
},
"./lib/mail/*": {
"import": "./dist/lib/mail/*.js",
"types": "./dist/lib/mail/*.d.ts"
},
"./lib/util/*": {
"import": "./dist/lib/util/*.js",
"types": "./dist/lib/util/*.d.ts"
},
"./lib/event": {
"import": "./dist/lib/event/emitter.js",
"types": "./dist/lib/event/emitter.d.ts"
},
"./lib/event/subscriber": {
"import": "./dist/lib/event/subscriber.js",
"types": "./dist/lib/event/subscriber.d.ts"
},
"./lib/postgres": {
"import": "./dist/lib/postgres/connection.js",
"types": "./dist/lib/postgres/connection.d.ts"
},
"./lib/locale/*": {
"import": "./dist/lib/locale/*.js",
"types": "./dist/lib/locale/*.d.ts"
},
"./lib/log": {
"import": "./dist/lib/log/logger.js",
"types": "./dist/lib/log/logger.d.ts"
},
"./lib/router": {
"import": "./dist/lib/router/index.js",
"types": "./dist/lib/router/index.d.ts"
},
"./lib/widget": {
"import": "./dist/lib/widget/widgetManager.js",
"types": "./dist/lib/widget/widgetManager.d.ts"
},
"./lib/cronjob": {
"import": "./dist/lib/cronjob/jobManager.js",
"types": "./dist/lib/cronjob/jobManager.d.ts"
},
"./lib/middleware/delegate": {
"import": "./dist/lib/middleware/delegate.js",
"types": "./dist/lib/middleware/delegate.d.ts"
},
"./components/common/*": {
"import": "./dist/components/common/*.js",
"types": "./dist/components/common/*.d.ts"
},
"./components/admin/*": {
"import": "./dist/components/admin/*.js",
"types": "./dist/components/admin/*.d.ts"
},
"./components/frontStore/*": {
"import": "./dist/components/frontStore/*.js",
"types": "./dist/components/frontStore/*.d.ts"
},
"./graphql/services": {
"import": "./dist/modules/graphql/services/index.js",
"types": "./dist/modules/graphql/services/index.d.ts"
},
"./catalog/services": {
"import": "./dist/modules/catalog/services/index.js",
"types": "./dist/modules/catalog/services/index.d.ts"
},
"./customer/services": {
"import": "./dist/modules/customer/services/index.js",
"types": "./dist/modules/customer/services/index.d.ts"
},
"./setting/services": {
"import": "./dist/modules/setting/services/index.js",
"types": "./dist/modules/setting/services/index.d.ts"
},
"./checkout/services": {
"import": "./dist/modules/checkout/services/index.js",
"types": "./dist/modules/checkout/services/index.d.ts"
},
"./oms/services": {
"import": "./dist/modules/oms/services/index.js",
"types": "./dist/modules/oms/services/index.d.ts"
},
"./cms/services": {
"import": "./dist/modules/cms/services/index.js",
"types": "./dist/modules/cms/services/index.d.ts"
},
"./package.json": "./package.json"
},
"scripts": {
"prepack": "rimraf dist && tsc && copyfiles -u 1 \"src/**/*.{graphql,scss,css,json}\" dist",
"dev": "node ./dist/bin/dev/index.js",
"start": "node ./dist/bin/start/index.js",
"build": "node ./dist/bin/build/index.js",
"build-fast": "evershop build -- --skip-minify",
"user:create": "evershop user:create",
"user:changePassword": "evershop user:changePassword",
"test": "jest"
},
"author": "The Nguyen (https://evershop.io)",
"license": "GNU GENERAL PUBLIC LICENSE 3.0",
"repository": {
"type": "git",
"url": "git+https://github.com/evershopcommerce/evershop.git"
},
"keywords": [
"ecommerce",
"shopping cart",
"cart"
],
"bugs": {
"url": "https://github.com/evershopcommerce/evershop/issues"
},
"homepage": "http://evershop.io/",
"dependencies": {
"@base-ui/react": "^1.1.0",
"@ckeditor/ckeditor5-build-classic": "^36.0.1",
"@ckeditor/ckeditor5-react": "^5.1.0",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@editorjs/editorjs": "^2.30.8",
"@editorjs/header": "^2.8.7",
"@editorjs/list": "^1.10.0",
"@editorjs/quote": "^2.6.0",
"@editorjs/raw": "^2.5.0",
"@evershop/editorjs-image": "^1.1.0",
"@evershop/postgres-query-builder": "^2.0.1",
"@graphql-tools/load-files": "^6.6.1",
"@graphql-tools/merge": "^8.4.2",
"@graphql-tools/schema": "^9.0.19",
"@hapi/topo": "^5.0.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.0",
"@stripe/react-stripe-js": "^1.5.0",
"@stripe/stripe-js": "^1.18.0",
"@swc/cli": "^0.7.7",
"@swc/core": "^1.11.29",
"@tailwindcss/postcss": "^4.1.18",
"@tailwindcss/typography": "^0.5.13",
"ajv": "^8.12.0",
"ajv-errors": "^3.0.0",
"ajv-formats": "^2.1.1",
"autoprefixer": "^10.4.13",
"axios": "^1.13.2",
"bcryptjs": "^2.4.3",
"body-parser": "^1.20.0",
"boxen": "^5.1.2",
"class-variance-authority": "^0.7.1",
"clean-css": "^5.3.1",
"clsx": "^2.1.1",
"config": "^3.3.6",
"connect-pg-simple": "^9.0.0",
"cookie-parser": "^1.4.6",
"cross-spawn": "^7.0.6",
"css-loader": "^6.7.1",
"csv-parser": "^3.0.0",
"dayjs": "^1.10.6",
"debug": "^4.3.2",
"dotenv": "^16.3.1",
"enquirer": "^2.3.6",
"execa": "^9.6.0",
"express": "^4.21.2",
"express-session": "^1.17.3",
"fast-glob": "^3.3.3",
"flatpickr": "^4.6.9",
"graphql": "^16.6.0",
"graphql-tag": "^2.12.6",
"graphql-type-json": "^0.3.2",
"handlebars": "^4.7.8",
"html-entities": "^2.3.3",
"html-webpack-plugin": "^5.5.0",
"immer": "^10.1.1",
"jsesc": "^3.0.2",
"json5": "^2.2.1",
"jsonwebtoken": "^9.0.2",
"kleur": "3.0.3",
"lodash.isequalwith": "^4.4.0",
"lucide-react": "^0.562.0",
"luxon": "^2.0.2",
"mini-css-extract-plugin": "^2.6.1",
"minimatch": "^10.2.3",
"multer": "^2.1.1",
"node-cron": "^3.0.3",
"ora": "^5.4.1",
"pg": "^8.16.3",
"postcss": "^8.4.18",
"postcss-loader": "^8.2.0",
"prop-types": "^15.8.1",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-fast-compare": "^3.2.0",
"react-hook-form": "^7.61.1",
"react-refresh": "^0.14.0",
"react-select": "^5.4.0",
"react-slick": "^0.31.0",
"react-toastify": "^6.2.0",
"recharts": "^2.0.9",
"sanitize-html": "^2.17.0",
"sass": "^1.53.0",
"sass-loader": "^13.0.2",
"semver": "^7.6.3",
"serve-static": "^1.15.0",
"session-file-store": "^1.5.0",
"sharp": "^0.33.5",
"slick-carousel": "^1.8.1",
"stripe": "^8.176.0",
"style-loader": "^3.3.1",
"swc-minify-webpack-plugin": "^2.1.3",
"tailwind-merge": "^3.4.0",
"tailwindcss": "^4.1.18",
"touch": "^3.1.1",
"tw-animate-css": "^1.4.0",
"uniqid": "^5.3.0",
"urql": "^3.0.3",
"uuid": "^9.0.0",
"webpack": "^5.72.1",
"webpack-dev-middleware": "^7.4.2",
"webpack-hot-middleware": "^2.26.1",
"webpackbar": "^5.0.2",
"winston": "^3.3.3",
"yargs": "^17.7.2",
"zero-decimal-currencies": "^1.2.0"
},
"devDependencies": {
"@parcel/watcher": "^2.5.1",
"@paypal/paypal-js": "^8.4.2",
"@types/config": "^3.3.5",
"@types/express": "^5.0.1",
"@types/express-session": "^1.18.2",
"@types/multer": "^2.0.0",
"@types/node": "^22.14.1",
"@types/pg": "^8.15.2",
"@types/react": "^19.1.2",
"@types/sanitize-html": "^2.16.0",
"copyfiles": "^2.4.1",
"typescript": "^5.8.3"
}
}
================================================
FILE: packages/evershop/scripts/postpack.js
================================================
import fs from 'fs';
import path from 'path';
import packageJson from '../package.json' with { type: 'json' };
// Get the current version of the package from the nearest package.json file
const { version } = packageJson;
// Get the --pack-destination from the command line arguments
// Create a package.json file in the packDestination directory with dependencies is the package itself
fs.writeFileSync(
path.resolve(process.env.npm_config_pack_destination, 'package.json'),
JSON.stringify(
{
name: packageJson.name,
version,
dependencies: {
'@evershop/evershop': `file:./evershop-evershop-${version}.tgz`
},
scripts: {
setup: 'evershop install',
start: 'evershop start',
'start:debug': 'evershop start:debug',
build: 'evershop build',
dev: 'evershop dev',
'user:create': 'evershop user:create'
}
},
null,
2
)
);
================================================
FILE: packages/evershop/scripts/postpublish.js
================================================
import fs from 'fs';
import path from 'path';
function getFileRecursive(dir, files) {
const list = fs.readdirSync(dir);
list.forEach((file) => {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
getFileRecursive(filePath, files);
} else {
files.push(filePath);
}
});
}
const files = [];
getFileRecursive(path.resolve(__dirname, './bin/serve'), files);
files.forEach((file) => {
const source = fs.readFileSync(file, { encoding: 'utf8', flag: 'r' });
const result = source.replace(/\.\.\/dist/g, '../src');
fs.writeFileSync(file, result, 'utf8');
});
================================================
FILE: packages/evershop/scripts/prepublish.js
================================================
import fs from 'fs';
import path from 'path';
fs.copyFile(
path.resolve(__dirname, '../../README.md'),
path.resolve(__dirname, './README.md'),
(err) => {
if (err) throw err;
}
);
================================================
FILE: packages/evershop/src/bin/build/client/index.js
================================================
import webpack from 'webpack';
import { error } from '../../../src/lib/log/logger';
import { createConfigClient } from '../../../src/lib/webpack/prod/createConfigClient';
export async function buildClient(routes) {
const config = createConfigClient(routes);
const compiler = webpack(config);
return new Promise((resolve, reject) => {
compiler.run((err, stats) => {
if (err || stats.hasErrors()) {
error(
stats.toString({
errorDetails: true,
warnings: true
})
);
reject(err);
}
resolve(stats);
});
});
}
================================================
FILE: packages/evershop/src/bin/build/complie.js
================================================
import pkg from 'webpack';
import { error } from '../../lib/log/logger.js';
import { createConfigClient } from '../../lib/webpack/prod/createConfigClient.js';
import { createConfigServer } from '../../lib/webpack/prod/createConfigServer.js';
const { webpack } = pkg;
export async function compile(routes) {
const config = [createConfigClient(routes), createConfigServer(routes)];
const compiler = webpack(config);
return new Promise((resolve, reject) => {
compiler.run((err, stats) => {
if (err || stats.hasErrors()) {
if (err) {
error(err);
}
error(
stats.toString({
errorDetails: true,
warnings: true
})
);
reject(err);
}
resolve(stats);
});
});
}
================================================
FILE: packages/evershop/src/bin/build/index.js
================================================
import { existsSync, mkdirSync, rmSync } from 'fs';
import path from 'path';
import config from 'config';
import { CONSTANTS } from '../../lib/helpers.js';
import { error } from '../../lib/log/logger.js';
import { loadModuleRoutes } from '../../lib/router/loadModuleRoutes.js';
import { getRoutes } from '../../lib/router/Router.js';
import { lockHooks } from '../../lib/util/hookable.js';
import { lockRegistry } from '../../lib/util/registry.js';
import { validateConfiguration } from '../../lib/util/validateConfiguration.js';
import { isBuildRequired } from '../../lib/webpack/isBuildRequired.js';
import { getEnabledExtensions } from '../extension/index.js';
import { loadBootstrapScript } from '../lib/bootstrap/bootstrap.js';
import { buildEntry } from '../lib/buildEntry.js';
import { getCoreModules } from '../lib/loadModules.js';
import { compile } from './complie.js';
import './initEnvBuild.js';
/* Loading modules and initilize routes, components */
const modules = [...getCoreModules(), ...getEnabledExtensions()];
/** Loading routes */
modules.forEach((module) => {
try {
// Load routes
loadModuleRoutes(module.path);
} catch (e) {
error(e);
process.exit(0);
}
});
/** Clean up the build directory */
if (existsSync(path.resolve(CONSTANTS.BUILDPATH))) {
// Delete directory recursively
rmSync(path.resolve(CONSTANTS.BUILDPATH), { recursive: true });
mkdirSync(path.resolve(CONSTANTS.BUILDPATH));
} else {
mkdirSync(path.resolve(CONSTANTS.BUILDPATH), { recursive: true });
}
export default async function build() {
/** Loading bootstrap script from modules */
try {
for (const module of modules) {
await loadBootstrapScript(module, {
command: 'build',
env: 'production',
process: 'main'
});
}
lockHooks();
lockRegistry();
// Get the configuration (nodeconfig)
validateConfiguration(config);
} catch (e) {
error(e);
process.exit(1);
}
process.env.ALLOW_CONFIG_MUTATIONS = false;
const routes = getRoutes();
await buildEntry(routes.filter((r) => isBuildRequired(r)));
/** Build */
await compile(routes);
}
process.on('uncaughtException', function (exception) {
import('../../lib/log/logger.js').then((module) => {
module.error(exception);
});
});
process.on('unhandledRejection', (reason, p) => {
import('../../lib/log/logger.js').then((module) => {
module.error(`Unhandled Rejection: ${reason} at: ${p}`);
});
});
build();
================================================
FILE: packages/evershop/src/bin/build/initEnvBuild.ts
================================================
import 'dotenv/config';
process.env.NODE_ENV = 'production';
process.env.ALLOW_CONFIG_MUTATIONS = 'true';
================================================
FILE: packages/evershop/src/bin/build/server/index.js
================================================
import pkg from 'webpack';
import { error } from '../../../src/lib/log/logger.js';
import { createConfigServer } from '../../../src/lib/webpack/prod/createConfigServer.js';
const { webpack } = pkg;
export const buildServer = async function buildServer(routes) {
const config = createConfigServer(routes);
const compiler = webpack(config);
return new Promise((resolve, reject) => {
compiler.run((err, stats) => {
if (err || stats.hasErrors()) {
error(
stats.toString({
errorDetails: true,
warnings: true
})
);
reject(err);
}
resolve(stats);
});
});
};
================================================
FILE: packages/evershop/src/bin/build/server/useDDL.js
================================================
import { existsSync, rmdirSync } from 'fs';
import { mkdir, writeFile } from 'fs/promises';
import path from 'path';
import { inspect } from 'util';
import boxen from 'boxen';
import { green, red } from 'kleur';
import ora from 'ora';
import pkg from 'webpack';
import { getComponentsByRoute } from '../../../src/lib/componee/getComponentByRoute.js';
import { CONSTANTS } from '../../../src/lib/helpers.js';
import { info } from '../../../src/lib/log/logger.js';
import { getRoutes } from '../../../src/lib/router/routes.js';
// Run building vendor first
import { createVendorConfig } from '../../../src/lib/webpack/configProvider.js';
import { loadModuleComponents } from '../../serve/loadModuleComponents.js';
import { loadModuleRoutes } from '../../serve/loadModuleRoutes.js';
import { loadModules } from '../../serve/loadModules.js';
const { webpack } = pkg;
const modules = loadModules(path.resolve(__dirname, '../../../src', 'modules'));
const spinner = ora({
text: green('Starting server build'),
spinner: 'dots12'
}).start();
spinner.start();
// Initilizing routes
modules.forEach((module) => {
try {
// Load routes
loadModuleRoutes(module.path);
} catch (e) {
spinner.fail(`${red(e.stack)}\n`);
process.exit(0);
}
});
// Initializing components
modules.forEach((module) => {
try {
// Load components
loadModuleComponents(module.path);
} catch (e) {
spinner.fail(`${red(e.stack)}\n`);
process.exit(0);
}
});
const routes = getRoutes();
// Collect all "controller" route
const controllers = routes.filter((r) => r.isApi === false);
const promises = [];
const total = controllers.length - 1;
let completed = 0;
spinner.text = `Start building ☕☕☕☕☕\n${Array(total).fill('▒').join('')}`;
if (existsSync(path.resolve(CONSTANTS.ROOTPATH, './.evershop/build'))) {
rmdirSync(path.resolve(CONSTANTS.ROOTPATH, './.evershop/build'), {
recursive: true
});
}
const start = Date.now();
const vendorComplier = webpack(createVendorConfig(webpack));
const webpackVendorPromise = new Promise((resolve, reject) => {
vendorComplier.run((err, stats) => {
if (err) {
reject(err);
} else if (stats.hasErrors()) {
reject(
new Error(
stats.toString({
errorDetails: true,
warnings: true
})
)
);
} else {
resolve(stats);
}
});
});
webpackVendorPromise.then(async () => {
controllers.forEach((route) => {
const buildFunc = async function () {
const components = getComponentsByRoute(route.id);
if (!components) {
return;
}
Object.keys(components).forEach((area) => {
Object.keys(components[area]).forEach((id) => {
components[area][
id
].component = `---require("${components[area][id].source}")---`;
delete components[area][id].source;
});
});
const buildPath =
route.isAdmin === true
? `./admin/${route.id}`
: `./frontStore/${route.id}`;
let content = `var components = module.exports = exports = ${inspect(
components,
{ depth: 5 }
)
.replace(/'---/g, '')
.replace(/---'/g, '')}`;
content += '\r\n';
await mkdir(
path.resolve(CONSTANTS.ROOTPATH, './.evershop/build', buildPath),
{ recursive: true }
);
await writeFile(
path.resolve(
CONSTANTS.ROOTPATH,
'.evershop/build',
buildPath,
'components.js'
),
content
);
const name =
route.isAdmin === true ? `admin/${route.id}` : `frontStore/${route.id}`;
const entry = {};
entry[name] = [
path.resolve(
CONSTANTS.ROOTPATH,
'.evershop',
'build',
buildPath,
'components.js'
),
path.resolve(
CONSTANTS.LIBPATH,
'../components/common/react/server',
'render.js'
)
];
const compiler = webpack({
mode: 'production', // "production" | "development" | "none"
module: {
rules: [
{
test: /\/views|components|context\/(.*).js?$/,
// test: /\.js?$/,
exclude: /(bower_components)/,
use: {
loader: 'babel-loader?cacheDirectory',
options: {
sourceType: 'unambiguous',
cacheDirectory: true,
presets: [
[
'@babel/preset-env',
{
exclude: [
'@babel/plugin-transform-regenerator',
'@babel/plugin-transform-async-to-generator'
]
}
],
'@babel/preset-react'
]
}
}
},
{
test: /getComponents\.js/,
use: [
{
loader: path.resolve(
CONSTANTS.LIBPATH,
'webpack/getComponentLoader.js'
),
options: {
componentsPath: path.resolve(
CONSTANTS.ROOTPATH,
'./.evershop/build',
buildPath,
'components.js'
)
}
}
]
}
]
},
// name: 'main',
target: 'node12.18',
entry,
output: {
path: path.resolve(
CONSTANTS.ROOTPATH,
'./.evershop/build',
buildPath,
'server'
),
libraryTarget: 'commonjs2',
globalObject: 'this',
filename: 'index.js'
},
resolve: {
alias: {
react: path.resolve(CONSTANTS.NODEMODULEPATH, 'react')
}
},
plugins: [
new webpack.DllReferencePlugin({
manifest: path.resolve(
CONSTANTS.ROOTPATH,
'./.evershop/build/vendor-manifest.json'
)
})
]
});
const webpackPromise = new Promise((resolve, reject) => {
compiler.run((err, stats) => {
if (err) {
reject(err);
} else if (stats.hasErrors()) {
reject(
new Error(
stats.toString({
errorDetails: true,
warnings: true
})
)
);
} else {
resolve(stats);
}
});
});
await webpackPromise;
completed += 1;
spinner.text = `Start building ☕☕☕☕☕\n${Array(completed)
.fill(green('█'))
.concat(total - completed > 0 ? Array(total - completed).fill('▒') : [])
.join('')}`;
};
promises.push(buildFunc());
});
await Promise.all(promises)
.then(() => {
spinner.succeed(
green('Building completed!!!\n') +
boxen(green('Please run "npm run start" to start your website'), {
title: 'EverShop',
titleAlignment: 'center',
padding: 1,
margin: 1,
borderColor: 'green'
})
);
const end = Date.now();
info(`Execution time: ${end - start} ms`);
process.exit(0);
})
.catch((e) => {
spinner.fail(`${red(e)}\n`);
process.exit(0);
});
});
================================================
FILE: packages/evershop/src/bin/build/server/useVendorChunk.js
================================================
import { existsSync, rmSync } from 'fs';
import path from 'path';
import { green, red } from 'kleur';
import ora from 'ora';
import webpack from 'webpack';
import { CONSTANTS } from '../../../src/lib/helpers.js';
import { getRoutes } from '../../../src/lib/router/routes.js';
import { createConfig } from '../../../src/lib/webpack/createConfig.js';
import { loadModuleComponents } from '../../serve/loadModuleComponents.js';
import { loadModuleRoutes } from '../../serve/loadModuleRoutes.js';
import { loadModules } from '../../serve/loadModules.js';
import { createComponents } from '../createComponents.js';
(async () => {
const start = Date.now();
const modules = loadModules(
path.resolve(__dirname, '../../../src', 'modules')
);
const spinner = ora({
text: green('Starting server build'),
spinner: 'dots12'
}).start();
spinner.start();
/** Initilizing routes */
modules.forEach((module) => {
try {
// Load routes
loadModuleRoutes(module.path);
} catch (e) {
spinner.fail(`${red(e.stack)}\n`);
process.exit(0);
}
});
/** Initializing components */
modules.forEach((module) => {
try {
// Load components
loadModuleComponents(module.path);
} catch (e) {
spinner.fail(`${red(e.stack)}\n`);
process.exit(0);
}
});
/** Get list of routes */
const routes = getRoutes();
/** Collect all 'controller' routes */
const controllers = routes.filter((r) => r.isApi === false);
/** Clean up the build directory */
if (existsSync(CONSTANTS.BUILDPATH)) {
rmSync(CONSTANTS.BUILDPATH, { recursive: true });
}
/** Create components.js file for each route */
await createComponents(controllers);
/** Create the webpack complier object */
const compiler = webpack(createConfig(true, controllers));
/** Run the build */
await new Promise((resolve, reject) => {
compiler.run((err, stats) => {
if (err) {
reject(err);
} else if (stats.hasErrors()) {
reject(
new Error(
stats.toString({
errorDetails: true,
warnings: true
})
)
);
} else {
resolve(stats);
}
});
});
const end = Date.now();
spinner.succeed(`${green('Server build completed in')} ${end - start}ms`);
process.exit(0);
})();
================================================
FILE: packages/evershop/src/bin/dev/compileTs.js
================================================
import path from 'path';
import { compileSwc } from '../lib/watch/compileSwc.js';
import { getSrcPaths } from '../lib/watch/getSrcPaths.js';
async function compileTs() {
const srcPaths = getSrcPaths();
const events = srcPaths.map((srcPath) => {
return {
srcPath: srcPath,
distPath: path.resolve(srcPath, '..', 'dist')
};
});
await Promise.all(
events.map((event) => {
return compileSwc(event.srcPath, event.distPath);
})
);
}
export { compileTs };
================================================
FILE: packages/evershop/src/bin/dev/enableWatcher.js
================================================
import { subscribe } from '@parcel/watcher';
import { CONSTANTS } from '../../lib/helpers.js';
import { watchHandler } from '../lib/watch/watchHandler.js';
export default async function enableWatcher() {
const watcherInstance = await subscribe(
CONSTANTS.ROOTPATH,
(err, events) => {
if (err) {
return;
}
watchHandler(events);
},
{
ignore: [
'**/node_modules/**',
'**/dist/**',
'**/build/**',
'**/.git/**',
'**/.cache/**',
'**/.next/**',
'**/.nuxt/**',
'**/.vscode/**'
]
}
);
process.on('SIGINT', () => {
watcherInstance.unsubscribe();
process.exit(0);
});
process.on('SIGTERM', () => {
watcherInstance.unsubscribe();
});
process.on('exit', () => {
watcherInstance.unsubscribe();
});
}
================================================
FILE: packages/evershop/src/bin/dev/hooks.js
================================================
import { isBuiltin } from 'node:module';
import path, { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
let broadcastChannel;
export function initialize(data) {
broadcastChannel = data.broadcastChannel;
}
export function resolve(specifier, context, nextResolve) {
if (
isBuiltin(specifier) ||
specifier.includes('?t=') ||
context.parentURL === undefined
) {
return nextResolve(specifier, context);
} else {
const modulePath = !specifier.startsWith('file:')
? path.resolve(dirname(fileURLToPath(context.parentURL)), specifier)
: fileURLToPath(specifier);
if (modulePath.includes('node_modules')) {
return nextResolve(specifier, context);
} else {
broadcastChannel.postMessage({
path: modulePath,
});
return nextResolve(specifier, context);
}
}
}
================================================
FILE: packages/evershop/src/bin/dev/index.ts
================================================
import path from 'path';
import { fileURLToPath } from 'url';
import spawn from 'cross-spawn';
import { debug, error } from '../../lib/log/logger.js';
function startDev() {
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const args = [path.resolve(__dirname, 'init.js')];
const appProcess = spawn('node', args, {
stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
env: {
...process.env,
ALLOW_CONFIG_MUTATIONS: true
}
});
appProcess.on('error', (err) => {
error(`Error spawning processor: ${err}`);
});
appProcess.on('message', (message) => {
debug('Restarting the development server');
if (message === 'RESTART_ME') {
if (appProcess && appProcess.pid) {
appProcess.removeAllListeners();
appProcess.kill('SIGTERM');
}
startDev();
}
});
return appProcess;
}
const childProcess = startDev();
process.on('exit', () => {
// Cleanup child processes on exit
if (childProcess && childProcess.pid) {
childProcess.kill();
}
});
================================================
FILE: packages/evershop/src/bin/dev/init.ts
================================================
import './register.js';
import './initEnvDev.js';
import { debug, error } from '../../lib/log/logger.js';
import { start } from '../lib/startUp.js';
import { compileTs } from './compileTs.js';
import enableWatcher from './enableWatcher.js';
await compileTs();
enableWatcher();
start({
command: 'dev',
env: 'development',
process: 'main'
});
process.on('SIGTERM', async () => {
debug('Received SIGTERM, shutting down the main process...');
try {
process.exit(0);
} catch (err) {
error('Error during shutdown the main process:');
error(err);
process.exit(1);
}
});
process.on('uncaughtException', function (exception) {
import('../../lib/log/logger.js').then((module) => {
module.error(exception);
});
});
process.on('unhandledRejection', (reason, p) => {
import('../../lib/log/logger.js').then((module) => {
module.error(`Unhandled Rejection: ${reason} at: ${p}`);
});
});
================================================
FILE: packages/evershop/src/bin/dev/initEnvDev.ts
================================================
import 'dotenv/config';
process.env.NODE_ENV = 'development';
process.env.ALLOW_CONFIG_MUTATIONS = 'true';
================================================
FILE: packages/evershop/src/bin/dev/register.js
================================================
import { register } from 'node:module';
import { MessageChannel } from 'node:worker_threads';
export const maps = new Map();
const { port1: listenChannel, port2: broadcastChannel } = new MessageChannel();
listenChannel.on('message', (message) => {
maps.set(message.path, true);
});
register('./hooks.js', {
parentURL: import.meta.url,
data: { broadcastChannel },
transferList: [broadcastChannel],
});
export function has(pathName) {
return maps.has(pathName);
}
================================================
FILE: packages/evershop/src/bin/evershop.js
================================================
#!/usr/bin/env node
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
const { argv } = yargs(hideBin(process.argv));
const command = argv._[0];
try {
if (command === 'build') {
await import('./build/index.js');
} else if (command === 'dev') {
await import('./dev/index.js');
} else if (command === 'start') {
await import('./start/index.js');
} else if (command === 'install') {
await import('./install/index.js');
} else if (command === 'user:create') {
await import('./user/create.js');
} else if (command === 'user:changePassword') {
await import('./user/changePassword.js');
} else if (command === 'theme:active') {
await import('./theme/active.js');
} else if (command === 'theme:twizz') {
await import('./theme/twizz.js');
} else if (command === 'theme:create') {
await import('./theme/create.js');
} else if (command === 'seed') {
await import('./seed/index.js');
} else {
throw new Error('Invalid command');
}
} catch (e) {
import('../lib/log/logger.js').then((module) => {
module.error(e);
});
}
process.on('uncaughtException', function (exception) {
import('../lib/log/logger.js').then((module) => {
module.error(exception);
});
});
process.on('unhandledRejection', (reason, p) => {
import('../lib/log/logger.js').then((module) => {
module.error(`Unhandled Rejection: ${reason} at: ${p}`);
});
});
================================================
FILE: packages/evershop/src/bin/extension/index.ts
================================================
import { existsSync } from 'fs';
import { resolve } from 'path';
import { CONSTANTS } from '../../lib/helpers.js';
import { error, warning } from '../../lib/log/logger.js';
import { getConfig } from '../../lib/util/getConfig.js';
import { isDevelopmentMode } from '../../lib/util/isDevelopmentMode.js';
import { isProductionMode } from '../../lib/util/isProductionMode.js';
import { Extension } from '../../types/extension.js';
import { getCoreModules } from '../lib/loadModules.js';
let extensions: Extension[] | undefined = undefined;
function loadExtensions(): Extension[] {
const coreModules = getCoreModules();
const list = getConfig('system.extensions', []) as Extension[];
const extensions: Extension[] = [];
list.forEach((extension) => {
if (
coreModules.find((module) => module.name === extension.name) ||
extensions.find((e) => e.name === extension.name)
) {
throw new Error(
`Extension ${extension.name} is invalid. extension name must be unique.`
);
}
if (extension.enabled !== true) {
warning(`Extension ${extension.name} is not enabled. Skipping.`);
return;
}
if (!existsSync(extension.resolve)) {
warning(
`Extension ${extension.name} has resolve path ${extension.resolve} which does not exist. Skipping.`
);
return;
}
if (isProductionMode() || extension.resolve.includes('node_modules')) {
// Make sure the folder has 'dist' subdirectory
if (!existsSync(resolve(extension.resolve, 'dist'))) {
error(
`Extension '${
extension.name
}' must have a 'dist' directory at ${resolve(
extension.resolve,
'dist'
)}. This is required for production mode.`
);
process.exit(1);
} else {
extensions.push({
...extension,
path: resolve(CONSTANTS.ROOTPATH, extension.resolve, 'dist')
});
}
}
if (isDevelopmentMode() && !extension.resolve.includes('node_modules')) {
// Make sure the folder has 'src' subdirectory
if (!existsSync(resolve(extension.resolve, 'src'))) {
error(
`Extension '${
extension.name
}' must have a 'src' directory at ${resolve(
extension.resolve,
'src'
)}`
);
process.exit(1);
} else {
extensions.push({
...extension,
srcPath: resolve(extension.resolve, 'src'),
path: resolve(extension.resolve, 'dist')
});
}
}
});
// Sort the extensions by priority, smaller number means higher priority
extensions.sort((a, b) => a.priority - b.priority);
return extensions;
}
export function getEnabledExtensions() {
if (extensions === undefined) {
extensions = loadExtensions();
}
return extensions;
}
================================================
FILE: packages/evershop/src/bin/install/createMigrationTable.js
================================================
import { execute } from '@evershop/postgres-query-builder';
export async function createMigrationTable(connection) {
await execute(
connection,
`CREATE TABLE IF NOT EXISTS "migration" (
"migration_id" INT GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY,
"module" varchar NOT NULL,
"version" varchar NOT NULL,
"created_at" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "MODULE_UNIQUE" UNIQUE ("module")
)`
);
}
================================================
FILE: packages/evershop/src/bin/install/index.js
================================================
import { mkdir, writeFile } from 'fs/promises';
import path from 'path';
import {
commit,
execute,
insertOnUpdate,
rollback,
startTransaction
} from '@evershop/postgres-query-builder';
import boxen from 'boxen';
import enquirer from 'enquirer';
import kleur from 'kleur';
import ora from 'ora';
import { Pool } from 'pg';
import { CONSTANTS } from '../../lib/helpers.js';
import { error, success } from '../../lib/log/logger.js';
import { hashPassword } from '../../lib/util/passwordHelper.js';
import { migrate } from '../lib/bootstrap/migrate.js';
import { getCoreModules } from '../lib/loadModules.js';
// The installation command will create a .env file in the root directory of the project.
// If you are using docker, do not run this command. Instead, you should set the environment variables in the docker-compose.yml file and run `npm run start`
// This command means for the developer who want to install the system on their local machine.
async function install() {
// Check if the env for database is set
if (process.env.DB_HOST) {
error(
'We found that you have already set the environment variables for the database. Look like you have already installed the system. Run `npm run build` and `npm run start` to launch your store.'
);
process.exit(0);
}
var db;
var adminUser;
// eslint-disable-next-line no-console
console.log(
kleur.green(
boxen('Welcome to EverShop - The open-source e-commerce platform', {
title: 'EverShop',
titleAlignment: 'center',
padding: 1,
margin: 1,
borderColor: 'green'
})
)
);
const dbQuestions = [
{
type: 'input',
name: 'databaseHost',
message: 'Postgres Database Host (localhost)',
initial: process.env.DB_HOST || 'localhost',
skip: !!process.env.DB_HOST
},
{
type: 'input',
name: 'databasePort',
message: 'Postgres Database Port (5432)',
initial: process.env.DB_PORT || 5432,
skip: !!process.env.DB_PORT
},
{
type: 'input',
name: 'databaseName',
message: 'Postgres Database Name (evershop)',
initial: process.env.DB_NAME || 'evershop',
skip: !!process.env.DB_NAME
},
{
type: 'input',
name: 'databaseUser',
message: 'Postgres Database User (postgres)',
initial: process.env.DB_USER || 'postgres',
skip: !!process.env.DB_USER
},
{
type: 'input',
name: 'databasePassword',
message: 'PostgreSQL Database Password (<empty>)',
initial: process.env.DB_PASSWORD || '',
skip: !!process.env.DB_PASSWORD
}
];
try {
db = await enquirer.prompt(dbQuestions);
} catch (e) {
process.exit(0);
}
const baseDBSetting = {
host: db.databaseHost,
port: db.databasePort,
user: db.databaseUser,
password: db.databasePassword,
database: db.databaseName,
max: 10,
idleTimeoutMillis: 30000
};
// We will try with SSL option enabled first
let pool = new Pool({ ...baseDBSetting, ssl: true });
let sslMode;
// Test the secure connection
try {
await pool.query(`SELECT 1`);
sslMode = 'require';
} catch (e) {
if (e.message.includes('does not support SSL')) {
// If the database does not support SSL, we will try to connect without SSL
pool = new Pool({ ...baseDBSetting, ssl: false });
sslMode = 'disable';
} else if (e.message.includes('certificate')) {
error(
`Looks like your database server does not have a valid SSL certificate. Please turn off the SSL option in the database configuration, restart the database server and try again.`
);
} else {
error(e);
process.exit(0);
}
}
// Check postgres database version
try {
const { rows } = await execute(pool, `SHOW SERVER_VERSION;`);
if (rows[0].server_version < '13.0') {
error(
`Your database server version(${rows[0].server_version}) is not supported. Please upgrade to PostgreSQL version 13.0 or higher`
);
process.exit(0);
}
} catch (e) {
error(e);
process.exit(0);
}
const adminUserQuestions = [
{
type: 'input',
name: 'fullName',
message: 'Your full name',
initial: process.env.ADMIN_FULLNAME || '',
skip: !!process.env.ADMIN_FULLNAME
},
{
type: 'input',
name: 'email',
message: 'Your administrator user email',
initial: process.env.ADMIN_EMAIL || 'admin@admin.com',
skip: !!process.env.ADMIN_EMAIL,
validate: (value) => {
if (
!value.match(
/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
)
) {
return 'Invalid email';
}
return true;
}
},
{
type: 'password',
name: 'password',
message: 'Your administrator user password',
initial: process.env.ADMIN_PASSWORD || '123456',
skip: !!process.env.ADMIN_PASSWORD,
validate: (value) => {
if (value.length < 8) {
return 'Your password must be at least 8 characters.';
}
if (value.search(/[a-z]/i) < 0) {
return 'Your password must contain at least one letter.';
}
if (value.search(/[0-9]/) < 0) {
return 'Your password must contain at least one digit.';
}
return true;
}
}
];
try {
adminUser = await enquirer.prompt(adminUserQuestions);
} catch (e) {
process.exit(0);
}
/* Start installation */
const messages = [];
messages.push(`\n\n${kleur.green('EverShop is being installed ☕ ☕ ☕')}`);
messages.push('Creating .env file');
const spinner = ora({
text: kleur.green(messages.join('\n')),
spinner: 'dots12'
}).start();
spinner.start();
/** Create the .env file at the root folder with the database connection */
await writeFile(
path.resolve(CONSTANTS.ROOTPATH, '.env'),
`DB_HOST="${db.databaseHost}"
DB_PORT="${db.databasePort}"
DB_NAME="${db.databaseName}"
DB_USER="${db.databaseUser}"
DB_PASSWORD="${db.databasePassword}"
DB_SSLMODE="${sslMode}"
`
);
messages.pop();
messages.push(kleur.green('✔ Created .env file'));
spinner.text = messages.join('\n');
// Create `media` folder
await mkdir(path.resolve(CONSTANTS.ROOTPATH, 'media'), { recursive: true });
// Create `public` folder
await mkdir(path.resolve(CONSTANTS.ROOTPATH, 'public'), { recursive: true });
// Start install database
messages.push(kleur.green('Setting up a database'));
spinner.text = messages.join('\n');
const connection = await pool.connect();
await startTransaction(connection);
try {
// Create the admin user
const passwordHash = hashPassword(adminUser.password || '123456');
await execute(
connection,
`CREATE TABLE IF NOT EXISTS "admin_user" (
"admin_user_id" INT GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY,
"uuid" UUID NOT NULL DEFAULT gen_random_uuid (),
"status" boolean NOT NULL DEFAULT TRUE,
"email" varchar NOT NULL,
"password" varchar NOT NULL,
"full_name" varchar DEFAULT NULL,
"created_at" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "ADMIN_USER_EMAIL_UNIQUE" UNIQUE ("email"),
CONSTRAINT "ADMIN_USER_UUID_UNIQUE" UNIQUE ("uuid")
);`
);
await insertOnUpdate('admin_user', ['email'])
.given({
status: 1,
email: adminUser?.email || 'admin@evershop.io',
password: passwordHash,
full_name: adminUser?.fullName || 'Admin'
})
.execute(connection);
// Run module migrations
const coreModules = getCoreModules();
await migrate(coreModules, connection);
await commit(connection);
} catch (e) {
await rollback(connection);
error(e);
process.exit(0);
}
messages.pop();
messages.push(kleur.green('✔ Setup database'));
messages.push(kleur.green('✔ Create admin user'));
spinner.succeed(messages.join('\n'));
// eslint-disable-next-line no-console
console.log(
boxen(
kleur.green(
'Installation completed!. Run `npm run build` and `npm run start` to launch your store'
),
{
title: 'EverShop',
titleAlignment: 'center',
padding: 1,
margin: 1,
borderColor: 'green'
}
)
);
process.exit(0);
}
(async () => {
try {
await install();
} catch (e) {
error(e);
process.exit(0);
}
})();
================================================
FILE: packages/evershop/src/bin/install/templates/config.json
================================================
{
"shop": {
"currency": "USD",
"language": "en",
"weightUnit": "kg",
"timezone": "UTC"
},
"system": {
"database": {
"host": "localhost",
"port": 5432,
"database": "evershop",
"user": "admin",
"password": "123456"
}
}
}
================================================
FILE: packages/evershop/src/bin/lib/addDefaultMiddlewareFuncs.ts
================================================
import { select } from '@evershop/postgres-query-builder';
import sessionStorage from 'connect-pg-simple';
import cookieParser from 'cookie-parser';
import session from 'express-session';
import pathToRegexp from 'path-to-regexp';
import { translate } from '../../lib/locale/translate/translate.js';
import { debug, warning } from '../../lib/log/logger.js';
import publicStatic from '../../lib/middlewares/publicStatic.js';
import themePublicStatic from '../../lib/middlewares/themePublicStatic.js';
import { pool } from '../../lib/postgres/connection.js';
import { getRoutes } from '../../lib/router/Router.js';
import { getConfig } from '../../lib/util/getConfig.js';
import isDevelopmentMode from '../../lib/util/isDevelopmentMode.js';
import isProductionMode from '../../lib/util/isProductionMode.js';
import { getAdminSessionCookieName } from '../../modules/auth/services/getAdminSessionCookieName.js';
import { getCookieSecret } from '../../modules/auth/services/getCookieSecret.js';
import { getFrontStoreSessionCookieName } from '../../modules/auth/services/getFrontStoreSessionCookieName.js';
import { setPageMetaInfo } from '../../modules/cms/services/pageMetaInfo.js';
import { getDevMiddleware, getHotMiddleware } from './devEnvHelper.js';
export function addDefaultMiddlewareFuncs(app) {
app.use((request, response, next) => {
response.debugMiddlewares = [];
next();
response.on('finish', () => {
// Console log the debug middlewares
let message = `[${request.method}] ${request.originalUrl}\n`;
response.debugMiddlewares.forEach((m) => {
message += m.time
? `-> Middleware ${m.id} - ${m.time} ms\n`
: `-> Middleware ${m.id}\n`;
});
// Skip logging if the request is for static files
if (
request.currentRoute?.id === 'staticAsset' ||
request.currentRoute?.id === 'adminStaticAsset'
) {
return;
}
debug(message);
});
});
// Add public static middleware
app.use(publicStatic);
// Add theme public static middleware
app.use(themePublicStatic);
// Express session
const cookieSecret = getCookieSecret();
const sess = {
store:
process.env.NODE_ENV === 'test'
? undefined
: new (sessionStorage(session))({
pool
}),
secret: cookieSecret,
cookie: {
maxAge: getConfig('system.session.maxAge', 24 * 60 * 60 * 1000)
},
resave: getConfig('system.session.resave', false),
saveUninitialized: getConfig('system.session.saveUninitialized', true)
} as session.SessionOptions;
if (isProductionMode()) {
app.set('trust proxy', 1);
sess.cookie!.secure = false;
}
const adminSessionMiddleware = session({
...sess,
name: getAdminSessionCookieName()
});
const frontStoreSessionMiddleware = session({
...sess,
name: getFrontStoreSessionCookieName()
});
// Cookie parser
app.use(cookieParser(cookieSecret));
app.use((request, response, next) => {
const routes = getRoutes();
const method = request.method.toUpperCase();
const requestPath = request.originalUrl.split('?')[0];
const matchedRoutes = routes.filter((r) => {
const regexp = pathToRegexp(r.path, []);
const match = regexp.exec(requestPath);
if (match && r.method.includes(method)) {
return true;
} else {
return false;
}
});
if (matchedRoutes.length > 1) {
warning(
`Multiple routes matched for ${requestPath}. Please check your routes: ${matchedRoutes
.map((r) => r.id)
.join(', ')}. Route ${matchedRoutes[0].id} will be used.`
);
}
if (matchedRoutes.length) {
request.currentRoute = matchedRoutes[0];
next();
} else {
next();
}
});
const sessionMiddleware = (request, response, next) => {
const { currentRoute } = request;
if (currentRoute?.isApi) {
// We don't need session for api routes. Restful api should be stateless
next();
} else if (currentRoute?.isAdmin) {
adminSessionMiddleware(request, response, next);
} else {
frontStoreSessionMiddleware(request, response, next);
}
};
app.use(sessionMiddleware);
app.use(async (request, response, next) => {
// Get the request path, remove '/' from both ends
const path = request.originalUrl.split('?')[0].replace(/^\/|\/$/g, '');
// If the current route is already set, or the path contains .hot-update.json, .hot-update.js skip this middleware
if (request.currentRoute || path.includes('.hot-update')) {
return next();
}
// Also skip if we are running in the test mode
if (process.env.NODE_ENV === 'test') {
return next();
}
// Find the matched rewrite rule base on the request path
const rewriteRule = await select()
.from('url_rewrite')
.where('request_path', '=', `/${path}`)
.load(pool);
if (rewriteRule) {
// Find the route
const routes = getRoutes();
const route = routes.find((r) => {
const regexp = pathToRegexp(r.path);
const match = regexp.exec(rewriteRule.target_path);
if (match) {
request.locals = request.locals || {};
request.locals.customParams = {};
const keys: any[] = [];
pathToRegexp(r.path, keys);
keys.forEach((key, index) => {
request.locals.customParams[key.name] = match[index + 1];
});
return true;
}
return false;
});
// Get the current http method
const method = request.method.toUpperCase();
// Check if the route supports the current http method
if (route && route.method.includes(method)) {
request.currentRoute = route;
}
return next();
} else {
return next();
}
});
if (isDevelopmentMode()) {
// Admin webpack dev middleware - only for /backend/* paths
app.use((request, response, next) => {
if (request.path.startsWith('/backend/')) {
const adminDevMiddleware = getDevMiddleware(true);
adminDevMiddleware.waitUntilValid(() => {
const { stats } = adminDevMiddleware.context;
if (stats) {
response.locals.jsonWebpackStats = stats.toJson();
}
});
adminDevMiddleware(request, response, next);
} else {
next();
}
});
app.use((request, response, next) => {
if (request.path.startsWith('/__webpack_hmr_admin')) {
const adminHotMiddleware = getHotMiddleware(true);
adminHotMiddleware(request, response, next);
} else {
next();
}
});
// Frontstore webpack dev middleware - for all other paths
app.use((request, response, next) => {
if (
!request.path.startsWith('/backend/') &&
!request.path.startsWith('/__webpack_hmr_admin')
) {
const frontstoreDevMiddleware = getDevMiddleware(false);
frontstoreDevMiddleware.waitUntilValid(() => {
const { stats } = frontstoreDevMiddleware.context;
if (stats) {
response.locals.jsonWebpackStats = stats.toJson();
}
});
frontstoreDevMiddleware(request, response, next);
} else {
next();
}
});
app.use((request, response, next) => {
if (request.path.startsWith('/__webpack_hmr_frontstore')) {
const frontstoreHotMiddleware = getHotMiddleware(false);
frontstoreHotMiddleware(request, response, next);
} else {
next();
}
});
}
/** 404 Not Found handle */
app.use((request, response, next) => {
if (!request.currentRoute) {
response.status(404);
const routes = getRoutes();
request.currentRoute = routes.find((r) => r.id === 'notFound');
setPageMetaInfo(request, {
title: translate('Not found'),
description: translate('Not found')
});
next();
} else {
next();
}
});
}
================================================
FILE: packages/evershop/src/bin/lib/app.js
================================================
import express from 'express';
import { error } from '../../lib/log/logger.js';
import { Handler } from '../../lib/middleware/Handler.js';
import { getModuleMiddlewares } from '../../lib/middleware/index.js';
import { loadModuleRoutes } from '../../lib/router/loadModuleRoutes.js';
import { getRoutes } from '../../lib/router/Router.js';
import { getEnabledExtensions } from '../extension/index.js';
import { addDefaultMiddlewareFuncs } from './addDefaultMiddlewareFuncs.js';
import { getCoreModules } from './loadModules.js';
export const createApp = () => {
/** Create express app */
const app = express();
// Enable trust proxy
app.enable('trust proxy');
/* Loading modules and initilize routes, components and services */
const modules = getCoreModules();
// Load routes and middleware functions
modules.forEach((module) => {
try {
// Load middleware functions
getModuleMiddlewares(module.path);
// Load routes
loadModuleRoutes(module.path);
} catch (e) {
error(e);
process.exit(0);
}
});
/** Load extensions */
const extensions = getEnabledExtensions();
extensions.forEach((extension) => {
try {
// Load middleware functions
getModuleMiddlewares(extension.path);
// Load routes
loadModuleRoutes(extension.path);
} catch (e) {
error(e);
process.exit(0);
}
});
// Adding default middlewares
addDefaultMiddlewareFuncs(app);
const routes = getRoutes();
routes.forEach((route) => {
// app.all(route.path, Handler.middleware());
route.method.forEach((method) => {
switch (method.toUpperCase()) {
case 'GET':
app.get(route.path, Handler.middleware());
break;
case 'POST':
app.post(route.path, Handler.middleware());
break;
case 'PUT':
app.put(route.path, Handler.middleware());
break;
case 'DELETE':
app.delete(route.path, Handler.middleware());
break;
case 'PATCH':
app.patch(route.path, Handler.middleware());
break;
default:
app.get(route.path, Handler.middleware());
break;
}
});
});
app.use(Handler.middleware());
return app;
};
================================================
FILE: packages/evershop/src/bin/lib/bootstrap/bootstrap.ts
================================================
import { existsSync } from 'fs';
import path from 'path';
import { pathToFileURL } from 'url';
interface Module {
path: string;
}
export type BootstrapContext = {
command?: string;
env?: 'production' | 'development' | 'test';
process?: 'main' | 'cronjob' | 'event';
};
type BootstrapModule = {
default: (context: BootstrapContext) => Promise<void> | void;
};
/**
* Loads and runs the bootstrap script from a module directory.
*/
export const loadBootstrapScript = async function loadBootstrapScript(
module: Module,
context: BootstrapContext = {}
): Promise<void> {
const filePath = path.resolve(module.path, 'bootstrap.js');
if (!existsSync(filePath)) {
return;
}
// Convert path to a URL
const bootstrapPath = pathToFileURL(filePath).toString();
const bootstrap = (await import(bootstrapPath)) as BootstrapModule;
if (typeof bootstrap.default !== 'function') {
throw new Error(
'Bootstrap script must provide a default export as a function'
);
}
await bootstrap.default(context);
};
================================================
FILE: packages/evershop/src/bin/lib/bootstrap/migrate.js
================================================
import { existsSync, readdirSync } from 'fs';
import path from 'path';
import { pathToFileURL } from 'url';
import {
commit,
insertOnUpdate,
rollback,
select,
startTransaction
} from '@evershop/postgres-query-builder';
import semver from 'semver';
import { error } from '../../../lib/log/logger.js';
import { getConnection, pool } from '../../../lib/postgres/connection.js';
import { createMigrationTable } from '../../install/createMigrationTable.js';
async function getCurrentInstalledVersion(module, connection = null) {
/** Check for current installed version */
const check = await select()
.from('migration')
.where('module', '=', module)
.load(connection || pool);
if (!check) {
return '0.0.1';
} else {
return check.version;
}
}
async function migrateModule(module, connection = null) {
/** Check if the module has migration folder, if not ignore it */
if (!existsSync(path.resolve(module.path, 'migration'))) {
return;
}
const migrations = readdirSync(path.resolve(module.path, 'migration'), {
withFileTypes: true
})
.filter(
(dirent) =>
dirent.isFile() &&
dirent.name.match(/^Version-+([1-9].[0-9].[0-9])+.js$/)
)
.map((dirent) => dirent.name.replace('Version-', '').replace('.js', ''))
.sort((first, second) => semver.lt(first, second));
const currentInstalledVersion = await getCurrentInstalledVersion(
module.name,
connection
);
for (const version of migrations) {
/** If the version is lower or equal the installed version, ignore it */
if (semver.lte(version, currentInstalledVersion)) {
continue;
}
const migrationConnection = connection || (await getConnection());
if (!connection) {
await startTransaction(migrationConnection);
}
/** We expect the migration script to provide a function as a default export */
try {
const versionModule = await import(
pathToFileURL(
path.resolve(module.path, 'migration', `Version-${version}.js`)
)
);
await versionModule.default(migrationConnection);
await insertOnUpdate('migration', ['module'])
.given({
module: module.name,
version
})
.execute(migrationConnection, false);
if (!connection) {
await commit(migrationConnection);
}
} catch (e) {
if (!connection) {
await rollback(migrationConnection);
}
throw new Error(
`Migration failed for module ${module.name}, version ${version}\n${e}`
);
}
}
}
export async function migrate(modules, connection = null) {
try {
const psqlConnection = connection || (await getConnection());
// Create a migration table if not exists. This is for the first time installation
await createMigrationTable(psqlConnection);
for (const module of modules) {
await migrateModule(module, connection);
}
} catch (e) {
error(e);
process.exit(0);
}
}
================================================
FILE: packages/evershop/src/bin/lib/buildEntry.js
================================================
import fs from 'fs';
import { mkdir, writeFile } from 'fs/promises';
import path from 'path';
import { pathToFileURL } from 'url';
import { inspect } from 'util';
import JSON5 from 'json5';
import { getComponentsByRoute } from '../../lib/componee/getComponentsByRoute.js';
import { CONSTANTS } from '../../lib/helpers.js';
import { error } from '../../lib/log/logger.js';
import { generateComponentKey } from '../../lib/util/keyGenerator.js';
import { getRouteBuildPath } from '../../lib/webpack/getRouteBuildPath.js';
import { parseGraphql } from '../../lib/webpack/util/parseGraphql.js';
import { getEnabledWidgets } from '../../lib/widget/widgetManager.js';
/**
* Only pass the page routes, not api routes
*/
export async function buildEntry(routes, clientOnly = false) {
const widgets = getEnabledWidgets();
await Promise.all(
routes.map(async (route) => {
const imports = [];
const subPath = getRouteBuildPath(route);
const components = getComponentsByRoute(route);
if (!components) {
return;
}
/** Build layout and query */
const areas = {};
components.forEach((module) => {
if (!fs.existsSync(module)) {
return;
}
const source = fs.readFileSync(module, 'utf8');
// Regex matching 'export const layout = { ... }'
const layoutRegex =
/export\s+const\s+layout\s*=\s*{\s*areaId\s*:\s*['"]([^'"]+)['"],\s*sortOrder\s*:\s*(\d+)\s*,*\s*}/;
const match = source.match(layoutRegex);
if (match) {
// Remove everything before '{' from the beginning of the match
const check = match[0]
.replace(/^[^{]*/, '')
.replace(/(['"])?([a-zA-Z0-9_]+)(['"])?:/g, '"$2": ');
try {
const layout = JSON5.parse(check);
const id = generateComponentKey(module);
const url = pathToFileURL(module).toString();
imports.push(`import ${id} from '${url}';`);
areas[layout.areaId] = areas[layout.areaId] || {};
areas[layout.areaId][id] = {
id,
sortOrder: layout.sortOrder,
component: { default: `---${id}---` }
};
} catch (e) {
error(`Error parsing layout from ${module}`);
error(e);
}
}
});
let contentClient = `
import React from 'react';
import ReactDOM from 'react-dom';
import { Area } from '@evershop/evershop/components/common';
import {${
route.isAdmin ? 'HydrateAdmin' : 'HydrateFrontStore'
}} from '@evershop/evershop/components/common';
`;
areas['*'] = areas['*'] || {};
widgets.forEach((widget) => {
const url = route.isAdmin
? pathToFileURL(widget.settingComponent).toString()
: pathToFileURL(widget.component).toString();
const id = generateComponentKey(
route.isAdmin
? `admin_widget_${widget.type}`
: `widget_${widget.type}`
);
imports.push(`import ${id} from '${url}';`);
areas['*'][id] = {
id,
sortOrder: widget.sortOrder || 0,
component: {
default: `---${id}---`
}
};
});
contentClient += '\r\n';
contentClient += imports.join('\r\n');
contentClient += '\r\n';
contentClient += `Area.defaultProps.components = ${inspect(areas, {
depth: 5
})
.replace(/"---/g, '')
.replace(/---"/g, '')
.replace(/'---/g, '')
.replace(/---'/g, '')} `;
contentClient += '\r\n';
contentClient += `ReactDOM.hydrate(
${
route.isAdmin
? 'React.createElement(HydrateAdmin, null)'
: 'React.createElement(HydrateFrontStore, null)'
},
document.getElementById('app')
);`;
if (!fs.existsSync(path.resolve(subPath, 'client'))) {
await mkdir(path.resolve(subPath, 'client'), { recursive: true });
}
await writeFile(
path.resolve(subPath, 'client', 'entry.js'),
contentClient
);
if (!clientOnly) {
/** Build query */
const query = `${JSON.stringify(parseGraphql(components))}`;
// Loop through the widgets config and add the query to the widgets
let contentServer = `import React from 'react'; `;
contentServer += '\r\n';
contentServer += `import ReactDOM from 'react-dom'; `;
contentServer += '\r\n';
contentServer += `import { Area } from '@evershop/evershop/components/common';`;
contentServer += '\r\n';
contentServer += `import { renderHtml } from '@evershop/evershop/components/common';\r\n`;
contentServer += imports.join('\r\n');
contentServer += '\r\n';
contentServer += `export default renderHtml;\r\n`;
contentServer += `Area.defaultProps.components = ${inspect(areas, {
depth: 5
})
.replace(/"---/g, '')
.replace(/---"/g, '')
.replace(/'---/g, '')
.replace(/---'/g, '')} `;
if (!fs.existsSync(path.resolve(subPath, 'server'))) {
await mkdir(path.resolve(subPath, 'server'), { recursive: true });
}
await writeFile(
path.resolve(subPath, 'server', 'entry.js'),
contentServer
);
await writeFile(
path.resolve(subPath, 'server', 'query.graphql'),
query
);
}
})
);
}
================================================
FILE: packages/evershop/src/bin/lib/devEnvHelper.ts
================================================
import webpack from 'webpack';
import middleware from 'webpack-dev-middleware';
import webpackHotMiddleware from 'webpack-hot-middleware';
import { createConfigClient } from '../../lib/webpack/dev/createConfigClient.js';
type DevConfig = {
admin: {
compiler?: webpack.Compiler;
devMiddleware?: ReturnType<typeof middleware>;
hotMiddleware?: ReturnType<typeof webpackHotMiddleware>;
};
frontStore: {
compiler?: webpack.Compiler | null;
devMiddleware?: ReturnType<typeof middleware> | null;
hotMiddleware?: ReturnType<typeof webpackHotMiddleware> | null;
};
};
const webpackConfig = {
admin: {},
frontStore: {}
} as DevConfig;
function getWebpackCompiler(isAdmin: boolean) {
const area = isAdmin ? 'admin' : 'frontStore';
if (!webpackConfig[area].compiler) {
webpackConfig[area].compiler = webpack(createConfigClient(isAdmin) as any);
}
return webpackConfig[area].compiler;
}
function getDevMiddleware(isAdmin: boolean) {
const area = isAdmin ? 'admin' : 'frontStore';
if (!webpackConfig[area].devMiddleware) {
const compiler = getWebpackCompiler(isAdmin);
const devMiddleware = middleware(compiler, {
serverSideRender: true,
publicPath: isAdmin ? '/backend/' : '/',
stats: 'none'
});
devMiddleware.context.logger.info = () => {};
webpackConfig[area].devMiddleware = devMiddleware;
}
return webpackConfig[area].devMiddleware;
}
function getHotMiddleware(isAdmin: boolean) {
const area = isAdmin ? 'admin' : 'frontStore';
if (!webpackConfig[area].hotMiddleware) {
const compiler = getWebpackCompiler(isAdmin);
const hotMiddleware = webpackHotMiddleware(compiler, {
path: isAdmin ? `/__webpack_hmr_admin` : `/__webpack_hmr_frontstore`
});
webpackConfig[area].hotMiddleware = hotMiddleware;
}
return webpackConfig[area].hotMiddleware;
}
export { getWebpackCompiler, getDevMiddleware, getHotMiddleware };
================================================
FILE: packages/evershop/src/bin/lib/loadModules.js
================================================
import { readdirSync } from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const coreModules = [
{
name: 'auth',
resolve: path.resolve(__dirname, '../../modules/auth'),
path: path.resolve(__dirname, '../../modules/auth')
},
{
name: 'base',
resolve: path.resolve(__dirname, '../../modules/base'),
path: path.resolve(__dirname, '../../modules/base')
},
{
name: 'catalog',
resolve: path.resolve(__dirname, '../../modules/catalog'),
path: path.resolve(__dirname, '../../modules/catalog')
},
{
name: 'checkout',
resolve: path.resolve(__dirname, '../../modules/checkout'),
path: path.resolve(__dirname, '../../modules/checkout')
},
{
name: 'cms',
resolve: path.resolve(__dirname, '../../modules/cms'),
path: path.resolve(__dirname, '../../modules/cms')
},
{
name: 'cod',
resolve: path.resolve(__dirname, '../../modules/cod'),
path: path.resolve(__dirname, '../../modules/cod')
},
{
name: 'customer',
resolve: path.resolve(__dirname, '../../modules/customer'),
path: path.resolve(__dirname, '../../modules/customer')
},
{
name: 'graphql',
resolve: path.resolve(__dirname, '../../modules/graphql'),
path: path.resolve(__dirname, '../../modules/graphql')
},
{
name: 'oms',
resolve: path.resolve(__dirname, '../../modules/oms'),
path: path.resolve(__dirname, '../../modules/oms')
},
{
name: 'paypal',
resolve: path.resolve(__dirname, '../../modules/paypal'),
path: path.resolve(__dirname, '../../modules/paypal')
},
{
name: 'promotion',
resolve: path.resolve(__dirname, '../../modules/promotion'),
path: path.resolve(__dirname, '../../modules/promotion')
},
{
name: 'setting',
resolve: path.resolve(__dirname, '../../modules/setting'),
path: path.resolve(__dirname, '../../modules/setting')
},
{
name: 'stripe',
resolve: path.resolve(__dirname, '../../modules/stripe'),
path: path.resolve(__dirname, '../../modules/stripe')
},
{
name: 'tax',
resolve: path.resolve(__dirname, '../../modules/tax'),
path: path.resolve(__dirname, '../../modules/tax')
}
];
export function loadModule(path) {
return readdirSync(path, { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => ({
name: dirent.name,
path: path.resolve(path, dirent.name)
}));
}
export function getCoreModules() {
return coreModules;
}
================================================
FILE: packages/evershop/src/bin/lib/normalizePort.js
================================================
/**
* Normalize a port into a number, string, or false.
*/
export function normalizePort() {
const port = parseInt(process.env.PORT, 10);
if (isNaN(port)) {
return 3000;
}
if (port >= 0) {
// port number
return port;
}
return 3000;
}
================================================
FILE: packages/evershop/src/bin/lib/onError.js
================================================
import { error } from '../../lib/log/logger.js';
import { normalizePort } from './normalizePort.js';
const port = normalizePort();
/**
* Event listener for HTTP server "err" event.
*/
export function onError(err) {
if (err.syscall !== 'listen') {
throw err;
}
const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;
// handle specific listen errors with friendly messages
switch (err.code) {
case 'EACCES':
error(`${bind} requires elevated privileges\n`);
process.exit(1);
break;
case 'EADDRINUSE':
error(`${bind} is already in use\n`);
process.exit(1);
break;
default:
throw err;
}
}
================================================
FILE: packages/evershop/src/bin/lib/onListening.js
================================================
import boxen from 'boxen';
import kleur from 'kleur';
import { normalizePort } from './normalizePort.js';
const port = normalizePort();
/**
* Event listener for HTTP server "listening" event.
*/
export function onListening() {
const message = boxen(
`Your website is running at "http://localhost:${port}"`,
{
title: 'EverShop',
titleAlignment: 'center',
padding: 1,
margin: 1,
borderColor: 'green'
}
);
// eslint-disable-next-line no-console
console.log(kleur.green(message));
}
================================================
FILE: packages/evershop/src/bin/lib/prepare.js
================================================
import { getAdminRoutes } from '../../src/lib/router/Router.js';
export function prepare(app, middlewares, routes) {
const adminRoutes = getAdminRoutes();
middlewares.forEach((m) => {
if (m.routeId === null) {
app.use(m.middleware);
} else if (m.routeId === 'admin') {
adminRoutes.forEach((route) => {
if (route.id !== 'adminStaticAsset' || m.id === 'isAdmin') {
route.method.forEach((method) => {
switch (method.toUpperCase()) {
case 'GET':
app.get(route.path, m.middleware);
break;
case 'POST':
app.post(route.path, m.middleware);
break;
case 'PUT':
app.put(route.path, m.middleware);
break;
case 'DELETE':
app.delete(route.path, m.middleware);
break;
default:
app.get(route.path, m.middleware);
break;
}
});
}
});
} else if (m.routeId === 'frontStore') {
app.all('*', (request, response, next) => {
const route = request.currentRoute;
if (route.isAdmin === true || route.id === 'staticAsset') {
return next();
}
return m.middleware(request, response, next);
});
} else {
const route = routes.find((r) => r.id === m.routeId);
if (route !== undefined) {
route.method.forEach((method) => {
switch (method.toUpperCase()) {
case 'GET':
app.get(route.path, m.middleware);
break;
case 'POST':
app.post(route.path, m.middleware);
break;
case 'PUT':
app.put(route.path, m.middleware);
break;
case 'DELETE':
app.delete(route.path, m.middleware);
break;
default:
app.get(route.path, m.middleware);
break;
}
});
}
}
});
}
================================================
FILE: packages/evershop/src/bin/lib/startCronProcess.ts
================================================
import path from 'path';
import { fileURLToPath } from 'url';
import spawn from 'cross-spawn';
import { error } from '../../lib/log/logger.js';
import isDevelopmentMode from '../../lib/util/isDevelopmentMode.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export function startCronProcess(context) {
// Spawn the child process to manage scheduled jobs
const jobArgs = [path.resolve(__dirname, '../../lib/cronjob/cronjob.js')];
if (isDevelopmentMode() || process.argv.includes('--debug')) {
jobArgs.push('--debug');
}
const jobChild = spawn('node', jobArgs, {
stdio: 'inherit',
env: {
...process.env,
bootstrapContext: JSON.stringify(context),
ALLOW_CONFIG_MUTATIONS: true
}
});
jobChild.on('error', (err) => {
error(`Error spawning job processor: ${err}`);
});
jobChild.unref();
return jobChild;
}
================================================
FILE: packages/evershop/src/bin/lib/startSubscriberProcess.ts
================================================
import path from 'path';
import { fileURLToPath } from 'url';
import spawn from 'cross-spawn';
import { error } from '../../lib/log/logger.js';
import isDevelopmentMode from '../../lib/util/isDevelopmentMode.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export function startSubscriberProcess(context) {
const args = [path.resolve(__dirname, '../../lib/event/event-manager.js')];
if (isDevelopmentMode() || process.argv.includes('--debug')) {
args.push('--debug');
}
const child = spawn('node', args, {
stdio: 'inherit',
env: {
...process.env,
bootstrapContext: JSON.stringify(context),
ALLOW_CONFIG_MUTATIONS: true
}
});
child.on('error', (err) => {
error(`Error spawning event processor: ${err}`);
});
child.unref();
return child;
}
================================================
FILE: packages/evershop/src/bin/lib/startUp.js
================================================
import http from 'http';
import path from 'path';
import { fileURLToPath } from 'url';
import config from 'config';
import spawn from 'cross-spawn';
import { error, debug } from '../../lib/log/logger.js';
import { Handler } from '../../lib/middleware/Handler.js';
import { lockHooks } from '../../lib/util/hookable.js';
import isDevelopmentMode from '../../lib/util/isDevelopmentMode.js';
import { lockRegistry } from '../../lib/util/registry.js';
import { validateConfiguration } from '../../lib/util/validateConfiguration.js';
import { getEnabledExtensions } from '../extension/index.js';
import { createApp } from './app.js';
import { loadBootstrapScript } from './bootstrap/bootstrap.js';
import { migrate } from './bootstrap/migrate.js';
import { getCoreModules } from './loadModules.js';
import { normalizePort } from './normalizePort.js';
import { onError } from './onError.js';
import { onListening } from './onListening.js';
import { startCronProcess } from './startCronProcess.js';
import { startSubscriberProcess } from './startSubscriberProcess.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export const start = async function start(context, cb) {
const app = createApp();
/** Create a http server */
const server = http.createServer(app);
const modules = [...getCoreModules(), ...getEnabledExtensions()];
/** Loading bootstrap script from modules */
try {
for (const module of modules) {
await loadBootstrapScript(module, context);
}
lockHooks();
lockRegistry();
// Get the configuration (nodeconfig)
validateConfiguration(config);
} catch (e) {
error(e);
process.exit(0);
}
process.env.ALLOW_CONFIG_MUTATIONS = false;
/** Migration */
try {
await migrate(modules);
} catch (e) {
error(e);
process.exit(0);
}
/**
* Get port from environment and store in Express.
*/
const port = normalizePort();
app.set('port', port);
/** Start listening */
server.on('listening', () => {
onListening();
if (cb) {
cb();
}
});
server.on('error', onError);
server.listen(port);
// Spawn the child process to manage events
let subscriberChild = startSubscriberProcess(context);
let jobChild = startCronProcess(context);
process.on('exit', (code) => {
// Cleanup child processes on exit
if (subscriberChild && subscriberChild.pid) {
subscriberChild.kill('SIGTERM');
}
if (jobChild && jobChild.pid) {
jobChild.kill('SIGTERM');
}
if (code === 100) {
debug('Restarting the sever');
process.send('RESTART_ME');
}
});
process.on('RESTART_CRONJOB', () => {
debug('Restarting the cron job process');
jobChild.kill('SIGTERM');
jobChild = startCronProcess(context);
});
process.on('RESTART_SUBSCRIBER', () => {
debug('Restarting the subscriber process');
subscriberChild.kill('SIGTERM');
subscriberChild = startSubscriberProcess(context);
});
};
================================================
FILE: packages/evershop/src/bin/lib/watch/broadcast.js
================================================
import { getRoutes } from '../../../lib/router/Router.js';
export const broadcast = async () => {
const routes = getRoutes();
routes.forEach((route) => {
if (route.hotMiddleware) {
const { hotMiddleware } = route;
hotMiddleware.publish({
action: 'serverReloaded'
});
}
});
};
================================================
FILE: packages/evershop/src/bin/lib/watch/compileSwc.ts
================================================
import fs, { promises as fsp } from 'fs';
import type { PathLike } from 'fs';
import path from 'path';
import { execa } from 'execa';
import { CONSTANTS } from '../../../lib/helpers.js';
import { error, warning } from '../../../lib/log/logger.js';
export async function compileSwc(
srcPath: PathLike,
distPath: PathLike
): Promise<void> {
// Check if the source is a file or directory
if (!fs.existsSync(srcPath)) {
warning(`Source path ${srcPath} does not exist.`);
return;
// Check if file extension is not either ts, js, tsx, or jsx
} else if (
fs.statSync(srcPath).isFile() &&
!['.ts', '.js', '.tsx', '.jsx'].includes(path.extname(srcPath as string))
) {
// For this case, we just force copy the file to the dist directory
try {
const directory = path.dirname(distPath as string);
await fsp.mkdir(directory, { recursive: true });
await fsp.copyFile(srcPath as string, distPath as string);
} catch (err) {
error(`Error copying ${srcPath} to ${distPath}:`);
throw err;
}
} else {
let cliOptions;
const configFile = path.resolve(CONSTANTS.LIBPATH, '../../.swcrc');
if (fs.statSync(srcPath).isDirectory()) {
cliOptions = [
srcPath as string,
'-d',
distPath as string,
'--config-file',
configFile,
'--strip-leading-paths',
'--copy-files'
];
} else {
cliOptions = [
srcPath as string,
'-o',
distPath as string,
'--config-file',
configFile,
'--strip-leading-paths'
];
}
try {
// Delete the dist directory if it exists using rimraf
await fsp.rm(distPath as string, { recursive: true, force: true });
await execa('swc', cliOptions, {
cwd: path.resolve(srcPath as string, '..')
});
} catch (err) {
error(`Error compiling ${srcPath}:`);
throw err;
}
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/effect.ts
================================================
import { existsSync } from 'fs';
import { basename, dirname } from 'path';
import { Application } from 'express';
import { minimatch } from 'minimatch';
import { has } from '../../../bin/dev/register.js';
import { getEnabledJobs } from '../../../lib/cronjob/jobManager.js';
import { debug, error } from '../../../lib/log/logger.js';
import { getRoute } from '../../../lib/router/Router.js';
import { broadcast } from './broadcast.js';
import { isRestartRequired } from './isRestartRequired.js';
import { isSrc } from './isSrc.js';
import { processors } from './processors/index.js';
import { Event } from './watchHandler.js';
export type Effect =
| 'restart'
| 'restart_cronjob'
| 'restart_event'
| 'add_middleware'
| 'remove_middleware'
| 'update_middleware'
| 'add_component'
| 'remove_component'
| 'update_component'
| 'add_api_route'
| 'remove_api_route'
| 'update_api_route'
| 'add_admin_route'
| 'remove_admin_route'
| 'update_admin_route'
| 'add_front_store_route'
| 'remove_front_store_route'
| 'update_front_store_route'
| 'update_graphql'
| 'unknown';
function isValidRouteFolder(name: string): boolean {
const segments = name.split('+');
// Make sure all segment match this regex: /^[a-zA-Z]+$/
return segments.every((segment) => /^[a-zA-Z]+$/.test(segment));
}
export function detectEffect(event: Event): Effect {
const jobs = getEnabledJobs();
if (isRestartRequired(event)) {
return 'restart'; // No specific effect, just a restart required
} else if (minimatch(event.path.toString(), '**/*/[A-Z]*.+(jsx|tsx)')) {
const routeFolder = basename(dirname(event.path.toString()));
if (!isValidRouteFolder(routeFolder)) {
return 'unknown'; // Not a valid route folder, skip
}
if (event.type === 'create') {
if (
minimatch(
event.path.toString(),
'**/pages/+(admin|frontStore)/[A-Z]*.+(jsx|tsx)'
)
) {
return 'update_component';
} else {
return 'add_component';
}
} else if (event.type === 'delete') {
return 'remove_component';
} else {
return 'update_component';
}
} else if (minimatch(event.path.toString(), '**/+(api|admin|frontStore)/*')) {
const fileName = basename(event.path.toString());
if (!isValidRouteFolder(fileName)) {
return 'unknown'; // Not a valid route folder, skip
}
if (event.type === 'delete') {
const route = getRoute(fileName);
if (route) {
const routePath = route.path;
if (!existsSync(routePath)) {
// If the route file does not exist, it means the route folder is deleted. We can safely delete the route.
if (route.isApi) {
return 'remove_api_route';
} else if (route.isAdmin) {
return 'remove_admin_route';
} else {
return 'remove_front_store_route';
}
} else {
return 'remove_middleware'; // The route folder still exists, so we just need to remove the middleware
}
} else {
// This folder is not representing a route, so we just need to take care of midldleware functions
return 'remove_middleware';
}
} else {
return 'unknown';
}
} else if (
minimatch(
event.path.toString(),
'**/+(api|admin|frontStore)/*/[a-z[]*.+(js|ts)'
)
) {
const routeFolder = basename(dirname(event.path.toString()));
if (!isValidRouteFolder(routeFolder)) {
return 'unknown'; // Not a valid route folder, skip
}
if (event.type === 'create') {
return 'add_middleware'; // This is a middleware file
} else if (event.type === 'delete') {
return 'remove_middleware';
} else {
return 'update_middleware';
}
} else if (minimatch(event.path.toString(), '**/api/*/route.json')) {
const routeFolder = basename(dirname(event.path.toString()));
if (!isValidRouteFolder(routeFolder)) {
return 'unknown'; // Not a valid route folder, skip
}
if (event.type === 'create') {
return 'add_api_route';
} else if (event.type === 'delete') {
return 'remove_api_route';
} else {
return 'update_api_route';
}
} else if (minimatch(event.path.toString(), '**/api/*/payloadSchema.json')) {
// This is a payload schema file for an API route
const routeFolder = basename(dirname(event.path.toString()));
if (!isValidRouteFolder(routeFolder)) {
return 'unknown'; // Not a valid route folder, skip
}
return 'update_api_route';
} else if (minimatch(event.path.toString(), '**/pages/admin/*/route.json')) {
const routeFolder = basename(dirname(event.path.toString()));
if (!isValidRouteFolder(routeFolder)) {
return 'unknown'; // Not a valid route folder, skip
}
if (event.type === 'create') {
return 'add_admin_route';
} else if (event.type === 'delete') {
return 'remove_admin_route';
} else {
return 'update_admin_route';
}
} else if (
minimatch(event.path.toString(), '**/pages/frontStore/*/route.json')
) {
const routeFolder = basename(dirname(event.path.toString()));
if (!isValidRouteFolder(routeFolder)) {
return 'unknown'; // Not a valid route folder, skip
}
if (event.type === 'create') {
return 'add_front_store_route';
} else if (event.type === 'delete') {
return 'remove_front_store_route';
} else {
return 'update_front_store_route';
}
} else if (
minimatch(event.path.toString(), '**/*/*.graphql') ||
minimatch(event.path.toString(), '**/*/*.resolvers.+(ts|js)')
) {
return 'update_graphql'; // GraphQL schema or resolvers file
} else if (minimatch(event.path.toString(), '**/subscribers/**/*.+(ts|js)')) {
return 'restart_event';
}
// Check if the file is a job file
else if (
event.path &&
jobs.some(
(job) =>
job.resolve ===
event.path.toString().replace('src', 'dist').replace(/\.ts$/, '.js')
)
) {
return 'restart_cronjob';
} else if (isSrc(event.path.toString())) {
const distPath = event.path
.toString()
.replace('src', 'dist')
.replace(/\.ts$/, '.js');
if (has(distPath)) {
// This module is being used in the application, so we need to restart the process
return 'restart';
} else {
return 'unknown'; // This is a source file, but not used in the application
}
} else {
const distPath = event.path.toString();
if (has(distPath)) {
// This module is being used in the application, so we need to restart the process
return 'restart';
} else {
return 'unknown'; // This is a source file, but not used in the application
}
}
}
export function applyEffects(events: Event[], app: Application) {
for (const event of events) {
if (!event.effect) {
continue; // Skip if no effect is detected
} else {
const processor = processors[event.effect];
if (processor) {
try {
debug(`Applying changes: ${event.effect} for ${event.path}`);
processor(app, event);
} catch (e) {
error(`Error applying changes for ${event.path}:`);
error(e);
}
} else {
debug(`No processor found for effect type: ${event.effect}`);
}
}
}
// Call broadcast to notify all clients about the changes if there are any known effects
if (
events.some(
(e) =>
e.effect &&
!['unknown', 'restart_cronjob', 'restart_event'].includes(e.effect) &&
!e.effect.includes('component')
)
) {
debug('Broadcasting changes to all clients');
broadcast();
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/getDistPaths.ts
================================================
import { PathLike } from 'fs';
export function getDistPaths(): PathLike[] {
return ['dist', 'packages/evershop/dist', 'packages/agegate/dist'];
}
================================================
FILE: packages/evershop/src/bin/lib/watch/getRootPaths.ts
================================================
import { PathLike } from 'fs';
import path from 'path';
import type { Event } from './watchHandler.js';
/**
* Deduplicates a list of paths, keeping only the top-most created folders.
* @param {Array<{ path: string, type: string }>} entries
* @returns {Event[]} Top-level unique root folders
*/
export function getRootPaths(entries: Event[]): Event[] {
const sortedPaths = entries
.map((entry) => path.resolve(entry.path as string))
.sort();
const roots: Event[] = [];
for (const current of sortedPaths) {
if (!roots.some((root) => current.startsWith(root.path + path.sep))) {
roots.push({
path: current,
type: entries.find((entry) => entry.path === current)?.type || 'create'
});
}
}
return roots;
}
================================================
FILE: packages/evershop/src/bin/lib/watch/getSrcPaths.ts
================================================
import { PathLike } from 'fs';
import path from 'path';
import { getEnabledExtensions } from '../../../bin/extension/index.js';
import { CONSTANTS } from '../../../lib/helpers.js';
import { getEnabledTheme } from '../../../lib/util/getEnabledTheme.js';
export function getSrcPaths(): PathLike[] {
const extensions = getEnabledExtensions();
const theme = getEnabledTheme();
return extensions
.filter((ext) => ext.srcPath)
.map((ext) => ext.srcPath as PathLike)
.concat(
!CONSTANTS.MODULESPATH.includes('node_modules')
? (path.resolve(
CONSTANTS.ROOTPATH,
'packages/evershop/src/'
) as PathLike)
: []
)
.concat(theme?.srcPath ? (theme.srcPath as PathLike) : []);
}
================================================
FILE: packages/evershop/src/bin/lib/watch/isDist.js
================================================
import path from 'path';
import { getDistPaths } from './getDistPaths.js';
export function isDist(pathName) {
if (
getDistPaths().some((distPath) => pathName.startsWith(distPath + path.sep))
) {
return true;
} else {
return false;
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/isRestartRequired.ts
================================================
import path from 'path';
import { CONSTANTS } from '../../../lib/helpers.js';
import { isSrc } from './isSrc.js';
import { Event } from './watchHandler.js';
export function isRestartRequired(event: Event) {
if (isSrc(event.path)) {
return false;
} else if (event.path === path.resolve(CONSTANTS.ROOTPATH, '.env')) {
// If the .env file is changed, we need to restart the server
return true;
} else {
const configPath = path.resolve(CONSTANTS.ROOTPATH, 'config');
if (
event.path.toString().startsWith(configPath) &&
path.extname(event.path as string) === '.json'
) {
// If a config JSON file is changed, we need to restart the server
return true;
}
return false;
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/isSrc.js
================================================
import path from 'path';
import { getSrcPaths } from './getSrcPaths.js';
export function isSrc(pathName) {
if (
getSrcPaths().some((srcPath) => pathName.startsWith(srcPath + path.sep))
) {
return true;
} else {
return false;
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/addAdminRoute.ts
================================================
import { Application } from 'express';
import { warning } from '../../../../lib/log/logger.js';
import { addRoute, hasRoute } from '../../../../lib/router/Router.js';
import { parseRoute } from '../../../../lib/router/scanForRoutes.js';
import { Event } from '../watchHandler.js';
export function addAdminRoute(app: Application, event: Event) {
try {
const jsonPath = event.path.toString();
const route = parseRoute(jsonPath, true, false);
if (hasRoute(route?.id)) {
warning(`Route ${route?.id} already exists. Skipping adding new route.`);
} else {
addRoute(route);
}
} catch (error) {
warning(
`Failed to add new route from ${event.path}: ${error.message}. Skipping.`
);
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/addApiRoute.ts
================================================
import { Application } from 'express';
import { warning } from '../../../../lib/log/logger.js';
import { Handler } from '../../../../lib/middleware/Handler.js';
import { addRoute, hasRoute } from '../../../../lib/router/Router.js';
import { parseRoute } from '../../../../lib/router/scanForRoutes.js';
import { Event } from '../watchHandler.js';
export function addApiRoute(app: Application, event: Event) {
try {
const jsonPath = event.path.toString();
const route = parseRoute(jsonPath, false, true);
if (!route || hasRoute(route?.id)) {
warning(`Route ${route?.id} already exists. Skipping adding new route.`);
} else {
addRoute(route);
for (const method of route.methods) {
switch (method.toUpperCase()) {
case 'GET':
app.get(route.path, Handler.middleware());
break;
case 'POST':
app.post(route.path, Handler.middleware());
break;
case 'PUT':
app.put(route.path, Handler.middleware());
break;
case 'DELETE':
app.delete(route.path, Handler.middleware());
break;
case 'PATCH':
app.patch(route.path, Handler.middleware());
break;
default:
app.get(route.path, Handler.middleware());
break;
}
}
}
} catch (error) {
warning(
`Failed to add new route from ${event.path}: ${error.message}. Skipping.`
);
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/addComponent.ts
================================================
import { Application } from 'express';
import { warning } from '../../../../lib/log/logger.js';
import { Event } from '../watchHandler.js';
export function addComponent(app: Application, event: Event) {
// Do nothing. Let ThemeWatcherPlugin handle this.
}
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/addFrontStoreRoute.ts
================================================
import { Application } from 'express';
import { warning } from '../../../../lib/log/logger.js';
import { addRoute, hasRoute } from '../../../../lib/router/Router.js';
import { parseRoute } from '../../../../lib/router/scanForRoutes.js';
import { Event } from '../watchHandler.js';
export function addFrontStoreRoute(app: Application, event: Event) {
try {
const jsonPath = event.path.toString();
const route = parseRoute(jsonPath, false, false);
if (hasRoute(route?.id)) {
warning(`Route ${route?.id} already exists. Skipping adding new route.`);
} else {
addRoute(route);
}
} catch (error) {
warning(
`Failed to add new route from ${event.path}: ${error.message}. Skipping.`
);
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/addMiddleware.ts
================================================
import { Application } from 'express';
import { warning } from '../../../../lib/log/logger.js';
import { Handler } from '../../../../lib/middleware/Handler.js';
import { Event } from '../watchHandler.js';
export function addMiddleware(app: Application, event: Event) {
try {
const filePath = event.jsPath?.toString();
Handler.addMiddlewareFromPath(filePath);
} catch (error) {
warning(
`Failed to add new middleware from ${event.jsPath}: ${error.message}. Skipping.`
);
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/deleteARoute.ts
================================================
import { basename, dirname } from 'path';
import { Application } from 'express';
import { warning } from '../../../../lib/log/logger.js';
import { deleteRoute, hasRoute } from '../../../../lib/router/Router.js';
import { Event } from '../watchHandler.js';
export function deleteARoute(app: Application, event: Event) {
try {
const jsonPath = event.path.toString();
const routeId = jsonPath.includes('route.json')
? basename(dirname(jsonPath))
: basename(jsonPath);
if (hasRoute(routeId)) {
deleteRoute(routeId);
}
} catch (error) {
warning(
`Failed to delete route from ${event.path}: ${error.message}. Skipping.`
);
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/index.ts
================================================
import { Application } from 'express';
import { Effect } from '../effect.js';
import { addAdminRoute } from './addAdminRoute.js';
import { addApiRoute } from './addApiRoute.js';
import { addComponent } from './addComponent.js';
import { addFrontStoreRoute } from './addFrontStoreRoute.js';
import { addMiddleware } from './addMiddleware.js';
import { deleteARoute } from './deleteARoute.js';
import { removeMiddleware } from './removeMiddleware.js';
import { restartCronJob } from './restartCronJob.js';
import { restartSubscriber } from './restartSubscriber.js';
import { updateAdminRoute } from './updateAdminRoute.js';
import { updateApiRoute } from './updateApiRoute.js';
import { updateFrontStoreRoute } from './updateFrontStoreRoute.js';
export type Processor = {
[key in Effect]?: (app: Application, event: any) => void;
};
export const processors: Processor = {
add_api_route: addApiRoute,
update_api_route: updateApiRoute,
add_front_store_route: addFrontStoreRoute,
update_front_store_route: updateFrontStoreRoute,
add_admin_route: addAdminRoute,
update_admin_route: updateAdminRoute,
remove_api_route: deleteARoute,
remove_admin_route: deleteARoute,
remove_front_store_route: deleteARoute,
add_middleware: addMiddleware,
remove_middleware: removeMiddleware,
update_middleware: () => {},
update_component: () => {
// No operation for update_component, as it is handled by the compiler}
},
remove_component: () => {
// No operation for update_component, as it is handled by the compiler}
},
add_component: addComponent,
update_graphql: () => {},
restart_cronjob: () => {
restartCronJob();
},
restart_event: () => {
restartSubscriber();
}
};
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/removeMiddleware.ts
================================================
import { Application } from 'express';
import { warning } from '../../../../lib/log/logger.js';
import { Handler } from '../../../../lib/middleware/Handler.js';
import { Event } from '../watchHandler.js';
export function removeMiddleware(app: Application, event: Event) {
try {
const filePath = event.jsPath?.toString();
Handler.removeMiddlewares(filePath);
} catch (error) {
warning(
`Failed to remove middleware from ${event.jsPath}: ${error.message}. Skipping.`
);
}
}
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/restart.ts
================================================
export function restartProcess() {
process.exit(100);
}
================================================
FILE: packages/evershop/src/bin/lib/watch/processors/restartCronJob.ts
================================================
export function r
gitextract_6d_loyql/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── pull_request_template.md │ └── workflows/ │ └── build_test.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── changelog.md ├── docker-compose.yml ├── eslint.config.js ├── jest.config.js ├── package.json ├── packages/ │ ├── create-evershop-app/ │ │ ├── README.md │ │ ├── createEverShopApp.js │ │ ├── index.js │ │ ├── package.json │ │ └── sample/ │ │ └── themes/ │ │ └── sample/ │ │ ├── dist/ │ │ │ └── pages/ │ │ │ ├── all/ │ │ │ │ ├── EveryWhere.d.ts │ │ │ │ ├── EveryWhere.js │ │ │ │ └── EveryWhere.js.map │ │ │ └── homepage/ │ │ │ ├── OnlyHomePage.d.ts │ │ │ ├── OnlyHomePage.js │ │ │ └── OnlyHomePage.js.map │ │ ├── package.json │ │ ├── src/ │ │ │ └── pages/ │ │ │ ├── all/ │ │ │ │ └── EveryWhere.tsx │ │ │ └── homepage/ │ │ │ └── OnlyHomePage.tsx │ │ └── tsconfig.json │ ├── evershop/ │ │ ├── .swcrc │ │ ├── README.md │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── postpack.js │ │ │ ├── postpublish.js │ │ │ └── prepublish.js │ │ ├── src/ │ │ │ ├── bin/ │ │ │ │ ├── build/ │ │ │ │ │ ├── client/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── complie.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── initEnvBuild.ts │ │ │ │ │ └── server/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── useDDL.js │ │ │ │ │ └── useVendorChunk.js │ │ │ │ ├── dev/ │ │ │ │ │ ├── compileTs.js │ │ │ │ │ ├── enableWatcher.js │ │ │ │ │ ├── hooks.js │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── init.ts │ │ │ │ │ ├── initEnvDev.ts │ │ │ │ │ └── register.js │ │ │ │ ├── evershop.js │ │ │ │ ├── extension/ │ │ │ │ │ └── index.ts │ │ │ │ ├── install/ │ │ │ │ │ ├── createMigrationTable.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── templates/ │ │ │ │ │ └── config.json │ │ │ │ ├── lib/ │ │ │ │ │ ├── addDefaultMiddlewareFuncs.ts │ │ │ │ │ ├── app.js │ │ │ │ │ ├── bootstrap/ │ │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ │ └── migrate.js │ │ │ │ │ ├── buildEntry.js │ │ │ │ │ ├── devEnvHelper.ts │ │ │ │ │ ├── loadModules.js │ │ │ │ │ ├── normalizePort.js │ │ │ │ │ ├── onError.js │ │ │ │ │ ├── onListening.js │ │ │ │ │ ├── prepare.js │ │ │ │ │ ├── startCronProcess.ts │ │ │ │ │ ├── startSubscriberProcess.ts │ │ │ │ │ ├── startUp.js │ │ │ │ │ └── watch/ │ │ │ │ │ ├── broadcast.js │ │ │ │ │ ├── compileSwc.ts │ │ │ │ │ ├── effect.ts │ │ │ │ │ ├── getDistPaths.ts │ │ │ │ │ ├── getRootPaths.ts │ │ │ │ │ ├── getSrcPaths.ts │ │ │ │ │ ├── isDist.js │ │ │ │ │ ├── isRestartRequired.ts │ │ │ │ │ ├── isSrc.js │ │ │ │ │ ├── processors/ │ │ │ │ │ │ ├── addAdminRoute.ts │ │ │ │ │ │ ├── addApiRoute.ts │ │ │ │ │ │ ├── addComponent.ts │ │ │ │ │ │ ├── addFrontStoreRoute.ts │ │ │ │ │ │ ├── addMiddleware.ts │ │ │ │ │ │ ├── deleteARoute.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── removeMiddleware.ts │ │ │ │ │ │ ├── restart.ts │ │ │ │ │ │ ├── restartCronJob.ts │ │ │ │ │ │ ├── restartSubscriber.ts │ │ │ │ │ │ ├── touch.js │ │ │ │ │ │ ├── updateAdminRoute.ts │ │ │ │ │ │ ├── updateApiRoute.ts │ │ │ │ │ │ └── updateFrontStoreRoute.ts │ │ │ │ │ └── watchHandler.ts │ │ │ │ ├── seed/ │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── attributes.json │ │ │ │ │ │ ├── categories.json │ │ │ │ │ │ ├── collections.json │ │ │ │ │ │ ├── pages.json │ │ │ │ │ │ ├── products.json │ │ │ │ │ │ └── widgets.json │ │ │ │ │ ├── imageDownloader.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── initEnvDev.ts │ │ │ │ │ ├── seedAttributes.ts │ │ │ │ │ ├── seedCategories.ts │ │ │ │ │ ├── seedCollections.ts │ │ │ │ │ ├── seedImages.ts │ │ │ │ │ ├── seedPages.ts │ │ │ │ │ ├── seedProducts.ts │ │ │ │ │ ├── seedWidgets.ts │ │ │ │ │ └── variantGroupHelpers.ts │ │ │ │ ├── start/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── initEnvStart.ts │ │ │ │ ├── theme/ │ │ │ │ │ ├── active.ts │ │ │ │ │ ├── create.ts │ │ │ │ │ └── twizz.ts │ │ │ │ └── user/ │ │ │ │ ├── changePassword.js │ │ │ │ └── create.js │ │ │ ├── components/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── AttributeGroupSelector.tsx │ │ │ │ │ ├── CategorySelector.tsx │ │ │ │ │ ├── CategoryTree.scss │ │ │ │ │ ├── CategoryTree.tsx │ │ │ │ │ ├── CollectionSelector.tsx │ │ │ │ │ ├── FileBrowser.scss │ │ │ │ │ ├── FileBrowser.tsx │ │ │ │ │ ├── FormButtons.tsx │ │ │ │ │ ├── ImageUploader.scss │ │ │ │ │ ├── ImageUploader.tsx │ │ │ │ │ ├── ImageUploaderSkeleton.tsx │ │ │ │ │ ├── NavigationItem.scss │ │ │ │ │ ├── NavigationItem.tsx │ │ │ │ │ ├── NavigationItemGroup.scss │ │ │ │ │ ├── NavigationItemGroup.tsx │ │ │ │ │ ├── PageHeading.scss │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ ├── ProductListSkeleton.tsx │ │ │ │ │ ├── ProductSelector.tsx │ │ │ │ │ ├── SettingMenu.tsx │ │ │ │ │ ├── Spinner.jsx │ │ │ │ │ ├── Status.tsx │ │ │ │ │ └── grid/ │ │ │ │ │ ├── GridPagination.tsx │ │ │ │ │ ├── Thumbnail.tsx │ │ │ │ │ └── header/ │ │ │ │ │ ├── Dummy.tsx │ │ │ │ │ └── Sortable.tsx │ │ │ │ ├── common/ │ │ │ │ │ ├── Area.tsx │ │ │ │ │ ├── Editor.scss │ │ │ │ │ ├── Editor.tsx │ │ │ │ │ ├── ExtendableTable.tsx │ │ │ │ │ ├── Image.tsx │ │ │ │ │ ├── Link.tsx │ │ │ │ │ ├── LoadingBar.scss │ │ │ │ │ ├── LoadingBar.tsx │ │ │ │ │ ├── Meta.tsx │ │ │ │ │ ├── Notification.scss │ │ │ │ │ ├── Notification.tsx │ │ │ │ │ ├── ProductNoThumbnail.tsx │ │ │ │ │ ├── RenderIfTrue.tsx │ │ │ │ │ ├── Script.tsx │ │ │ │ │ ├── SimplePagination.tsx │ │ │ │ │ ├── StaticImage.tsx │ │ │ │ │ ├── Title.tsx │ │ │ │ │ ├── context/ │ │ │ │ │ │ └── app.tsx │ │ │ │ │ ├── customer/ │ │ │ │ │ │ └── address/ │ │ │ │ │ │ └── AddressSummary.jsx │ │ │ │ │ ├── form/ │ │ │ │ │ │ ├── CheckboxField.tsx │ │ │ │ │ │ ├── DateField.tsx │ │ │ │ │ │ ├── DateTimeLocalField.tsx │ │ │ │ │ │ ├── Editor.scss │ │ │ │ │ │ ├── Editor.tsx │ │ │ │ │ │ ├── EmailField.tsx │ │ │ │ │ │ ├── FileField.tsx │ │ │ │ │ │ ├── Form.tsx │ │ │ │ │ │ ├── InputField.tsx │ │ │ │ │ │ ├── NumberField.tsx │ │ │ │ │ │ ├── PasswordField.tsx │ │ │ │ │ │ ├── RadioGroupField.tsx │ │ │ │ │ │ ├── RangeField.tsx │ │ │ │ │ │ ├── ReactSelectCreatableField.tsx │ │ │ │ │ │ ├── ReactSelectField.tsx │ │ │ │ │ │ ├── SelectField.tsx │ │ │ │ │ │ ├── TelField.tsx │ │ │ │ │ │ ├── TextareaField.tsx │ │ │ │ │ │ ├── TimeField.tsx │ │ │ │ │ │ ├── ToggleField.tsx │ │ │ │ │ │ ├── Tooltip.tsx │ │ │ │ │ │ ├── UrlField.tsx │ │ │ │ │ │ ├── editor/ │ │ │ │ │ │ │ ├── GetColumnClasses.tsx │ │ │ │ │ │ │ ├── GetRowClasses.tsx │ │ │ │ │ │ │ ├── RawToolWrapper.ts │ │ │ │ │ │ │ └── RowTemplates.tsx │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ └── getNestedError.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── locale/ │ │ │ │ │ │ ├── CountryOption.jsx │ │ │ │ │ │ ├── CurrencyOption.jsx │ │ │ │ │ │ ├── LanguageOption.jsx │ │ │ │ │ │ ├── ProvinceOption.jsx │ │ │ │ │ │ └── TimezoneOption.jsx │ │ │ │ │ ├── modal/ │ │ │ │ │ │ ├── Alert.jsx │ │ │ │ │ │ └── Alert.scss │ │ │ │ │ ├── react/ │ │ │ │ │ │ ├── Head.jsx │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── Client.tsx │ │ │ │ │ │ │ ├── HotReload.tsx │ │ │ │ │ │ │ ├── Hydrate.tsx │ │ │ │ │ │ │ ├── HydrateAdmin.tsx │ │ │ │ │ │ │ ├── HydrateFrontStore.tsx │ │ │ │ │ │ │ └── Index.jsx │ │ │ │ │ │ ├── getComponents.js │ │ │ │ │ │ └── server/ │ │ │ │ │ │ ├── Server.tsx │ │ │ │ │ │ └── render.tsx │ │ │ │ │ └── ui/ │ │ │ │ │ ├── Accordion.tsx │ │ │ │ │ ├── Alert.tsx │ │ │ │ │ ├── AlertDialog.tsx │ │ │ │ │ ├── AspectRatio.tsx │ │ │ │ │ ├── Avatar.tsx │ │ │ │ │ ├── Badge.tsx │ │ │ │ │ ├── Breadcrumb.tsx │ │ │ │ │ ├── Button.tsx │ │ │ │ │ ├── ButtonGroup.tsx │ │ │ │ │ ├── Card.tsx │ │ │ │ │ ├── Chart.tsx │ │ │ │ │ ├── Checkbox.tsx │ │ │ │ │ ├── Circle.tsx │ │ │ │ │ ├── Collapsible.tsx │ │ │ │ │ ├── ContextMenu.tsx │ │ │ │ │ ├── Dialog.tsx │ │ │ │ │ ├── DropdownMenu.tsx │ │ │ │ │ ├── Empty.tsx │ │ │ │ │ ├── Field.tsx │ │ │ │ │ ├── HoverCard.tsx │ │ │ │ │ ├── Input.tsx │ │ │ │ │ ├── InputGroup.tsx │ │ │ │ │ ├── Item.tsx │ │ │ │ │ ├── Kbd.tsx │ │ │ │ │ ├── Label.tsx │ │ │ │ │ ├── Menubar.tsx │ │ │ │ │ ├── NavigationMenu.tsx │ │ │ │ │ ├── Pagination.tsx │ │ │ │ │ ├── Popover.tsx │ │ │ │ │ ├── Progress.tsx │ │ │ │ │ ├── RadioGroup.tsx │ │ │ │ │ ├── ScrollArea.tsx │ │ │ │ │ ├── Select.tsx │ │ │ │ │ ├── Separator.tsx │ │ │ │ │ ├── Sheet.tsx │ │ │ │ │ ├── Sidebar.tsx │ │ │ │ │ ├── Skeleton.tsx │ │ │ │ │ ├── Slider.tsx │ │ │ │ │ ├── Spinner.tsx │ │ │ │ │ ├── Switch.tsx │ │ │ │ │ ├── Table.tsx │ │ │ │ │ ├── Tabs.tsx │ │ │ │ │ ├── Textarea.tsx │ │ │ │ │ ├── Toggle.tsx │ │ │ │ │ ├── ToggleGroup.tsx │ │ │ │ │ ├── Tooltip.tsx │ │ │ │ │ └── hooks/ │ │ │ │ │ └── useIsMobile.tsx │ │ │ │ └── frontStore/ │ │ │ │ ├── Coupon.tsx │ │ │ │ ├── CouponForm.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ ├── Header.scss │ │ │ │ ├── Header.tsx │ │ │ │ ├── Og.tsx │ │ │ │ ├── Pagination.tsx │ │ │ │ ├── cart/ │ │ │ │ │ ├── AddToCart.tsx │ │ │ │ │ ├── CartContext.tsx │ │ │ │ │ ├── CartItems.tsx │ │ │ │ │ ├── CartSummaryItems.tsx │ │ │ │ │ ├── CartTotalSummary.tsx │ │ │ │ │ ├── DefaultCartItemList.tsx │ │ │ │ │ ├── DefaultMiniCartDropdown.tsx │ │ │ │ │ ├── DefaultMiniCartDropdownEmpty.tsx │ │ │ │ │ ├── DefaultMiniCartIcon.tsx │ │ │ │ │ ├── DefaultMiniCartItemList.tsx │ │ │ │ │ ├── DefaultMinicartDropdownSummary.tsx │ │ │ │ │ ├── ItemQuantity.tsx │ │ │ │ │ ├── MiniCart.tsx │ │ │ │ │ └── ShoppingCartEmpty.tsx │ │ │ │ ├── catalog/ │ │ │ │ │ ├── CategoryContext.tsx │ │ │ │ │ ├── CategoryInfo.tsx │ │ │ │ │ ├── CategoryProducts.tsx │ │ │ │ │ ├── CategoryProductsFilter.tsx │ │ │ │ │ ├── CategoryProductsPagination.tsx │ │ │ │ │ ├── DefaultAttributeFilterRender.tsx │ │ │ │ │ ├── DefaultCategoryFilterRender.tsx │ │ │ │ │ ├── DefaultFilterWrapperRender.tsx │ │ │ │ │ ├── DefaultPriceFilterRender.tsx │ │ │ │ │ ├── DefaultProductFilterRender.tsx │ │ │ │ │ ├── DefaultProductFilterSummary.tsx │ │ │ │ │ ├── DefaultVariantSelectorRender.tsx │ │ │ │ │ ├── Media.scss │ │ │ │ │ ├── Media.tsx │ │ │ │ │ ├── ProductContext.tsx │ │ │ │ │ ├── ProductFilter.tsx │ │ │ │ │ ├── ProductList.tsx │ │ │ │ │ ├── ProductListEmptyRender.tsx │ │ │ │ │ ├── ProductListItemRender.tsx │ │ │ │ │ ├── ProductListLoadingSkeleton.tsx │ │ │ │ │ ├── ProductSingleAttributes.tsx │ │ │ │ │ ├── ProductSingleDescription.tsx │ │ │ │ │ ├── ProductSingleForm.tsx │ │ │ │ │ ├── ProductSingleName.tsx │ │ │ │ │ ├── ProductSingleSku.tsx │ │ │ │ │ ├── ProductSorting.tsx │ │ │ │ │ ├── SearchBox.tsx │ │ │ │ │ ├── SearchContext.tsx │ │ │ │ │ ├── SearchInfo.tsx │ │ │ │ │ ├── SearchProducts.tsx │ │ │ │ │ ├── SearchProductsPagination.tsx │ │ │ │ │ └── VariantSelector.tsx │ │ │ │ ├── checkout/ │ │ │ │ │ ├── CheckoutButton.tsx │ │ │ │ │ ├── CheckoutContext.tsx │ │ │ │ │ ├── ContactInformation.tsx │ │ │ │ │ ├── OrderSummaryItems.tsx │ │ │ │ │ ├── OrderTotalSummary.tsx │ │ │ │ │ ├── Payment.tsx │ │ │ │ │ ├── Shipment.tsx │ │ │ │ │ ├── payment/ │ │ │ │ │ │ ├── BillingAddress.tsx │ │ │ │ │ │ └── PaymentMethods.tsx │ │ │ │ │ └── shipment/ │ │ │ │ │ └── ShippingMethods.tsx │ │ │ │ └── customer/ │ │ │ │ ├── AccountInfo.tsx │ │ │ │ ├── CustomerContext.tsx │ │ │ │ ├── LoginForm.tsx │ │ │ │ ├── MyAddresses.tsx │ │ │ │ ├── OrderHistory.tsx │ │ │ │ ├── RegistrationForm.tsx │ │ │ │ ├── ResetPasswordForm.tsx │ │ │ │ └── address/ │ │ │ │ └── addressForm/ │ │ │ │ ├── AddressForm.tsx │ │ │ │ ├── AddressFormLoadingSkeleton.scss │ │ │ │ ├── AddressFormLoadingSkeleton.tsx │ │ │ │ ├── Index.tsx │ │ │ │ ├── NameAndTelephone.tsx │ │ │ │ └── ProvinceAndPostcode.tsx │ │ │ ├── lib/ │ │ │ │ ├── babel/ │ │ │ │ │ ├── config.js │ │ │ │ │ └── index.js │ │ │ │ ├── componee/ │ │ │ │ │ ├── getComponentsByRoute.ts │ │ │ │ │ ├── scanForComponents.ts │ │ │ │ │ ├── scanForRootComponents.ts │ │ │ │ │ └── tests/ │ │ │ │ │ └── unit/ │ │ │ │ │ ├── __mocks__/ │ │ │ │ │ │ ├── modules/ │ │ │ │ │ │ │ ├── firstModule/ │ │ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ │ │ └── Menu.js │ │ │ │ │ │ │ │ └── productView/ │ │ │ │ │ │ │ │ ├── Name.js │ │ │ │ │ │ │ │ └── Price.js │ │ │ │ │ │ │ └── secondModule/ │ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ │ └── Banner.js │ │ │ │ │ │ │ └── productView/ │ │ │ │ │ │ │ ├── Description.js │ │ │ │ │ │ │ ├── Inventory.js │ │ │ │ │ │ │ └── Name.js │ │ │ │ │ │ └── themes/ │ │ │ │ │ │ └── justatheme/ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ ├── CommentList.js │ │ │ │ │ │ │ └── Shipping.js │ │ │ │ │ │ └── productView/ │ │ │ │ │ │ ├── Name.js │ │ │ │ │ │ ├── OutOfStock.js │ │ │ │ │ │ └── Price.js │ │ │ │ │ └── scanRouteComponents.test.js │ │ │ │ ├── cronjob/ │ │ │ │ │ ├── cronjob.ts │ │ │ │ │ ├── jobManager.ts │ │ │ │ │ └── tests/ │ │ │ │ │ └── unit/ │ │ │ │ │ └── jobManager.test.js │ │ │ │ ├── event/ │ │ │ │ │ ├── callSubscibers.js │ │ │ │ │ ├── emitter.ts │ │ │ │ │ ├── event-manager.js │ │ │ │ │ ├── loadSubscribers.js │ │ │ │ │ └── subscriber.ts │ │ │ │ ├── helpers.ts │ │ │ │ ├── locale/ │ │ │ │ │ ├── countries.ts │ │ │ │ │ ├── currencies.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── provinces.ts │ │ │ │ │ ├── timezones.ts │ │ │ │ │ └── translate/ │ │ │ │ │ ├── _.ts │ │ │ │ │ └── translate.ts │ │ │ │ ├── log/ │ │ │ │ │ ├── CustomColorize.js │ │ │ │ │ └── logger.js │ │ │ │ ├── mail/ │ │ │ │ │ └── emailHelper.ts │ │ │ │ ├── middleware/ │ │ │ │ │ ├── Handler.js │ │ │ │ │ ├── addMiddleware.js │ │ │ │ │ ├── buildMiddlewareFunction.js │ │ │ │ │ ├── delegate.ts │ │ │ │ │ ├── eNext.js │ │ │ │ │ ├── findDublicatedMiddleware.js │ │ │ │ │ ├── getRouteFromPath.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── isErrorHandlerTriggered.js │ │ │ │ │ ├── isNextRequired.js │ │ │ │ │ ├── noDuplicateId.js │ │ │ │ │ ├── parseFromFile.js │ │ │ │ │ ├── scanForMiddlewareFunctions.js │ │ │ │ │ ├── sort.js │ │ │ │ │ └── tests/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ ├── app.js │ │ │ │ │ │ └── modules/ │ │ │ │ │ │ ├── 404page/ │ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ │ └── product/ │ │ │ │ │ │ │ ├── [loadProduct]loadCategory.js │ │ │ │ │ │ │ ├── [loadProduct]loadProductImage.js │ │ │ │ │ │ │ ├── loadProduct.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ └── api/ │ │ │ │ │ │ │ ├── createA/ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ └── global/ │ │ │ │ │ │ │ └── apiGlobal.js │ │ │ │ │ │ ├── authcopy/ │ │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ │ ├── createA/ │ │ │ │ │ │ │ │ │ └── [index]afterIndex.js │ │ │ │ │ │ │ │ └── global/ │ │ │ │ │ │ │ │ ├── [context]auth.js │ │ │ │ │ │ │ │ └── apiAuthGlobal.js │ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ │ └── global/ │ │ │ │ │ │ │ └── [context]auth.js │ │ │ │ │ │ ├── basecopy/ │ │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ │ └── global/ │ │ │ │ │ │ │ │ ├── [apiResponse]apiErrorHandler.js │ │ │ │ │ │ │ │ ├── [auth]apiResponse[apiErrorHandler].js │ │ │ │ │ │ │ │ ├── [auth]payloadValidate.js │ │ │ │ │ │ │ │ ├── [payloadValidate]escapeHtml.js │ │ │ │ │ │ │ │ └── context.js │ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ │ │ ├── adminStaticAsset/ │ │ │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ │ │ └── staticAssets.js │ │ │ │ │ │ │ │ └── all/ │ │ │ │ │ │ │ │ └── adminTitle.js │ │ │ │ │ │ │ ├── frontStore/ │ │ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ │ │ └── title.js │ │ │ │ │ │ │ │ ├── notFound/ │ │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ │ └── staticAsset/ │ │ │ │ │ │ │ │ ├── [context]staticAssets[auth].js │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ └── global/ │ │ │ │ │ │ │ ├── [auth]notFound[response].js │ │ │ │ │ │ │ ├── [notFound]dummy[response].js │ │ │ │ │ │ │ ├── [response]errorHandler.js │ │ │ │ │ │ │ ├── context.js │ │ │ │ │ │ │ └── response[errorHandler].js │ │ │ │ │ │ ├── delegate/ │ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ │ └── delegateTest/ │ │ │ │ │ │ │ ├── asyncWithNext[collection].js │ │ │ │ │ │ │ ├── async[collection].js │ │ │ │ │ │ │ ├── collection.js │ │ │ │ │ │ │ ├── returnOne[returnTwo].js │ │ │ │ │ │ │ ├── returnThree[collection].js │ │ │ │ │ │ │ ├── returnTwo[returnThree].js │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ ├── syncOne.js │ │ │ │ │ │ │ ├── syncWithNext[collection].js │ │ │ │ │ │ │ └── sync[collection].js │ │ │ │ │ │ ├── error/ │ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ │ └── errorHandlerTest/ │ │ │ │ │ │ │ ├── errorInAsync.js │ │ │ │ │ │ │ ├── errorInAsyncWithNext.js │ │ │ │ │ │ │ ├── errorInSync.js │ │ │ │ │ │ │ ├── errorInSyncWithNext.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── graphqlcopy/ │ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ │ └── global/ │ │ │ │ │ │ │ ├── [bodyParser]buildQuery[graphql].js │ │ │ │ │ │ │ ├── [buildQuery]graphql[notFound].js │ │ │ │ │ │ │ └── bodyParser[buildQuery].js │ │ │ │ │ │ └── handler/ │ │ │ │ │ │ └── pages/ │ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ │ └── productEdit/ │ │ │ │ │ │ │ ├── [loadProduct]loadCategory.js │ │ │ │ │ │ │ ├── [loadProduct]loadProductImage.js │ │ │ │ │ │ │ ├── loadProduct.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ └── middleware/ │ │ │ │ │ │ ├── [loadAttribute]loadOptions.js │ │ │ │ │ │ ├── [loadProductImage]loadAttribute.js │ │ │ │ │ │ ├── [loadProduct]loadCategory.js │ │ │ │ │ │ ├── [loadProduct]loadProductImage.js │ │ │ │ │ │ ├── [syncOne,asyncOne]checkExecutionOrderAsync[loadAttribute].js │ │ │ │ │ │ ├── [syncOne,asyncOne]checkExecutionOrder[loadAttribute].js │ │ │ │ │ │ ├── asyncOne[loadAttribute].js │ │ │ │ │ │ ├── loadProduct[loadAttribute].js │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── syncOne[loadAttribute].js │ │ │ │ │ └── unit/ │ │ │ │ │ ├── 404page.handling.test.js │ │ │ │ │ ├── 500error.handling.test.js │ │ │ │ │ ├── apiHandler.middleware.test.js │ │ │ │ │ ├── delegate.test.js │ │ │ │ │ ├── handler.getMiddlewaresByRoute.test.js │ │ │ │ │ ├── handlers.middleware.test.js │ │ │ │ │ ├── middleware.buildMiddlewareFunction.test.js │ │ │ │ │ ├── middleware.getRouteFromPath.test.js │ │ │ │ │ ├── middleware.noDublicateId.test.js │ │ │ │ │ └── middleware.scanForMiddlewareFunctions.test.js │ │ │ │ ├── middlewares/ │ │ │ │ │ ├── bodyJson.ts │ │ │ │ │ ├── multerNone.ts │ │ │ │ │ ├── publicStatic.ts │ │ │ │ │ ├── static.ts │ │ │ │ │ └── themePublicStatic.ts │ │ │ │ ├── pathToRegexp.js │ │ │ │ ├── postgres/ │ │ │ │ │ └── connection.ts │ │ │ │ ├── response/ │ │ │ │ │ └── render.ts │ │ │ │ ├── router/ │ │ │ │ │ ├── Router.js │ │ │ │ │ ├── buildAbsoluteUrl.ts │ │ │ │ │ ├── buildUrl.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── loadModuleRoutes.js │ │ │ │ │ ├── registerAdminRoute.js │ │ │ │ │ ├── registerFrontStoreRoute.js │ │ │ │ │ ├── scanForRoutes.js │ │ │ │ │ ├── sortRoutes.js │ │ │ │ │ ├── tests/ │ │ │ │ │ │ └── unit/ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ ├── invalidMethod/ │ │ │ │ │ │ │ │ └── routeOne/ │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ └── invalidPath/ │ │ │ │ │ │ │ └── routeTwo/ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── b/ │ │ │ │ │ │ │ ├── routeOne/ │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── routeThree/ │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ └── routeTwo/ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── unit.scanForRoutes.test.js │ │ │ │ │ │ └── unit.validateRoute.test.js │ │ │ │ │ └── validateRoute.js │ │ │ │ ├── util/ │ │ │ │ │ ├── assign.js │ │ │ │ │ ├── buildFilterFromUrl.ts │ │ │ │ │ ├── camelCase.ts │ │ │ │ │ ├── cn.ts │ │ │ │ │ ├── defaultPaginationFilters.js │ │ │ │ │ ├── events.ts │ │ │ │ │ ├── filterOperationMap.ts │ │ │ │ │ ├── formToJson.js │ │ │ │ │ ├── get.ts │ │ │ │ │ ├── getBaseUrl.ts │ │ │ │ │ ├── getConfig.ts │ │ │ │ │ ├── getEnabledTheme.ts │ │ │ │ │ ├── getEnv.ts │ │ │ │ │ ├── hookable.ts │ │ │ │ │ ├── httpStatus.ts │ │ │ │ │ ├── isAjax.ts │ │ │ │ │ ├── isDevelopmentMode.ts │ │ │ │ │ ├── isPlainObject.ts │ │ │ │ │ ├── isProductionMode.ts │ │ │ │ │ ├── isResolvable.ts │ │ │ │ │ ├── jsonParse.ts │ │ │ │ │ ├── jwt.ts │ │ │ │ │ ├── keyGenerator.ts │ │ │ │ │ ├── merge.js │ │ │ │ │ ├── parseImageSizes.ts │ │ │ │ │ ├── passwordHelper.ts │ │ │ │ │ ├── preloadScan.ts │ │ │ │ │ ├── readCsvFile.ts │ │ │ │ │ ├── registry.ts │ │ │ │ │ ├── sanitizeHtml.ts │ │ │ │ │ ├── tests/ │ │ │ │ │ │ └── unit/ │ │ │ │ │ │ ├── util.assign.test.js │ │ │ │ │ │ ├── util.get.test.js │ │ │ │ │ │ ├── util.getConfig.test.js │ │ │ │ │ │ ├── util.hookable.test.js │ │ │ │ │ │ ├── util.jwt.test.js │ │ │ │ │ │ ├── util.merge.test.js │ │ │ │ │ │ ├── util.parseImageSizes.test.js │ │ │ │ │ │ ├── util.preloadScan.test.js │ │ │ │ │ │ └── util.registry.test.js │ │ │ │ │ ├── validateConfiguration.js │ │ │ │ │ └── validator.ts │ │ │ │ ├── webpack/ │ │ │ │ │ ├── createBaseConfig.js │ │ │ │ │ ├── dev/ │ │ │ │ │ │ └── createConfigClient.js │ │ │ │ │ ├── getRouteBuildPath.js │ │ │ │ │ ├── getRouteBuildSubPath.js │ │ │ │ │ ├── isBuildRequired.ts │ │ │ │ │ ├── loaders/ │ │ │ │ │ │ ├── AreaLoader.js │ │ │ │ │ │ ├── GraphQLAPILoader.js │ │ │ │ │ │ ├── GraphqlLoader.js │ │ │ │ │ │ ├── LayoutLoader.js │ │ │ │ │ │ ├── StyleLoader.js │ │ │ │ │ │ ├── TailwindLoader.js │ │ │ │ │ │ ├── TranslationLoader.js │ │ │ │ │ │ └── loadTranslationFromCsv.ts │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── FileListPlugin.js │ │ │ │ │ │ ├── GraphqlPlugin.js │ │ │ │ │ │ ├── InjectTailwindSources.ts │ │ │ │ │ │ ├── Tailwindcss.ts │ │ │ │ │ │ └── ThemeWatcherPlugin.ts │ │ │ │ │ ├── prod/ │ │ │ │ │ │ ├── createConfigClient.js │ │ │ │ │ │ └── createConfigServer.js │ │ │ │ │ ├── resolveAlias.js │ │ │ │ │ ├── tests/ │ │ │ │ │ │ └── unit/ │ │ │ │ │ │ ├── resolveAlias.test.js │ │ │ │ │ │ └── theme/ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── a/ │ │ │ │ │ │ │ ├── A.jsx │ │ │ │ │ │ │ └── a.scss │ │ │ │ │ │ └── b/ │ │ │ │ │ │ ├── B.jsx │ │ │ │ │ │ ├── B.scss │ │ │ │ │ │ └── bb/ │ │ │ │ │ │ └── BB.jsx │ │ │ │ │ └── util/ │ │ │ │ │ ├── getTailwindConfig.js │ │ │ │ │ ├── getTailwindSources.ts │ │ │ │ │ ├── parseGraphql.js │ │ │ │ │ └── parseGraphqlByFile.js │ │ │ │ └── widget/ │ │ │ │ ├── tests/ │ │ │ │ │ └── unit/ │ │ │ │ │ └── widgetManager.test.js │ │ │ │ └── widgetManager.ts │ │ │ ├── modules/ │ │ │ │ ├── auth/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── getUserToken/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── generateToken.ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── global/ │ │ │ │ │ │ │ ├── [context]getCurrentUser.ts │ │ │ │ │ │ │ ├── [context]jwtUserAuth[getCurrentUser].ts │ │ │ │ │ │ │ ├── [getCurrentUser]auth.ts │ │ │ │ │ │ │ └── [getCurrentUser]demoAccountBlocking[auth].ts │ │ │ │ │ │ └── refreshUserToken/ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── refreshToken.ts │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ └── AdminUser/ │ │ │ │ │ │ ├── AdminUser.admin.graphql │ │ │ │ │ │ └── AdminUser.admin.resolvers.js │ │ │ │ │ ├── migration/ │ │ │ │ │ │ ├── Version-1.0.0.js │ │ │ │ │ │ └── Version-1.0.1.js │ │ │ │ │ ├── pages/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ ├── adminLogin/ │ │ │ │ │ │ │ ├── LoginForm.scss │ │ │ │ │ │ │ ├── LoginForm.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── adminLoginJson/ │ │ │ │ │ │ │ ├── [bodyParser]logIn.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── adminLogoutJson/ │ │ │ │ │ │ │ ├── logout.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── all/ │ │ │ │ │ │ ├── AdminUser.jsx │ │ │ │ │ │ └── [context]auth.js │ │ │ │ │ └── services/ │ │ │ │ │ ├── getAdminSessionCookieName.ts │ │ │ │ │ ├── getCookieSecret.ts │ │ │ │ │ ├── getFrontStoreSessionCookieName.ts │ │ │ │ │ ├── getSessionConfig.ts │ │ │ │ │ ├── loginUserWithEmail.ts │ │ │ │ │ └── logoutUser.ts │ │ │ │ ├── base/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ └── global/ │ │ │ │ │ │ ├── [apiResponse]apiErrorHandler.ts │ │ │ │ │ │ ├── [auth]apiResponse[apiErrorHandler].ts │ │ │ │ │ │ ├── [auth]payloadValidate.ts │ │ │ │ │ │ ├── [payloadValidate]escapeHtml.ts │ │ │ │ │ │ └── context.js │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ ├── Country/ │ │ │ │ │ │ │ ├── Country.graphql │ │ │ │ │ │ │ └── Country.resolvers.js │ │ │ │ │ │ ├── Currency/ │ │ │ │ │ │ │ ├── Currency.graphql │ │ │ │ │ │ │ └── Currency.resolvers.js │ │ │ │ │ │ ├── DateTime/ │ │ │ │ │ │ │ ├── DateTime.graphql │ │ │ │ │ │ │ └── DateTime.resolvers.js │ │ │ │ │ │ ├── Province/ │ │ │ │ │ │ │ ├── Province.graphql │ │ │ │ │ │ │ └── Province.resolvers.js │ │ │ │ │ │ ├── Route/ │ │ │ │ │ │ │ ├── Route.admin.graphql │ │ │ │ │ │ │ └── Route.admin.resolvers.js │ │ │ │ │ │ ├── Timezone/ │ │ │ │ │ │ │ ├── Timezone.graphql │ │ │ │ │ │ │ └── Timezone.resolvers.js │ │ │ │ │ │ ├── Url/ │ │ │ │ │ │ │ ├── Url.graphql │ │ │ │ │ │ │ └── Url.resolvers.js │ │ │ │ │ │ └── Version/ │ │ │ │ │ │ ├── Version.graphql │ │ │ │ │ │ └── Version.resolvers.js │ │ │ │ │ ├── migration/ │ │ │ │ │ │ └── Version-1.0.1.js │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ │ └── all/ │ │ │ │ │ │ │ ├── FormCss.tsx │ │ │ │ │ │ │ ├── GlobalCss.tsx │ │ │ │ │ │ │ ├── Layout.tsx │ │ │ │ │ │ │ ├── Meta.tsx │ │ │ │ │ │ │ ├── TailwindCss.tsx │ │ │ │ │ │ │ ├── [context]isAdmin[auth].js │ │ │ │ │ │ │ ├── form.scss │ │ │ │ │ │ │ ├── global.scss │ │ │ │ │ │ │ ├── shadcn.css │ │ │ │ │ │ │ └── tailwind.css │ │ │ │ │ │ ├── frontStore/ │ │ │ │ │ │ │ └── all/ │ │ │ │ │ │ │ ├── Base.tsx │ │ │ │ │ │ │ ├── Breadcrumb.tsx │ │ │ │ │ │ │ ├── GlobalCss.tsx │ │ │ │ │ │ │ ├── HeadTags.tsx │ │ │ │ │ │ │ ├── Logo.tsx │ │ │ │ │ │ │ ├── Notification.scss │ │ │ │ │ │ │ ├── Notification.tsx │ │ │ │ │ │ │ ├── TailwindCss.tsx │ │ │ │ │ │ │ ├── global.scss │ │ │ │ │ │ │ ├── shadcn.css │ │ │ │ │ │ │ └── tailwind.css │ │ │ │ │ │ └── global/ │ │ │ │ │ │ ├── [auth]notFound[response].ts │ │ │ │ │ │ ├── [response]errorHandler.js │ │ │ │ │ │ ├── context.js │ │ │ │ │ │ └── response[errorHandler].ts │ │ │ │ │ └── services/ │ │ │ │ │ ├── escapePayload.ts │ │ │ │ │ ├── getAjv.js │ │ │ │ │ ├── markSkipEscape.ts │ │ │ │ │ ├── notifications.js │ │ │ │ │ └── secret.js │ │ │ │ ├── catalog/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── addProductToCategory/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── addProducts.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── addProductToCollection/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── addProducts.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── addVariantItem/ │ │ │ │ │ │ │ ├── [bodyParser]addItem.js │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createAttribute/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── createAttribute[finish].js │ │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createAttributeGroup/ │ │ │ │ │ │ │ ├── [bodyParser]saveGroup.js │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createCategory/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── createCategory[finish].ts │ │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createCollection/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── createCollection[finish].ts │ │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createProduct/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── createProduct[finish].ts │ │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createVariantGroup/ │ │ │ │ │ │ │ ├── [bodyParser]saveGroup.js │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteAttribute/ │ │ │ │ │ │ │ ├── deleteAttribute.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteAttributeGroup/ │ │ │ │ │ │ │ ├── deleteAttributeGroup.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteCategory/ │ │ │ │ │ │ │ ├── deleteCategory.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteCollection/ │ │ │ │ │ │ │ ├── deleteCollection.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteProduct/ │ │ │ │ │ │ │ ├── deleteProduct.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── removeProductFromCategory/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── removeProducts.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── removeProductFromCollection/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── removeProducts.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── unlinkVariant/ │ │ │ │ │ │ │ ├── [context]multerNone[auth].js │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── unlinkVariants.js │ │ │ │ │ │ ├── updateAttribute/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updateAttribute[finish].ts │ │ │ │ │ │ ├── updateAttributeGroup/ │ │ │ │ │ │ │ ├── [bodyParser]saveGroup.js │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── updateCategory/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updateCategory[finish].ts │ │ │ │ │ │ ├── updateCollection/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updateCollection[finish].ts │ │ │ │ │ │ ├── updateProduct/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updateProduct[finish].ts │ │ │ │ │ │ └── variantSearch/ │ │ │ │ │ │ ├── loadVariants.js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── CollectionProducts.tsx │ │ │ │ │ │ └── CollectionProductsSetting.tsx │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ ├── Attribute/ │ │ │ │ │ │ │ ├── Attribute.admin.graphql │ │ │ │ │ │ │ ├── Attribute.admin.resolvers.js │ │ │ │ │ │ │ ├── Attribute.graphql │ │ │ │ │ │ │ └── Attribute.resolvers.js │ │ │ │ │ │ ├── Category/ │ │ │ │ │ │ │ ├── Category.admin.graphql │ │ │ │ │ │ │ ├── Category.admin.resolvers.js │ │ │ │ │ │ │ ├── Category.graphql │ │ │ │ │ │ │ └── Category.resolvers.ts │ │ │ │ │ │ ├── Collection/ │ │ │ │ │ │ │ ├── Collection.admin.graphql │ │ │ │ │ │ │ ├── Collection.admin.resolvers.js │ │ │ │ │ │ │ ├── Collection.graphql │ │ │ │ │ │ │ └── Collection.resolvers.js │ │ │ │ │ │ ├── FeaturedProduct/ │ │ │ │ │ │ │ ├── FeaturedProduct.graphql │ │ │ │ │ │ │ └── FeaturedProduct.resolvers.js │ │ │ │ │ │ ├── Product/ │ │ │ │ │ │ │ ├── Attribute/ │ │ │ │ │ │ │ │ ├── ProductAttribute.graphql │ │ │ │ │ │ │ │ └── ProductAttribute.resolvers.js │ │ │ │ │ │ │ ├── CustomOption/ │ │ │ │ │ │ │ │ ├── CustomOption.graphql │ │ │ │ │ │ │ │ └── CustomOption.resolvers.js │ │ │ │ │ │ │ ├── Image/ │ │ │ │ │ │ │ │ ├── ProductImage.graphql │ │ │ │ │ │ │ │ └── ProductImage.resolvers.ts │ │ │ │ │ │ │ ├── Inventory/ │ │ │ │ │ │ │ │ ├── Inventory.admin.graphql │ │ │ │ │ │ │ │ ├── Inventory.admin.resolvers.js │ │ │ │ │ │ │ │ ├── Inventory.graphql │ │ │ │ │ │ │ │ └── Inventory.resolvers.js │ │ │ │ │ │ │ ├── Price/ │ │ │ │ │ │ │ │ ├── ProductPrice.graphql │ │ │ │ │ │ │ │ └── ProductPrice.resolvers.js │ │ │ │ │ │ │ ├── Product.admin.graphql │ │ │ │ │ │ │ ├── Product.admin.resolvers.ts │ │ │ │ │ │ │ ├── Product.graphql │ │ │ │ │ │ │ ├── Product.resolvers.ts │ │ │ │ │ │ │ └── Variant/ │ │ │ │ │ │ │ ├── Variant.graphql │ │ │ │ │ │ │ └── Variant.resolvers.js │ │ │ │ │ │ └── Widget/ │ │ │ │ │ │ └── CollectionProductsWidget/ │ │ │ │ │ │ ├── CollectionProductsWidget.graphql │ │ │ │ │ │ └── CollectionProductsWidget.resolvers.js │ │ │ │ │ ├── migration/ │ │ │ │ │ │ ├── Version-1.0.0.js │ │ │ │ │ │ ├── Version-1.0.1.js │ │ │ │ │ │ ├── Version-1.0.2.js │ │ │ │ │ │ ├── Version-1.0.3.js │ │ │ │ │ │ ├── Version-1.0.4.js │ │ │ │ │ │ ├── Version-1.0.5.js │ │ │ │ │ │ ├── Version-1.0.6.js │ │ │ │ │ │ ├── Version-1.0.7.js │ │ │ │ │ │ └── Version-1.0.8.ts │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ │ ├── CatalogMenuGroup.jsx │ │ │ │ │ │ │ │ └── NewProductQuickLink.jsx │ │ │ │ │ │ │ ├── attributeEdit/ │ │ │ │ │ │ │ │ ├── AttributeEditForm.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── attributeEdit+attributeNew/ │ │ │ │ │ │ │ │ ├── Avaibility.tsx │ │ │ │ │ │ │ │ ├── General.scss │ │ │ │ │ │ │ │ ├── General.tsx │ │ │ │ │ │ │ │ └── PageHeading.tsx │ │ │ │ │ │ │ ├── attributeGrid/ │ │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ │ ├── NewAttributeButton.tsx │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ │ └── rows/ │ │ │ │ │ │ │ │ ├── AttributeName.tsx │ │ │ │ │ │ │ │ └── GroupRow.tsx │ │ │ │ │ │ │ ├── attributeNew/ │ │ │ │ │ │ │ │ ├── AttributeNewForm.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── categoryEdit/ │ │ │ │ │ │ │ │ ├── CategoryEditForm.tsx │ │ │ │ │ │ │ │ ├── Products.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── categoryEdit+categoryNew/ │ │ │ │ │ │ │ │ ├── General.scss │ │ │ │ │ │ │ │ ├── General.tsx │ │ │ │ │ │ │ │ ├── Image.scss │ │ │ │ │ │ │ │ ├── Image.tsx │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ ├── Seo.tsx │ │ │ │ │ │ │ │ └── Status.tsx │ │ │ │ │ │ │ ├── categoryGrid/ │ │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ │ ├── NewCategoryButton.tsx │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ │ └── rows/ │ │ │ │ │ │ │ │ └── CategoryName.tsx │ │ │ │ │ │ │ ├── categoryNew/ │ │ │ │ │ │ │ │ ├── CategoryNewForm.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── collectionEdit/ │ │ │ │ │ │ │ │ ├── CollectionEditForm.tsx │ │ │ │ │ │ │ │ ├── Products.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── collectionEdit+collectionNew/ │ │ │ │ │ │ │ │ ├── General.scss │ │ │ │ │ │ │ │ ├── General.tsx │ │ │ │ │ │ │ │ └── PageHeading.tsx │ │ │ │ │ │ │ ├── collectionGrid/ │ │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ │ ├── NewCollectionButton.tsx │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ │ └── rows/ │ │ │ │ │ │ │ │ └── CollectionNameRow.tsx │ │ │ │ │ │ │ ├── collectionNew/ │ │ │ │ │ │ │ │ ├── CollectionNewForm.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── productEdit/ │ │ │ │ │ │ │ │ ├── Collection.tsx │ │ │ │ │ │ │ │ ├── ProductEditForm.tsx │ │ │ │ │ │ │ │ ├── VariantGroup.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ │ └── variants/ │ │ │ │ │ │ │ │ ├── CreateVariant.tsx │ │ │ │ │ │ │ │ ├── CreateVariantGroup.tsx │ │ │ │ │ │ │ │ ├── EditVariant.tsx │ │ │ │ │ │ │ │ ├── New.tsx │ │ │ │ │ │ │ │ ├── Skeleton.tsx │ │ │ │ │ │ │ │ ├── Variant.tsx │ │ │ │ │ │ │ │ ├── VariantModal.tsx │ │ │ │ │ │ │ │ └── Variants.tsx │ │ │ │ │ │ │ ├── productEdit+productNew/ │ │ │ │ │ │ │ │ ├── Attributes.tsx │ │ │ │ │ │ │ │ ├── General.scss │ │ │ │ │ │ │ │ ├── General.tsx │ │ │ │ │ │ │ │ ├── Inventory.tsx │ │ │ │ │ │ │ │ ├── Media.tsx │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ ├── Seo.tsx │ │ │ │ │ │ │ │ ├── Shipping.tsx │ │ │ │ │ │ │ │ └── Status.tsx │ │ │ │ │ │ │ ├── productGrid/ │ │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ │ ├── NewProductButton.tsx │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ │ └── rows/ │ │ │ │ │ │ │ │ └── ProductName.tsx │ │ │ │ │ │ │ └── productNew/ │ │ │ │ │ │ │ ├── ProductNewForm.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ └── SearchBox.tsx │ │ │ │ │ │ ├── catalogSearch/ │ │ │ │ │ │ │ ├── SearchPage.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── categoryView/ │ │ │ │ │ │ │ ├── CategoryView.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── productView/ │ │ │ │ │ │ ├── ProductView.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── services/ │ │ │ │ │ │ ├── AttributeCollection.js │ │ │ │ │ │ ├── AttributeGroupCollection.js │ │ │ │ │ │ ├── CategoryCollection.js │ │ │ │ │ │ ├── CollectionCollection.js │ │ │ │ │ │ ├── ProductCollection.js │ │ │ │ │ │ ├── attribute/ │ │ │ │ │ │ │ ├── attributeDataSchema.json │ │ │ │ │ │ │ ├── createProductAttribute.ts │ │ │ │ │ │ │ ├── deleteProductAttribute.ts │ │ │ │ │ │ │ └── updateProductAttribute.ts │ │ │ │ │ │ ├── category/ │ │ │ │ │ │ │ ├── categoryDataSchema.json │ │ │ │ │ │ │ ├── createCategory.ts │ │ │ │ │ │ │ ├── deleteCategory.ts │ │ │ │ │ │ │ └── updateCategory.ts │ │ │ │ │ │ ├── collection/ │ │ │ │ │ │ │ ├── createCollection.ts │ │ │ │ │ │ │ ├── deleteCollection.ts │ │ │ │ │ │ │ └── updateCollection.ts │ │ │ │ │ │ ├── getAttributeGroupsBaseQuery.js │ │ │ │ │ │ ├── getAttributesBaseQuery.js │ │ │ │ │ │ ├── getCategoriesBaseQuery.ts │ │ │ │ │ │ ├── getCollectionsBaseQuery.ts │ │ │ │ │ │ ├── getFilterableAttributes.js │ │ │ │ │ │ ├── getProductsBaseQuery.ts │ │ │ │ │ │ ├── getProductsByCategoryBaseQuery.ts │ │ │ │ │ │ ├── getProductsByCollectionBaseQuery.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── product/ │ │ │ │ │ │ │ ├── createProduct.ts │ │ │ │ │ │ │ ├── deleteProduct.ts │ │ │ │ │ │ │ ├── productDataSchema.json │ │ │ │ │ │ │ └── updateProduct.ts │ │ │ │ │ │ ├── registerCartItemProductUrlField.js │ │ │ │ │ │ ├── registerCartItemVariantOptionsField.js │ │ │ │ │ │ ├── registerDefaultAttributeCollectionFilters.js │ │ │ │ │ │ ├── registerDefaultCategoryCollectionFilters.js │ │ │ │ │ │ ├── registerDefaultCollectionCollectionFilters.js │ │ │ │ │ │ └── registerDefaultProductCollectionFilters.js │ │ │ │ │ ├── subscribers/ │ │ │ │ │ │ ├── category_created/ │ │ │ │ │ │ │ └── buildUrlRewrite.ts │ │ │ │ │ │ ├── category_deleted/ │ │ │ │ │ │ │ └── deleteUrlRewrite.ts │ │ │ │ │ │ ├── category_updated/ │ │ │ │ │ │ │ └── builUrlRewrite.ts │ │ │ │ │ │ ├── product_created/ │ │ │ │ │ │ │ └── buildUrlRewrite.ts │ │ │ │ │ │ ├── product_deleted/ │ │ │ │ │ │ │ └── deleteUrlRewrite.ts │ │ │ │ │ │ └── product_updated/ │ │ │ │ │ │ └── buildUrlRewrite.ts │ │ │ │ │ └── tests/ │ │ │ │ │ └── intergration/ │ │ │ │ │ └── productView.test.js │ │ │ │ ├── checkout/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── addCartAddress/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── saveAddress.ts │ │ │ │ │ │ ├── addCartContactInfo/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── saveContactInfo.js │ │ │ │ │ │ ├── addCartItem/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── addItemToCart.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── addCartPaymentMethod/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── savePaymentMethod.js │ │ │ │ │ │ ├── addCartShippingMethod/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── saveShippingMethod.js │ │ │ │ │ │ ├── addMineCartItem/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── addItemToCart.ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── addShippingNote/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── saveShippingNote.js │ │ │ │ │ │ ├── addShippingZoneMethod/ │ │ │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ │ │ ├── [validateMethod]addShippingZoneMethod.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── validateMethod.js │ │ │ │ │ │ ├── cartCheckout/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── checkout.ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createCart/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── createNewCart.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createOrder/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── placeOrder.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createShippingMethod/ │ │ │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ │ │ ├── createShippingMethod.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createShippingZone/ │ │ │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ │ │ ├── createShippingZone.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteShippingZone/ │ │ │ │ │ │ │ ├── deleteShippingZone.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteShippingZoneMethod/ │ │ │ │ │ │ │ ├── deleteShippingZoneMethod.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── removeCartItem/ │ │ │ │ │ │ │ ├── removeItem.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── removeMineCartItem/ │ │ │ │ │ │ │ ├── removeItem.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── updateCartItemQty/ │ │ │ │ │ │ │ ├── [bodyParser]updateQty.js │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── updateMineCartItemQty/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updateQty.ts │ │ │ │ │ │ ├── updateShippingMethod/ │ │ │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updateShippingMethod.js │ │ │ │ │ │ ├── updateShippingZone/ │ │ │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updateShippingZone.js │ │ │ │ │ │ └── updateShippingZoneMethod/ │ │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ │ ├── [validateMethod]updateShippingZoneMethod.js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── validateMethod.js │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ ├── Cart/ │ │ │ │ │ │ │ ├── Cart.graphql │ │ │ │ │ │ │ └── Cart.resolvers.ts │ │ │ │ │ │ ├── CheckoutSetting/ │ │ │ │ │ │ │ ├── CheckoutSetting.graphql │ │ │ │ │ │ │ └── CheckoutSetting.resolvers.js │ │ │ │ │ │ ├── Date/ │ │ │ │ │ │ │ ├── Date.graphql │ │ │ │ │ │ │ └── Date.resolvers.js │ │ │ │ │ │ ├── PaymentMethod/ │ │ │ │ │ │ │ ├── AvailablePaymentMethod.graphql │ │ │ │ │ │ │ └── AvailablePaymentMethod.resolvers.ts │ │ │ │ │ │ ├── Price/ │ │ │ │ │ │ │ ├── Price.graphql │ │ │ │ │ │ │ └── Price.resolvers.js │ │ │ │ │ │ ├── ShippingMethod/ │ │ │ │ │ │ │ ├── AvailableShippingMethod.graphql │ │ │ │ │ │ │ ├── AvailableShippingMethod.resolvers.ts │ │ │ │ │ │ │ ├── ShippingMethod.admin.graphql │ │ │ │ │ │ │ └── ShippingMethod.admin.resolvers.js │ │ │ │ │ │ ├── ShippingZone/ │ │ │ │ │ │ │ ├── ShippingZone.graphql │ │ │ │ │ │ │ └── ShippingZone.resolvers.js │ │ │ │ │ │ └── Weight/ │ │ │ │ │ │ ├── Weight.graphql │ │ │ │ │ │ └── Weight.resolvers.js │ │ │ │ │ ├── migration/ │ │ │ │ │ │ ├── Version-1.0.0.js │ │ │ │ │ │ ├── Version-1.0.1.js │ │ │ │ │ │ ├── Version-1.0.2.js │ │ │ │ │ │ ├── Version-1.0.3.js │ │ │ │ │ │ ├── Version-1.0.4.js │ │ │ │ │ │ ├── Version-1.0.5.js │ │ │ │ │ │ ├── Version-1.0.6.js │ │ │ │ │ │ └── Version-1.0.7.ts │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ │ └── ShippingSettingMenu.tsx │ │ │ │ │ │ │ └── shippingSetting/ │ │ │ │ │ │ │ ├── ShippingSetting.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── shippingSetting/ │ │ │ │ │ │ │ ├── Method.tsx │ │ │ │ │ │ │ ├── MethodForm.tsx │ │ │ │ │ │ │ ├── Methods.tsx │ │ │ │ │ │ │ ├── PriceBasedPrice.tsx │ │ │ │ │ │ │ ├── WeightBasedPrice.tsx │ │ │ │ │ │ │ ├── Zone.tsx │ │ │ │ │ │ │ ├── ZoneForm.tsx │ │ │ │ │ │ │ └── Zones.tsx │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ ├── MiniCartIcon.tsx │ │ │ │ │ │ │ └── [auth]addCustomerToCart.ts │ │ │ │ │ │ ├── cart/ │ │ │ │ │ │ │ ├── ShoppingCart.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── checkout/ │ │ │ │ │ │ │ ├── Checkout.scss │ │ │ │ │ │ │ ├── Checkout.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── checkoutSuccess/ │ │ │ │ │ │ ├── CheckoutSuccess.jsx │ │ │ │ │ │ ├── CheckoutSuccess.scss │ │ │ │ │ │ ├── CustomerInfo.tsx │ │ │ │ │ │ ├── ShippingNote.tsx │ │ │ │ │ │ ├── Summary.scss │ │ │ │ │ │ ├── Summary.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── services/ │ │ │ │ │ │ ├── addBillingAddress.ts │ │ │ │ │ │ ├── addCartItem.ts │ │ │ │ │ │ ├── addShippingAddress.ts │ │ │ │ │ │ ├── cart/ │ │ │ │ │ │ │ ├── Cart.js │ │ │ │ │ │ │ ├── DataObject.js │ │ │ │ │ │ │ ├── registerCartBaseFields.js │ │ │ │ │ │ │ ├── registerCartItemBaseFields.js │ │ │ │ │ │ │ └── sortFields.js │ │ │ │ │ │ ├── checkout.ts │ │ │ │ │ │ ├── createNewCart.ts │ │ │ │ │ │ ├── getAvailablePaymentMethods.ts │ │ │ │ │ │ ├── getAvailableShippingMethods.ts │ │ │ │ │ │ ├── getCartByUUID.ts │ │ │ │ │ │ ├── getMyCart.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── orderCreator.ts │ │ │ │ │ │ ├── orderValidator.ts │ │ │ │ │ │ ├── removeCartItem.ts │ │ │ │ │ │ ├── saveCart.ts │ │ │ │ │ │ ├── toPrice.ts │ │ │ │ │ │ └── updateCartItemQty.ts │ │ │ │ │ └── tests/ │ │ │ │ │ ├── basicSetup.js │ │ │ │ │ ├── coupons.js │ │ │ │ │ ├── products.js │ │ │ │ │ ├── taxRates.js │ │ │ │ │ └── unit/ │ │ │ │ │ ├── addItemSideEffect.test.js │ │ │ │ │ ├── discountAmount.test.js │ │ │ │ │ ├── grandTotal.test.js │ │ │ │ │ ├── lineTotal.test.js │ │ │ │ │ ├── lineTotalWithDiscount.test.js │ │ │ │ │ ├── productPrice.test.js │ │ │ │ │ ├── removeItemSideEffect.test.js │ │ │ │ │ ├── subTotal.test.js │ │ │ │ │ ├── subTotalWithDiscount.test.js │ │ │ │ │ ├── taxAmount.test.js │ │ │ │ │ ├── taxAmountRounding.test.js │ │ │ │ │ └── updateCartItemQtySideEffect.test.js │ │ │ │ ├── cms/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── createCmsPage/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── createPage[finish].ts │ │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createWidget/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── createWidget[finish].js │ │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteCmsPage/ │ │ │ │ │ │ │ ├── deleteCmsPage.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteWidget/ │ │ │ │ │ │ │ ├── deleteWidget.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── fileBrowser/ │ │ │ │ │ │ │ ├── [context]validatePath[auth].js │ │ │ │ │ │ │ ├── browFiles.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── fileDelete/ │ │ │ │ │ │ │ ├── [context]validatePath[auth].js │ │ │ │ │ │ │ ├── deleteFile.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── fileUpload/ │ │ │ │ │ │ │ ├── [auth,validatePath]multerFile.js │ │ │ │ │ │ │ ├── [multerFile]upload.js │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── validatePath.js │ │ │ │ │ │ ├── folderCreate/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── [context]validatePath[auth].js │ │ │ │ │ │ │ ├── createFolder.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── imageUpload/ │ │ │ │ │ │ │ ├── [auth,validatePath]multerFile.js │ │ │ │ │ │ │ ├── [multerFile]upload.js │ │ │ │ │ │ │ ├── [multerFile]verifyImages[upload].js │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── validatePath.js │ │ │ │ │ │ ├── updateCmsPage/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updatePage[finish].ts │ │ │ │ │ │ └── updateWidget/ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ ├── finish[apiResponse].ts │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateWidget[finish].ts │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── Banner.tsx │ │ │ │ │ │ ├── BannerSetting.tsx │ │ │ │ │ │ ├── BasicMenu.tsx │ │ │ │ │ │ ├── BasicMenuSetting.scss │ │ │ │ │ │ ├── BasicMenuSetting.tsx │ │ │ │ │ │ ├── Slideshow.tsx │ │ │ │ │ │ ├── SlideshowSetting.tsx │ │ │ │ │ │ ├── TextBlock.tsx │ │ │ │ │ │ └── TextBlockSetting.tsx │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ ├── CmsPage/ │ │ │ │ │ │ │ ├── CmsPage.graphql │ │ │ │ │ │ │ └── CmsPage.resolvers.ts │ │ │ │ │ │ ├── Menu/ │ │ │ │ │ │ │ ├── Menu.graphql │ │ │ │ │ │ │ └── Menu.resolvers.js │ │ │ │ │ │ ├── PageInfo/ │ │ │ │ │ │ │ ├── PageInfo.graphql │ │ │ │ │ │ │ └── PageInfo.resolvers.ts │ │ │ │ │ │ ├── ThemeConfig/ │ │ │ │ │ │ │ ├── ThemeConfig.graphql │ │ │ │ │ │ │ └── ThemeConfig.resolvers.js │ │ │ │ │ │ └── Widget/ │ │ │ │ │ │ ├── Widget.graphql │ │ │ │ │ │ └── Widget.resolvers.js │ │ │ │ │ ├── migration/ │ │ │ │ │ │ ├── Version-1.0.0.js │ │ │ │ │ │ ├── Version-1.1.0.js │ │ │ │ │ │ └── Version-1.1.1.js │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ │ ├── adminNotFound/ │ │ │ │ │ │ │ │ ├── Meta.tsx │ │ │ │ │ │ │ │ ├── NotFound.tsx │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── adminStaticAsset/ │ │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ │ └── staticAssets.ts │ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ │ ├── CmsMenuGroup.jsx │ │ │ │ │ │ │ │ ├── CopyRight.tsx │ │ │ │ │ │ │ │ ├── Logo.tsx │ │ │ │ │ │ │ │ ├── Navigation.jsx │ │ │ │ │ │ │ │ ├── Navigation.scss │ │ │ │ │ │ │ │ ├── Notification.jsx │ │ │ │ │ │ │ │ ├── Notification.scss │ │ │ │ │ │ │ │ ├── QuickLinks.jsx │ │ │ │ │ │ │ │ ├── SearchBox.tsx │ │ │ │ │ │ │ │ ├── Survey.tsx │ │ │ │ │ │ │ │ ├── Version.jsx │ │ │ │ │ │ │ │ └── search/ │ │ │ │ │ │ │ │ ├── NoResult.tsx │ │ │ │ │ │ │ │ └── Results.jsx │ │ │ │ │ │ │ ├── cmsPageEdit/ │ │ │ │ │ │ │ │ ├── PageEditForm.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── cmsPageEdit+cmsPageNew/ │ │ │ │ │ │ │ │ ├── General.tsx │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ └── Seo.tsx │ │ │ │ │ │ │ ├── cmsPageGrid/ │ │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ │ ├── NewPageButton.tsx │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ │ └── rows/ │ │ │ │ │ │ │ │ └── PageName.tsx │ │ │ │ │ │ │ ├── cmsPageNew/ │ │ │ │ │ │ │ │ ├── PageNewForm.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── dashboard/ │ │ │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ │ │ ├── Layout.scss │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── widgetEdit/ │ │ │ │ │ │ │ │ ├── WidgetEditForm.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── widgetEdit+widgetNew/ │ │ │ │ │ │ │ │ ├── General.tsx │ │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ │ └── Setting.tsx │ │ │ │ │ │ │ ├── widgetGrid/ │ │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ │ ├── Heading.tsx │ │ │ │ │ │ │ │ ├── NewWidgetButton.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ │ └── rows/ │ │ │ │ │ │ │ │ ├── Name.tsx │ │ │ │ │ │ │ │ └── WidgetTypeRow.tsx │ │ │ │ │ │ │ └── widgetNew/ │ │ │ │ │ │ │ ├── WidgetNewForm.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── typeValidate.js │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ ├── cmsPageView/ │ │ │ │ │ │ │ ├── CmsPageView.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── homepage/ │ │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── images/ │ │ │ │ │ │ │ ├── images.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── notFound/ │ │ │ │ │ │ │ ├── Meta.tsx │ │ │ │ │ │ │ ├── NotFound.tsx │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── staticAsset/ │ │ │ │ │ │ ├── [context]staticAssets[auth].ts │ │ │ │ │ │ └── route.json │ │ │ │ │ └── services/ │ │ │ │ │ ├── CMSPageCollection.js │ │ │ │ │ ├── CustomMemoryStorage.js │ │ │ │ │ ├── WidgetCollection.js │ │ │ │ │ ├── browFiles.ts │ │ │ │ │ ├── createFolder.ts │ │ │ │ │ ├── deleteFile.ts │ │ │ │ │ ├── generateFileName.js │ │ │ │ │ ├── getCmsPagesBaseQuery.js │ │ │ │ │ ├── getMulter.js │ │ │ │ │ ├── getWidgetsBaseQuery.js │ │ │ │ │ ├── imageProcessor.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── page/ │ │ │ │ │ │ ├── createPage.ts │ │ │ │ │ │ ├── deletePage.ts │ │ │ │ │ │ ├── pageDataSchema.json │ │ │ │ │ │ └── updatePage.ts │ │ │ │ │ ├── pageMetaInfo.ts │ │ │ │ │ ├── registerDefaultPageCollectionFilters.js │ │ │ │ │ ├── registerDefaultWidgetCollectionFilters.js │ │ │ │ │ ├── tailwind.admin.config.ts │ │ │ │ │ ├── tailwind.frontStore.config.ts │ │ │ │ │ ├── tests/ │ │ │ │ │ │ └── unit/ │ │ │ │ │ │ ├── imageProcessor.test.js │ │ │ │ │ │ ├── root/ │ │ │ │ │ │ │ ├── images/ │ │ │ │ │ │ │ │ ├── .gitkeep │ │ │ │ │ │ │ │ └── junk.txt │ │ │ │ │ │ │ └── media/ │ │ │ │ │ │ │ ├── cache/ │ │ │ │ │ │ │ │ ├── .gitkeep │ │ │ │ │ │ │ │ └── junk.txt │ │ │ │ │ │ │ └── images/ │ │ │ │ │ │ │ ├── .gitkeep │ │ │ │ │ │ │ └── junk.txt │ │ │ │ │ │ └── validatePath.test.js │ │ │ │ │ ├── uploadFile.ts │ │ │ │ │ ├── validatePath.js │ │ │ │ │ └── widget/ │ │ │ │ │ ├── createWidget.js │ │ │ │ │ ├── deleteWidget.js │ │ │ │ │ ├── loadWidgetInstances.js │ │ │ │ │ ├── updateWidget.js │ │ │ │ │ └── widgetDataSchema.json │ │ │ │ ├── cod/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ └── codCapturePayment/ │ │ │ │ │ │ ├── [bodyParser]capture.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ └── CODSetting/ │ │ │ │ │ │ ├── CODSetting.graphql │ │ │ │ │ │ └── CODSetting.resolvers.js │ │ │ │ │ └── pages/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ ├── orderEdit/ │ │ │ │ │ │ │ └── CaptureButton.jsx │ │ │ │ │ │ └── paymentSetting/ │ │ │ │ │ │ └── CODSetting.tsx │ │ │ │ │ └── frontStore/ │ │ │ │ │ └── checkout/ │ │ │ │ │ └── CashOnDelivery.tsx │ │ │ │ ├── customer/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── createCustomer/ │ │ │ │ │ │ │ ├── [bodyParser]createCustomer.ts │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createCustomerAddress/ │ │ │ │ │ │ │ ├── [bodyParser]createCustomerAddress.js │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteCustomer/ │ │ │ │ │ │ │ ├── deleteCustomer.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteCustomerAddress/ │ │ │ │ │ │ │ ├── deleteCustomerAddress.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── getCustomerToken/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── generateToken.ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── global/ │ │ │ │ │ │ │ ├── [context]getCurrentCustomer[auth].js │ │ │ │ │ │ │ └── [context]jwtCustomerAuth[getCurrentCustomer].ts │ │ │ │ │ │ ├── refreshCustomerToken/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── refreshToken.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── resetPassword/ │ │ │ │ │ │ │ ├── [bodyParser]resetPassword.ts │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── updateCustomer/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updateCustomer.js │ │ │ │ │ │ ├── updateCustomerAddress/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── updateCustomerAddress.js │ │ │ │ │ │ └── updatePassword/ │ │ │ │ │ │ ├── [bodyParser]updatePassword.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ ├── Customer/ │ │ │ │ │ │ │ ├── Customer.admin.graphql │ │ │ │ │ │ │ ├── Customer.admin.resolvers.js │ │ │ │ │ │ │ ├── Customer.graphql │ │ │ │ │ │ │ └── Customer.resolvers.ts │ │ │ │ │ │ └── CustomerGroup/ │ │ │ │ │ │ ├── CustomerGroup.admin.graphql │ │ │ │ │ │ ├── CustomerGroup.admin.resolvers.js │ │ │ │ │ │ ├── CustomerGroup.graphql │ │ │ │ │ │ └── CustomerGroup.resolvers.js │ │ │ │ │ ├── migration/ │ │ │ │ │ │ ├── Version-1.0.0.js │ │ │ │ │ │ ├── Version-1.0.1.js │ │ │ │ │ │ ├── Version-1.0.2.js │ │ │ │ │ │ └── Version-1.0.3.js │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ │ └── CustomerMenuGroup.jsx │ │ │ │ │ │ │ ├── customerEdit/ │ │ │ │ │ │ │ │ ├── CustomerEditForm.jsx │ │ │ │ │ │ │ │ ├── CustomerEditForm.scss │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ │ ├── customerEdit+customerNew/ │ │ │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ │ │ ├── OrderHistory.jsx │ │ │ │ │ │ │ │ └── PageHeading.tsx │ │ │ │ │ │ │ └── customerGrid/ │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── rows/ │ │ │ │ │ │ │ └── CustomerName.tsx │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ ├── account/ │ │ │ │ │ │ │ ├── MyAccount.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ ├── CustomerIcon.tsx │ │ │ │ │ │ │ └── [context]auth.js │ │ │ │ │ │ ├── customerLoginJson/ │ │ │ │ │ │ │ ├── [bodyParser]login.ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── customerLogoutJson/ │ │ │ │ │ │ │ ├── logout.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── login/ │ │ │ │ │ │ │ ├── LoginPage.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── register/ │ │ │ │ │ │ │ ├── RegisterPage.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── resetPasswordPage/ │ │ │ │ │ │ ├── ResetPasswordPage.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── services/ │ │ │ │ │ │ ├── CustomerCollection.js │ │ │ │ │ │ ├── CustomerGroupCollection.js │ │ │ │ │ │ ├── customer/ │ │ │ │ │ │ │ ├── address/ │ │ │ │ │ │ │ │ ├── addressValidators.ts │ │ │ │ │ │ │ │ ├── createCustomerAddress.ts │ │ │ │ │ │ │ │ ├── deleteCustomerAddress.ts │ │ │ │ │ │ │ │ └── updateCustomerAddress.ts │ │ │ │ │ │ │ ├── createCustomer.ts │ │ │ │ │ │ │ ├── customerDataSchema.json │ │ │ │ │ │ │ ├── deleteCustomer.ts │ │ │ │ │ │ │ ├── loginCustomerWithEmail.ts │ │ │ │ │ │ │ ├── logoutCustomer.js │ │ │ │ │ │ │ ├── updateCustomer.ts │ │ │ │ │ │ │ └── updatePassword.ts │ │ │ │ │ │ ├── getCustomerGroupsBaseQuery.js │ │ │ │ │ │ ├── getCustomersBaseQuery.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── registerDefaultCustomerCollectionFilters.js │ │ │ │ │ │ ├── registerDefaultCustomerGroupCollectionFilters.js │ │ │ │ │ │ └── sendResetPasswordEmail.ts │ │ │ │ │ └── subscribers/ │ │ │ │ │ └── customer_registered/ │ │ │ │ │ └── sendWelcomeEmail.ts │ │ │ │ ├── graphql/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── adminGraphql/ │ │ │ │ │ │ │ ├── [bodyParser]graphql.js │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── graphql/ │ │ │ │ │ │ ├── [auth]removeUser[graphql].ts │ │ │ │ │ │ ├── [bodyParser]graphql.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ └── Query/ │ │ │ │ │ │ ├── Query.graphql │ │ │ │ │ │ └── Query.resolvers.js │ │ │ │ │ ├── pages/ │ │ │ │ │ │ └── global/ │ │ │ │ │ │ ├── [bodyParser,notFound]buildQuery[graphql].js │ │ │ │ │ │ ├── [buildQuery]graphql[response].js │ │ │ │ │ │ └── bodyParser[buildQuery].ts │ │ │ │ │ └── services/ │ │ │ │ │ ├── buildResolvers.js │ │ │ │ │ ├── buildSchema.js │ │ │ │ │ ├── buildStoreFrontSchema.js │ │ │ │ │ ├── buildTypes.js │ │ │ │ │ ├── contextHelper.ts │ │ │ │ │ ├── graphqlErrorMessageFormat.js │ │ │ │ │ ├── graphqlMiddleware.js │ │ │ │ │ └── index.ts │ │ │ │ ├── oms/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── cancelOrder/ │ │ │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ │ │ ├── cancelOrder.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createShipment/ │ │ │ │ │ │ │ ├── [context]borderParser[auth].ts │ │ │ │ │ │ │ ├── createShipment.ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── lifetimesales/ │ │ │ │ │ │ │ ├── loadData.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── markDelivered/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── markDelivered.ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── salestatistic/ │ │ │ │ │ │ │ ├── loadData.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── updateShipment/ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateShipment.ts │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ ├── BestSeller/ │ │ │ │ │ │ │ ├── BestSeller.admin.graphql │ │ │ │ │ │ │ └── BestSeller.admin.resolvers.js │ │ │ │ │ │ ├── Carrier/ │ │ │ │ │ │ │ ├── Carrier.admin.graphql │ │ │ │ │ │ │ └── Carrier.admin.resolvers.js │ │ │ │ │ │ ├── Order/ │ │ │ │ │ │ │ ├── Order.admin.graphql │ │ │ │ │ │ │ ├── Order.admin.resolvers.js │ │ │ │ │ │ │ ├── Order.graphql │ │ │ │ │ │ │ └── Order.resolvers.js │ │ │ │ │ │ ├── PaymentTransaction/ │ │ │ │ │ │ │ ├── PaymentTransaction.admin.graphql │ │ │ │ │ │ │ └── PaymentTransaction.admin.resolvers.js │ │ │ │ │ │ └── Status/ │ │ │ │ │ │ ├── Status.graphql │ │ │ │ │ │ └── Status.resolvers.js │ │ │ │ │ ├── migration/ │ │ │ │ │ │ ├── Version-1.0.0.js │ │ │ │ │ │ ├── Version-1.0.1.js │ │ │ │ │ │ └── Version-1.0.2.ts │ │ │ │ │ ├── pages/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ └── OmsMenuGroup.jsx │ │ │ │ │ │ ├── dashboard/ │ │ │ │ │ │ │ ├── Bestcustomers.jsx │ │ │ │ │ │ │ ├── Bestsellers.scss │ │ │ │ │ │ │ ├── Bestsellers.tsx │ │ │ │ │ │ │ ├── Lifetimesales.jsx │ │ │ │ │ │ │ ├── Lifetimesales.scss │ │ │ │ │ │ │ ├── Statistic.jsx │ │ │ │ │ │ │ └── Statistic.scss │ │ │ │ │ │ ├── orderEdit/ │ │ │ │ │ │ │ ├── Activities.jsx │ │ │ │ │ │ │ ├── AddTrackingButton.tsx │ │ │ │ │ │ │ ├── CancelButton.tsx │ │ │ │ │ │ │ ├── Customer.tsx │ │ │ │ │ │ │ ├── CustomerNotes.tsx │ │ │ │ │ │ │ ├── Items.jsx │ │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ │ ├── Layout.scss │ │ │ │ │ │ │ ├── MarkDeliveredButton.tsx │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ ├── Payment.jsx │ │ │ │ │ │ │ ├── ShipButton.tsx │ │ │ │ │ │ │ ├── Status.jsx │ │ │ │ │ │ │ ├── TrackingButton.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── items/ │ │ │ │ │ │ │ │ ├── ItemVariantOptions.tsx │ │ │ │ │ │ │ │ ├── Name.tsx │ │ │ │ │ │ │ │ ├── Price.tsx │ │ │ │ │ │ │ │ └── Thumbnail.tsx │ │ │ │ │ │ │ ├── payment/ │ │ │ │ │ │ │ │ ├── Discount.tsx │ │ │ │ │ │ │ │ ├── Shipping.tsx │ │ │ │ │ │ │ │ ├── SubTotal.tsx │ │ │ │ │ │ │ │ ├── Tax.tsx │ │ │ │ │ │ │ │ └── Total.tsx │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── orderGrid/ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ ├── Heading.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── rows/ │ │ │ │ │ │ ├── OrderNumber.tsx │ │ │ │ │ │ ├── PaymentStatus.tsx │ │ │ │ │ │ └── ShipmentStatus.tsx │ │ │ │ │ ├── services/ │ │ │ │ │ │ ├── OrderCollection.js │ │ │ │ │ │ ├── addOrderActivityLog.ts │ │ │ │ │ │ ├── cancelOrder.ts │ │ │ │ │ │ ├── createShipment.ts │ │ │ │ │ │ ├── getOrdersBaseQuery.js │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── registerDefaultOrderCollectionFilters.js │ │ │ │ │ │ ├── updateOrderStatus.ts │ │ │ │ │ │ ├── updatePaymentStatus.ts │ │ │ │ │ │ └── updateShipmentStatus.ts │ │ │ │ │ └── subscribers/ │ │ │ │ │ └── order_placed/ │ │ │ │ │ └── sendOrderConfirmationEmail.ts │ │ │ │ ├── paypal/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── paypalAuthorizePayment/ │ │ │ │ │ │ │ ├── [bodyParser]authorize.ts │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── paypalCaptureAuthorizedPayment/ │ │ │ │ │ │ │ ├── [bodyParser]capture.ts │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── paypalCapturePayment/ │ │ │ │ │ │ │ ├── [bodyParser]capture.ts │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── paypalCreateOrder/ │ │ │ │ │ │ ├── [bodyParser]createOrder.ts │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ └── PaypalSetting/ │ │ │ │ │ │ ├── PaypalSetting.admin.graphql │ │ │ │ │ │ ├── PaypalSetting.admin.resolvers.js │ │ │ │ │ │ ├── PaypalSetting.graphql │ │ │ │ │ │ └── PaypalSetting.resolvers.js │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ │ ├── orderEdit/ │ │ │ │ │ │ │ │ └── PaypalCaptureButton.tsx │ │ │ │ │ │ │ └── paymentSetting/ │ │ │ │ │ │ │ └── PaypalSetting.tsx │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ ├── checkout/ │ │ │ │ │ │ │ └── Paypal.tsx │ │ │ │ │ │ ├── paypalCancel/ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── paypalReturn/ │ │ │ │ │ │ ├── Error.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── route.json │ │ │ │ │ └── services/ │ │ │ │ │ ├── getApiBaseUrl.js │ │ │ │ │ ├── requester.js │ │ │ │ │ └── voidPaymentTransaction.js │ │ │ │ ├── promotion/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── couponApply/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ │ ├── [validateCouponCode]applyCoupon.ts │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── validateCouponCode.js │ │ │ │ │ │ ├── couponRemove/ │ │ │ │ │ │ │ ├── removeCoupon.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createCoupon/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── createCoupon[finish].js │ │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── deleteCoupon/ │ │ │ │ │ │ │ ├── deleteCoupon.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── updateCoupon/ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateCoupon[finish].js │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ └── Coupon/ │ │ │ │ │ │ ├── Coupon.admin.graphql │ │ │ │ │ │ ├── Coupon.admin.resolvers.js │ │ │ │ │ │ ├── Coupon.graphql │ │ │ │ │ │ └── Coupon.resolvers.js │ │ │ │ │ ├── migration/ │ │ │ │ │ │ ├── Version-1.0.0.js │ │ │ │ │ │ └── Version-1.0.1.js │ │ │ │ │ ├── pages/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ ├── CouponMenuGroup.tsx │ │ │ │ │ │ │ └── NewCouponQuickLink.tsx │ │ │ │ │ │ ├── couponEdit/ │ │ │ │ │ │ │ ├── CouponEditForm.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── couponEdit+couponNew/ │ │ │ │ │ │ │ ├── CustomerCondition.tsx │ │ │ │ │ │ │ ├── DiscountType.tsx │ │ │ │ │ │ │ ├── General.scss │ │ │ │ │ │ │ ├── General.tsx │ │ │ │ │ │ │ ├── OrderCondition.tsx │ │ │ │ │ │ │ ├── PageHeading.tsx │ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ │ ├── AttributeGroupConditionValueSelector.tsx │ │ │ │ │ │ │ ├── BuyXGetY.tsx │ │ │ │ │ │ │ ├── CategoryConditionValueSelector.tsx │ │ │ │ │ │ │ ├── CollectionConditionValueSelector.tsx │ │ │ │ │ │ │ ├── PriceConditionValueSelector.tsx │ │ │ │ │ │ │ ├── RequireProducts.tsx │ │ │ │ │ │ │ ├── Setting.tsx │ │ │ │ │ │ │ ├── SkuConditionValueSelector.tsx │ │ │ │ │ │ │ ├── TargetProducts.tsx │ │ │ │ │ │ │ ├── ValueSelector.tsx │ │ │ │ │ │ │ └── conditionCriterias.ts │ │ │ │ │ │ ├── couponGrid/ │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.tsx │ │ │ │ │ │ │ ├── NewCouponButton.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── rows/ │ │ │ │ │ │ │ └── CouponName.tsx │ │ │ │ │ │ ├── couponNew/ │ │ │ │ │ │ │ ├── CouponNewForm.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── navigation/ │ │ │ │ │ │ ├── CouponNewMenuItem.tsx │ │ │ │ │ │ └── CouponsMenuItem.tsx │ │ │ │ │ └── services/ │ │ │ │ │ ├── CouponCollection.js │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ ├── couponDataSchema.json │ │ │ │ │ │ ├── createCoupon.js │ │ │ │ │ │ ├── deleteCoupon.js │ │ │ │ │ │ └── updateCoupon.js │ │ │ │ │ ├── couponValidator.js │ │ │ │ │ ├── discountCalculator.js │ │ │ │ │ ├── getCartTotalBeforeDiscount.js │ │ │ │ │ ├── getCouponsBaseQuery.js │ │ │ │ │ ├── registerCartItemPromotionFields.js │ │ │ │ │ ├── registerCartPromotionFields.js │ │ │ │ │ ├── registerDefaultCalculators.js │ │ │ │ │ ├── registerDefaultCouponCollectionFilters.js │ │ │ │ │ └── registerDefaultValidators.js │ │ │ │ ├── setting/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ └── saveSetting/ │ │ │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── saveSetting.js │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ ├── Setting/ │ │ │ │ │ │ │ ├── Setting.graphql │ │ │ │ │ │ │ └── Setting.resolvers.js │ │ │ │ │ │ ├── ShippingSetting/ │ │ │ │ │ │ │ ├── ShippingSetting.graphql │ │ │ │ │ │ │ └── ShippingSetting.resolvers.js │ │ │ │ │ │ └── StoreSetting/ │ │ │ │ │ │ ├── StoreSetting.graphql │ │ │ │ │ │ └── StoreSetting.resolvers.js │ │ │ │ │ ├── migration/ │ │ │ │ │ │ └── Version-1.0.0.js │ │ │ │ │ ├── pages/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ ├── all/ │ │ │ │ │ │ │ ├── PaymentSettingMenu.tsx │ │ │ │ │ │ │ ├── SettingMenuGroup.tsx │ │ │ │ │ │ │ └── StoreSettingMenu.tsx │ │ │ │ │ │ ├── paymentSetting/ │ │ │ │ │ │ │ ├── PaymentSetting.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── storeSetting/ │ │ │ │ │ │ ├── StoreSetting.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── route.json │ │ │ │ │ └── services/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── setting.ts │ │ │ │ ├── stripe/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── capturePaymentIntent/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── capturePaymentIntent.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── createPaymentIntent/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── createPaymentIntent.js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── refundPaymentIntent/ │ │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ │ ├── refundPaymentIntent.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── stripeWebHook/ │ │ │ │ │ │ ├── [bodyJson]webhook.js │ │ │ │ │ │ ├── bodyJson.js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ ├── graphql/ │ │ │ │ │ │ └── types/ │ │ │ │ │ │ └── StripeSetting/ │ │ │ │ │ │ ├── StripeSetting.admin.graphql │ │ │ │ │ │ ├── StripeSetting.admin.resolvers.js │ │ │ │ │ │ ├── StripeSetting.graphql │ │ │ │ │ │ └── StripeSetting.resolvers.js │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ │ ├── orderEdit/ │ │ │ │ │ │ │ │ ├── StripeCaptureButton.jsx │ │ │ │ │ │ │ │ └── StripeRefundButton.tsx │ │ │ │ │ │ │ └── paymentSetting/ │ │ │ │ │ │ │ └── StripePayment.tsx │ │ │ │ │ │ └── frontStore/ │ │ │ │ │ │ ├── checkout/ │ │ │ │ │ │ │ └── Stripe.tsx │ │ │ │ │ │ └── stripeReturn/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ └── services/ │ │ │ │ │ └── cancelPayment.js │ │ │ │ └── tax/ │ │ │ │ ├── api/ │ │ │ │ │ ├── createTaxClass/ │ │ │ │ │ │ ├── [context]borderParser[auth].ts │ │ │ │ │ │ ├── createTaxClass.ts │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── createTaxRate/ │ │ │ │ │ │ ├── [context]borderParser[auth].ts │ │ │ │ │ │ ├── createTaxRate.ts │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── deleteTaxRate/ │ │ │ │ │ │ ├── [context]borderParser[auth].ts │ │ │ │ │ │ ├── deleteTaxRate.ts │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── updateTaxClass/ │ │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateTaxClass.js │ │ │ │ │ └── updateTaxRate/ │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ ├── route.json │ │ │ │ │ └── updateTaxRate.js │ │ │ │ ├── bootstrap.js │ │ │ │ ├── graphql/ │ │ │ │ │ └── types/ │ │ │ │ │ ├── Product/ │ │ │ │ │ │ └── Price/ │ │ │ │ │ │ └── ProductPrice.resolvers.js │ │ │ │ │ ├── TaxClass/ │ │ │ │ │ │ ├── TaxClass.admin.graphql │ │ │ │ │ │ └── TaxClass.admin.resolvers.js │ │ │ │ │ └── TaxSetting/ │ │ │ │ │ ├── TaxSetting.admin.graphql │ │ │ │ │ ├── TaxSetting.admin.resolvers.js │ │ │ │ │ ├── TaxSetting.graphql │ │ │ │ │ └── TaxSetting.resolvers.js │ │ │ │ ├── migration/ │ │ │ │ │ └── Version-1.0.0.js │ │ │ │ ├── pages/ │ │ │ │ │ └── admin/ │ │ │ │ │ ├── all/ │ │ │ │ │ │ └── TaxSettingMenu.tsx │ │ │ │ │ └── taxSetting/ │ │ │ │ │ ├── TaxSetting.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── Rate.tsx │ │ │ │ │ │ ├── RateForm.tsx │ │ │ │ │ │ ├── Rates.tsx │ │ │ │ │ │ ├── TaxClass.tsx │ │ │ │ │ │ ├── TaxClassForm.tsx │ │ │ │ │ │ └── TaxClasses.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── route.json │ │ │ │ └── services/ │ │ │ │ ├── TaxClassCollection.js │ │ │ │ ├── calculateTaxAmount.js │ │ │ │ ├── getTaxPercent.js │ │ │ │ ├── getTaxRates.js │ │ │ │ ├── registerCartItemTaxPercentField.js │ │ │ │ └── registerDefaultTaxClassCollectionFilters.js │ │ │ └── types/ │ │ │ ├── apiResponse.ts │ │ │ ├── appContext.tsx │ │ │ ├── atLeastOne.ts │ │ │ ├── checkoutData.ts │ │ │ ├── componentLayout.ts │ │ │ ├── cronjob.ts │ │ │ ├── customerAddress.ts │ │ │ ├── db/ │ │ │ │ └── index.ts │ │ │ ├── event.ts │ │ │ ├── extension.ts │ │ │ ├── graphqlFilter.ts │ │ │ ├── middleware.ts │ │ │ ├── order.ts │ │ │ ├── pageMeta.ts │ │ │ ├── request.d.ts │ │ │ ├── request.ts │ │ │ ├── response.ts │ │ │ ├── route.ts │ │ │ └── widget.ts │ │ └── tsconfig.json │ └── postgres-query-builder/ │ ├── .swcrc │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── fieldResolve.js │ │ ├── index.ts │ │ ├── isValueASQL.js │ │ └── toString.js │ └── tsconfig.json ├── translations/ │ ├── de/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── es/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── fa/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── fr/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── gr/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── hu/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ └── general.csv │ ├── it/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── mn/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── nb/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── ne/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── nl/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── pt/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── rs/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── ru/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── ta/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ ├── vn/ │ │ ├── account.csv │ │ ├── catalog.csv │ │ ├── checkout.csv │ │ ├── general.csv │ │ └── paypal.csv │ └── zh/ │ ├── account.csv │ ├── catalog.csv │ ├── checkout.csv │ ├── general.csv │ └── paypal.csv └── tsconfig.json
Showing preview only (209K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2116 symbols across 699 files)
FILE: packages/create-evershop-app/createEverShopApp.js
function isUsingYarn (line 16) | function isUsingYarn() {
function init (line 22) | function init() {
function createApp (line 106) | function createApp(name, verbose, useYarn) {
function install (line 159) | function install(root, useYarn, dependencies, verbose, isOnline) {
function installDevDependencies (line 213) | function installDevDependencies(
function run (line 275) | function run(root, appName, verbose, originalDirectory, useYarn) {
function checkNpmVersion (line 352) | function checkNpmVersion() {
function checkAppName (line 367) | function checkAppName(appName) {
function isSafeToCreateProjectIn (line 420) | function isSafeToCreateProjectIn(root, name) {
function getProxy (line 491) | function getProxy() {
function checkThatNpmCanReadCwd (line 506) | function checkThatNpmCanReadCwd() {
function checkIfOnline (line 568) | function checkIfOnline(useYarn) {
function setUpEverShop (line 591) | async function setUpEverShop(projectDir) {
function createConfigFile (line 610) | async function createConfigFile(projectDir) {
function createSampleExtension (line 639) | async function createSampleExtension(projectDir) {
function createSampleTheme (line 649) | async function createSampleTheme(projectDir) {
function checkForLatestVersion (line 659) | function checkForLatestVersion() {
FILE: packages/create-evershop-app/sample/themes/sample/dist/pages/all/EveryWhere.js
function EveryWhere (line 9) | function EveryWhere() {
FILE: packages/create-evershop-app/sample/themes/sample/dist/pages/homepage/OnlyHomePage.js
function OnlyHomePage (line 9) | function OnlyHomePage() {
FILE: packages/create-evershop-app/sample/themes/sample/src/pages/all/EveryWhere.tsx
function EveryWhere (line 3) | function EveryWhere() {
FILE: packages/create-evershop-app/sample/themes/sample/src/pages/homepage/OnlyHomePage.tsx
function OnlyHomePage (line 3) | function OnlyHomePage() {
FILE: packages/evershop/scripts/postpublish.js
function getFileRecursive (line 4) | function getFileRecursive(dir, files) {
FILE: packages/evershop/src/bin/build/client/index.js
function buildClient (line 5) | async function buildClient(routes) {
FILE: packages/evershop/src/bin/build/complie.js
function compile (line 7) | async function compile(routes) {
FILE: packages/evershop/src/bin/build/index.js
function build (line 41) | async function build() {
FILE: packages/evershop/src/bin/dev/compileTs.js
function compileTs (line 5) | async function compileTs() {
FILE: packages/evershop/src/bin/dev/enableWatcher.js
function enableWatcher (line 5) | async function enableWatcher() {
FILE: packages/evershop/src/bin/dev/hooks.js
function initialize (line 7) | function initialize(data) {
function resolve (line 11) | function resolve(specifier, context, nextResolve) {
FILE: packages/evershop/src/bin/dev/index.ts
function startDev (line 6) | function startDev() {
FILE: packages/evershop/src/bin/dev/register.js
function has (line 15) | function has(pathName) {
FILE: packages/evershop/src/bin/extension/index.ts
function loadExtensions (line 13) | function loadExtensions(): Extension[] {
function getEnabledExtensions (line 82) | function getEnabledExtensions() {
FILE: packages/evershop/src/bin/install/createMigrationTable.js
function createMigrationTable (line 3) | async function createMigrationTable(connection) {
FILE: packages/evershop/src/bin/install/index.js
function install (line 24) | async function install() {
FILE: packages/evershop/src/bin/lib/addDefaultMiddlewareFuncs.ts
function addDefaultMiddlewareFuncs (line 21) | function addDefaultMiddlewareFuncs(app) {
FILE: packages/evershop/src/bin/lib/bootstrap/bootstrap.ts
type Module (line 5) | interface Module {
type BootstrapContext (line 9) | type BootstrapContext = {
type BootstrapModule (line 15) | type BootstrapModule = {
FILE: packages/evershop/src/bin/lib/bootstrap/migrate.js
function getCurrentInstalledVersion (line 16) | async function getCurrentInstalledVersion(module, connection = null) {
function migrateModule (line 29) | async function migrateModule(module, connection = null) {
function migrate (line 89) | async function migrate(modules, connection = null) {
FILE: packages/evershop/src/bin/lib/buildEntry.js
function buildEntry (line 17) | async function buildEntry(routes, clientOnly = false) {
FILE: packages/evershop/src/bin/lib/devEnvHelper.ts
type DevConfig (line 6) | type DevConfig = {
function getWebpackCompiler (line 24) | function getWebpackCompiler(isAdmin: boolean) {
function getDevMiddleware (line 32) | function getDevMiddleware(isAdmin: boolean) {
function getHotMiddleware (line 47) | function getHotMiddleware(isAdmin: boolean) {
FILE: packages/evershop/src/bin/lib/loadModules.js
function loadModule (line 81) | function loadModule(path) {
function getCoreModules (line 90) | function getCoreModules() {
FILE: packages/evershop/src/bin/lib/normalizePort.js
function normalizePort (line 4) | function normalizePort() {
FILE: packages/evershop/src/bin/lib/onError.js
function onError (line 8) | function onError(err) {
FILE: packages/evershop/src/bin/lib/onListening.js
function onListening (line 9) | function onListening() {
FILE: packages/evershop/src/bin/lib/prepare.js
function prepare (line 3) | function prepare(app, middlewares, routes) {
FILE: packages/evershop/src/bin/lib/startCronProcess.ts
function startCronProcess (line 9) | function startCronProcess(context) {
FILE: packages/evershop/src/bin/lib/startSubscriberProcess.ts
function startSubscriberProcess (line 9) | function startSubscriberProcess(context) {
FILE: packages/evershop/src/bin/lib/watch/compileSwc.ts
function compileSwc (line 8) | async function compileSwc(
FILE: packages/evershop/src/bin/lib/watch/effect.ts
type Effect (line 15) | type Effect =
function isValidRouteFolder (line 37) | function isValidRouteFolder(name: string): boolean {
function detectEffect (line 43) | function detectEffect(event: Event): Effect {
function applyEffects (line 198) | function applyEffects(events: Event[], app: Application) {
FILE: packages/evershop/src/bin/lib/watch/getDistPaths.ts
function getDistPaths (line 3) | function getDistPaths(): PathLike[] {
FILE: packages/evershop/src/bin/lib/watch/getRootPaths.ts
function getRootPaths (line 9) | function getRootPaths(entries: Event[]): Event[] {
FILE: packages/evershop/src/bin/lib/watch/getSrcPaths.ts
function getSrcPaths (line 7) | function getSrcPaths(): PathLike[] {
FILE: packages/evershop/src/bin/lib/watch/isDist.js
function isDist (line 4) | function isDist(pathName) {
FILE: packages/evershop/src/bin/lib/watch/isRestartRequired.ts
function isRestartRequired (line 6) | function isRestartRequired(event: Event) {
FILE: packages/evershop/src/bin/lib/watch/isSrc.js
function isSrc (line 4) | function isSrc(pathName) {
FILE: packages/evershop/src/bin/lib/watch/processors/addAdminRoute.ts
function addAdminRoute (line 7) | function addAdminRoute(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/processors/addApiRoute.ts
function addApiRoute (line 8) | function addApiRoute(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/processors/addComponent.ts
function addComponent (line 4) | function addComponent(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/processors/addFrontStoreRoute.ts
function addFrontStoreRoute (line 7) | function addFrontStoreRoute(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/processors/addMiddleware.ts
function addMiddleware (line 6) | function addMiddleware(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/processors/deleteARoute.ts
function deleteARoute (line 7) | function deleteARoute(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/processors/index.ts
type Processor (line 16) | type Processor = {
FILE: packages/evershop/src/bin/lib/watch/processors/removeMiddleware.ts
function removeMiddleware (line 6) | function removeMiddleware(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/processors/restart.ts
function restartProcess (line 1) | function restartProcess() {
FILE: packages/evershop/src/bin/lib/watch/processors/restartCronJob.ts
function restartCronJob (line 1) | function restartCronJob() {
FILE: packages/evershop/src/bin/lib/watch/processors/restartSubscriber.ts
function restartSubscriber (line 1) | function restartSubscriber() {
FILE: packages/evershop/src/bin/lib/watch/processors/touch.js
function justATouch (line 5) | function justATouch(path) {
function touchList (line 15) | async function touchList(paths) {
FILE: packages/evershop/src/bin/lib/watch/processors/updateAdminRoute.ts
function updateAdminRoute (line 8) | function updateAdminRoute(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/processors/updateApiRoute.ts
function updateApiRoute (line 8) | function updateApiRoute(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/processors/updateFrontStoreRoute.ts
function updateFrontStoreRoute (line 8) | function updateFrontStoreRoute(app: Application, event: Event) {
FILE: packages/evershop/src/bin/lib/watch/watchHandler.ts
type Event (line 11) | type Event = {
function watchHandler (line 18) | async function watchHandler(events: Event[], app: Application) {
FILE: packages/evershop/src/bin/seed/imageDownloader.ts
function downloadImage (line 11) | async function downloadImage(
function getFilenameFromUrl (line 73) | function getFilenameFromUrl(url: string): string {
function convertToMediaPath (line 100) | function convertToMediaPath(localPath: string): string {
FILE: packages/evershop/src/bin/seed/index.ts
type SeedOptions (line 75) | interface SeedOptions {
function seed (line 85) | async function seed() {
FILE: packages/evershop/src/bin/seed/seedAttributes.ts
function seedAttributeGroup (line 15) | async function seedAttributeGroup(): Promise<number> {
function seedAttributes (line 43) | async function seedAttributes(
FILE: packages/evershop/src/bin/seed/seedCategories.ts
function seedCategories (line 15) | async function seedCategories(): Promise<void> {
FILE: packages/evershop/src/bin/seed/seedCollections.ts
function seedCollections (line 15) | async function seedCollections(): Promise<void> {
FILE: packages/evershop/src/bin/seed/seedImages.ts
function seedProductImages (line 12) | async function seedProductImages(
FILE: packages/evershop/src/bin/seed/seedPages.ts
type PageData (line 12) | interface PageData {
function seedPages (line 25) | async function seedPages(): Promise<void> {
FILE: packages/evershop/src/bin/seed/seedProducts.ts
function seedProducts (line 20) | async function seedProducts(
FILE: packages/evershop/src/bin/seed/seedWidgets.ts
type WidgetData (line 17) | interface WidgetData {
type SlideData (line 27) | interface SlideData {
function downloadSlideshowImages (line 41) | async function downloadSlideshowImages(
function seedWidgets (line 104) | async function seedWidgets(): Promise<void> {
FILE: packages/evershop/src/bin/seed/variantGroupHelpers.ts
function createVariantGroups (line 9) | async function createVariantGroups(
function resolveAttributeOptions (line 60) | async function resolveAttributeOptions(
FILE: packages/evershop/src/bin/theme/active.ts
function selectTheme (line 13) | async function selectTheme() {
function updateConfig (line 38) | async function updateConfig(theme: string) {
function runBuild (line 78) | async function runBuild() {
function confirmBuild (line 95) | async function confirmBuild() {
function activateTheme (line 105) | async function activateTheme() {
FILE: packages/evershop/src/bin/theme/create.ts
function capitalize (line 10) | function capitalize(str) {
function isRealDirectory (line 15) | async function isRealDirectory(path) {
function createTheme (line 30) | async function createTheme() {
FILE: packages/evershop/src/bin/theme/twizz.ts
function parseRelativeImports (line 13) | function parseRelativeImports(content: string): string[] {
function resolveImportPath (line 31) | function resolveImportPath(
function findAllDependencies (line 66) | async function findAllDependencies(
function scanDirectory (line 154) | async function scanDirectory(dir: string): Promise<string[]> {
function scanModulesFrontStore (line 175) | async function scanModulesFrontStore(): Promise<string[]> {
function isRealDirectory (line 205) | async function isRealDirectory(path) {
function getOverrideCandidates (line 220) | async function getOverrideCandidates(): Promise<string[]> {
function getCurrentTheme (line 257) | function getCurrentTheme(): string {
function getDestinationPath (line 272) | function getDestinationPath(originalPath: string, theme: string): string {
function ensureDir (line 304) | async function ensureDir(dir: string): Promise<void> {
function createOverrideFile (line 312) | async function createOverrideFile() {
FILE: packages/evershop/src/bin/user/changePassword.js
function isValidPassword (line 8) | function isValidPassword(password) {
function updatePassword (line 41) | async function updatePassword() {
FILE: packages/evershop/src/bin/user/create.js
function isValidEmail (line 9) | function isValidEmail(email) {
function isValidPassword (line 13) | function isValidPassword(password) {
function createAdminUser (line 58) | async function createAdminUser() {
FILE: packages/evershop/src/components/admin/AttributeGroupSelector.tsx
type AttributeGroupIdentifier (line 23) | interface AttributeGroupIdentifier {
FILE: packages/evershop/src/components/admin/CategorySelector.tsx
type CategoryIdentifier (line 26) | interface CategoryIdentifier {
FILE: packages/evershop/src/components/admin/CategoryTree.tsx
type CategoryTreeItem (line 7) | interface CategoryTreeItem {
type CategoryItemProps (line 54) | interface CategoryItemProps {
function CategoryItem (line 60) | function CategoryItem({
type CategoryTreeProps (line 153) | interface CategoryTreeProps {
function CategoryTree (line 158) | function CategoryTree({ selectedCategories, onSelect }: CategoryTreeProp...
FILE: packages/evershop/src/components/admin/CollectionSelector.tsx
type CollectionIdentifier (line 23) | interface CollectionIdentifier {
FILE: packages/evershop/src/components/admin/FileBrowser.tsx
type File (line 17) | interface File {
FILE: packages/evershop/src/components/admin/ImageUploader.tsx
type Image (line 26) | interface Image {
type ImageUploaderProps (line 232) | interface ImageUploaderProps {
type ImagesProps (line 242) | interface ImagesProps extends ImageUploaderProps {
function ImageUploader (line 355) | function ImageUploader({
FILE: packages/evershop/src/components/admin/ImageUploaderSkeleton.tsx
type ImageUploaderSkeletonProps (line 3) | interface ImageUploaderSkeletonProps {
FILE: packages/evershop/src/components/admin/NavigationItem.tsx
type NavigationItemProps (line 4) | interface NavigationItemProps {
function NavigationItem (line 10) | function NavigationItem({ Icon, url, title }: NavigationItemProps) {
FILE: packages/evershop/src/components/admin/NavigationItemGroup.tsx
type NavigationItemGroupProps (line 9) | interface NavigationItemGroupProps {
function NavigationItemGroup (line 17) | function NavigationItemGroup({
FILE: packages/evershop/src/components/admin/PageHeading.tsx
function BackIcon (line 5) | function BackIcon({ backUrl }: { backUrl?: string }) {
function Heading (line 30) | function Heading({ heading }: { heading: string }) {
type PageHeadingProps (line 38) | interface PageHeadingProps {
function PageHeading (line 43) | function PageHeading({ backUrl, heading }: PageHeadingProps) {
FILE: packages/evershop/src/components/admin/ProductSelector.tsx
type ProductIdentifier (line 33) | type ProductIdentifier = {
FILE: packages/evershop/src/components/admin/SettingMenu.tsx
function SettingMenu (line 4) | function SettingMenu() {
FILE: packages/evershop/src/components/admin/Spinner.jsx
function Spinner (line 4) | function Spinner({ width, height }) {
FILE: packages/evershop/src/components/admin/Status.tsx
type StatusProps (line 5) | interface StatusProps {
function Status (line 8) | function Status({ status }: StatusProps) {
FILE: packages/evershop/src/components/admin/grid/GridPagination.tsx
type GridPaginationProps (line 23) | interface GridPaginationProps {
function GridPagination (line 29) | function GridPagination({ total, limit, page }: GridPaginationProps) {
FILE: packages/evershop/src/components/admin/grid/Thumbnail.tsx
type ThumbnailProps (line 5) | interface ThumbnailProps {
function Thumbnail (line 10) | function Thumbnail({ src, name }: ThumbnailProps) {
FILE: packages/evershop/src/components/admin/grid/header/Dummy.tsx
function DummyColumnHeader (line 4) | function DummyColumnHeader({ title }: { title: string }) {
FILE: packages/evershop/src/components/admin/grid/header/Sortable.tsx
function Up (line 4) | function Up() {
function Down (line 31) | function Down() {
function None (line 58) | function None() {
type SortableHeaderProps (line 85) | interface SortableHeaderProps {
function SortableHeader (line 91) | function SortableHeader({
FILE: packages/evershop/src/components/common/Area.tsx
type Component (line 6) | interface Component {
type AreaID (line 15) | type AreaID = string;
type ComponentID (line 16) | type ComponentID = string;
type Components (line 18) | interface Components {
type AreaProps (line 24) | interface AreaProps {
type Widget (line 35) | interface Widget extends Component {
constant DEBUG_KEY (line 41) | const DEBUG_KEY = 'evershop_area_debug';
function injectDebugStyles (line 46) | function injectDebugStyles() {
function injectToggleButton (line 59) | function injectToggleButton() {
function useDebugMode (line 108) | function useDebugMode(): boolean {
constant AREA_COLORS (line 135) | const AREA_COLORS = [
function areaColor (line 154) | function areaColor(id: string | undefined): string {
function Area (line 164) | function Area(props: AreaProps) {
FILE: packages/evershop/src/components/common/Editor.tsx
type EditorProps (line 149) | interface EditorProps {
function Editor (line 153) | function Editor({ rows }: EditorProps) {
FILE: packages/evershop/src/components/common/ExtendableTable.tsx
type TableColumn (line 13) | interface TableColumn<T = any> {
type TableContextValue (line 26) | interface TableContextValue<T = any> {
type TableProviderProps (line 37) | interface TableProviderProps<T = any> {
function useTableContext (line 48) | function useTableContext<T = any>(): TableContextValue<T> {
function TableProvider (line 56) | function TableProvider<T = any>({
type ExtendableTableProps (line 122) | interface ExtendableTableProps<T = any> {
function ExtendableTable (line 134) | function ExtendableTable<T = any>({
function TableContent (line 177) | function TableContent<T = any>({
FILE: packages/evershop/src/components/common/Image.tsx
type ImageProps (line 4) | type ImageProps = {
function Image (line 18) | function Image({
FILE: packages/evershop/src/components/common/Link.tsx
type CrossOrigin (line 7) | type CrossOrigin = 'anonymous' | 'use-credentials';
type FetchPriority (line 12) | type FetchPriority = 'high' | 'low' | 'auto';
type ReferrerPolicy (line 17) | type ReferrerPolicy =
type AsType (line 30) | type AsType =
type BlockingType (line 47) | type BlockingType = 'render';
type LinkProps (line 52) | interface LinkProps
function Link (line 146) | function Link(props: LinkProps): React.ReactElement {
function Stylesheet (line 199) | function Stylesheet({
function Favicon (line 231) | function Favicon({
function AppleTouchIcon (line 246) | function AppleTouchIcon({
function Preload (line 269) | function Preload({
function ModulePreload (line 310) | function ModulePreload({
function DNSPrefetch (line 339) | function DNSPrefetch({
function Preconnect (line 349) | function Preconnect({
FILE: packages/evershop/src/components/common/Meta.tsx
type BaseMetaProps (line 4) | interface BaseMetaProps {
type NameMetaProps (line 18) | interface NameMetaProps extends BaseMetaProps {
type PropertyMetaProps (line 35) | interface PropertyMetaProps extends BaseMetaProps {
type ItemPropMetaProps (line 41) | interface ItemPropMetaProps extends BaseMetaProps {
type HttpEquivMetaProps (line 50) | interface HttpEquivMetaProps extends BaseMetaProps {
type CharsetOnlyProps (line 63) | interface CharsetOnlyProps {
type MetaProps (line 75) | type MetaProps =
constant VALID_HTTP_EQUIV (line 82) | const VALID_HTTP_EQUIV = [
constant REQUIRED_CONTENT_ATTRIBUTES (line 90) | const REQUIRED_CONTENT_ATTRIBUTES = [
function validateMetaProps (line 97) | function validateMetaProps(props: any): { isValid: boolean; errors: stri...
function sanitizeMetaProps (line 166) | function sanitizeMetaProps(props: any): Record<string, string> {
function Meta (line 194) | function Meta(props: MetaProps) {
function MetaCharset (line 215) | function MetaCharset({ charset = 'utf-8' }: { charset?: string } = {}) {
function MetaDescription (line 219) | function MetaDescription({ description }: { description: string }) {
function MetaKeywords (line 223) | function MetaKeywords({ keywords }: { keywords: string | string[] }) {
function MetaAuthor (line 230) | function MetaAuthor({ author }: { author: string }) {
function MetaThemeColor (line 234) | function MetaThemeColor({
function MetaViewport (line 244) | function MetaViewport({
function MetaHttpEquiv (line 268) | function MetaHttpEquiv({
function MetaOpenGraph (line 283) | function MetaOpenGraph({
function MetaTwitterCard (line 310) | function MetaTwitterCard({
function MetaRobots (line 337) | function MetaRobots({
FILE: packages/evershop/src/components/common/Notification.tsx
function Notification (line 7) | function Notification() {
FILE: packages/evershop/src/components/common/RenderIfTrue.tsx
type RenderIfTrueProps (line 3) | interface RenderIfTrueProps {
function RenderIfTrue (line 8) | function RenderIfTrue({
FILE: packages/evershop/src/components/common/Script.tsx
type BaseScriptProps (line 4) | interface BaseScriptProps {
type ExternalScriptProps (line 35) | interface ExternalScriptProps extends BaseScriptProps {
type InlineScriptProps (line 40) | interface InlineScriptProps extends BaseScriptProps {
type ScriptProps (line 45) | type ScriptProps = ExternalScriptProps | InlineScriptProps;
constant VALID_REFERRER_POLICIES (line 47) | const VALID_REFERRER_POLICIES = [
constant VALID_CROSSORIGIN_VALUES (line 58) | const VALID_CROSSORIGIN_VALUES = ['anonymous', 'use-credentials'] as const;
function validateScriptProps (line 60) | function validateScriptProps(props: any): {
function sanitizeScriptProps (line 121) | function sanitizeScriptProps(props: any): Record<string, any> {
function Script (line 159) | function Script(props: ScriptProps) {
function ScriptExternal (line 184) | function ScriptExternal({
function ScriptModule (line 225) | function ScriptModule({
function ScriptInline (line 279) | function ScriptInline({
function ScriptJSON (line 295) | function ScriptJSON({
function ScriptImportMap (line 311) | function ScriptImportMap({
function ScriptNoModule (line 331) | function ScriptNoModule({
FILE: packages/evershop/src/components/common/SimplePagination.tsx
type SimplePaginationProps (line 4) | interface SimplePaginationProps {
function SimplePagination (line 11) | function SimplePagination({
FILE: packages/evershop/src/components/common/StaticImage.tsx
type StaticImageProps (line 5) | interface StaticImageProps extends Omit<ImageProps, 'src'> {
FILE: packages/evershop/src/components/common/Title.tsx
type TitleProps (line 7) | interface TitleProps
function Title (line 180) | function Title({
function ProductTitle (line 206) | function ProductTitle({
function CategoryTitle (line 240) | function CategoryTitle({
function ErrorTitle (line 271) | function ErrorTitle({
function SearchTitle (line 294) | function SearchTitle({
FILE: packages/evershop/src/components/common/context/app.tsx
type AppProviderProps (line 15) | interface AppProviderProps {
function AppProvider (line 20) | function AppProvider({ value, children }: AppProviderProps) {
FILE: packages/evershop/src/components/common/customer/address/AddressSummary.jsx
function AddressSummary (line 5) | function AddressSummary({ address }) {
FILE: packages/evershop/src/components/common/form/CheckboxField.tsx
type CheckboxOption (line 21) | interface CheckboxOption {
type CheckboxFieldProps (line 27) | interface CheckboxFieldProps<T extends FieldValues = FieldValues>
function CheckboxField (line 44) | function CheckboxField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/DateField.tsx
type DateFieldProps (line 18) | interface DateFieldProps<T extends FieldValues = FieldValues>
function DateField (line 29) | function DateField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/DateTimeLocalField.tsx
type DateTimeLocalFieldProps (line 18) | interface DateTimeLocalFieldProps<T extends FieldValues = FieldValues>
function DateTimeLocalField (line 29) | function DateTimeLocalField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/Editor.tsx
function loadEditorJS (line 28) | async function loadEditorJS(): Promise<any> {
function loadEditorJSImage (line 33) | async function loadEditorJSImage(): Promise<any> {
function loadEditorJSHeader (line 38) | async function loadEditorJSHeader(): Promise<any> {
function loadEditorJSList (line 43) | async function loadEditorJSList(): Promise<any> {
function loadEditorJSQuote (line 48) | async function loadEditorJSQuote(): Promise<any> {
type Row (line 124) | interface Row {
type EditorProps (line 134) | interface EditorProps {
FILE: packages/evershop/src/components/common/form/EmailField.tsx
type EmailFieldProps (line 19) | interface EmailFieldProps<T extends FieldValues = FieldValues>
function EmailField (line 32) | function EmailField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/FileField.tsx
type FileFieldProps (line 15) | interface FileFieldProps<T extends FieldValues = FieldValues>
function FileField (line 27) | function FileField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/Form.tsx
type FormProps (line 14) | interface FormProps<T extends FieldValues = FieldValues>
function Form (line 34) | function Form<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/InputField.tsx
type InputFieldProps (line 19) | interface InputFieldProps<T extends FieldValues = FieldValues>
function InputField (line 32) | function InputField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/NumberField.tsx
type NumberFieldProps (line 13) | interface NumberFieldProps {
function NumberField (line 36) | function NumberField({
FILE: packages/evershop/src/components/common/form/PasswordField.tsx
type PasswordFieldProps (line 20) | interface PasswordFieldProps<T extends FieldValues = FieldValues>
function PasswordField (line 35) | function PasswordField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/RadioGroupField.tsx
type RadioOption (line 24) | interface RadioOption {
type RadioGroupFieldProps (line 30) | interface RadioGroupFieldProps<T extends FieldValues = FieldValues>
function RadioGroupField (line 47) | function RadioGroupField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/RangeField.tsx
type RangeFieldProps (line 12) | interface RangeFieldProps<T extends FieldValues = FieldValues>
function RangeField (line 25) | function RangeField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/ReactSelectCreatableField.tsx
type SelectOption (line 14) | interface SelectOption {
type ReactSelectCreatableFieldProps (line 20) | interface ReactSelectCreatableFieldProps<T extends FieldValues = FieldVa...
function ReactSelectCreatableField (line 39) | function ReactSelectCreatableField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/ReactSelectField.tsx
type SelectOption (line 16) | interface SelectOption {
type ReactSelectFieldProps (line 22) | interface ReactSelectFieldProps<T extends FieldValues = FieldValues>
function ReactSelectField (line 36) | function ReactSelectField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/SelectField.tsx
type SelectOption (line 21) | interface SelectOption {
type SelectFieldProps (line 27) | interface SelectFieldProps<T extends FieldValues = FieldValues> {
function SelectField (line 44) | function SelectField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/TelField.tsx
type TelFieldProps (line 19) | interface TelFieldProps<T extends FieldValues = FieldValues>
function TelField (line 32) | function TelField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/TextareaField.tsx
type TextareaFieldProps (line 15) | interface TextareaFieldProps<T extends FieldValues = FieldValues>
function TextareaField (line 26) | function TextareaField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/TimeField.tsx
type TimeFieldProps (line 18) | interface TimeFieldProps<T extends FieldValues = FieldValues>
function TimeField (line 29) | function TimeField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/ToggleField.tsx
type ToggleFieldProps (line 15) | interface ToggleFieldProps<T extends FieldValues = FieldValues> {
function ToggleField (line 33) | function ToggleField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/Tooltip.tsx
type TooltipProps (line 3) | interface TooltipProps {
function Tooltip (line 9) | function Tooltip({
FILE: packages/evershop/src/components/common/form/UrlField.tsx
type UrlFieldProps (line 19) | interface UrlFieldProps<T extends FieldValues = FieldValues>
function UrlField (line 33) | function UrlField<T extends FieldValues = FieldValues>({
FILE: packages/evershop/src/components/common/form/editor/RawToolWrapper.ts
class RawToolWrapper (line 5) | class RawToolWrapper {
method constructor (line 11) | constructor({ data, config, api, block }: any) {
method initializeRawTool (line 20) | async initializeRawTool(params: any) {
method toolbox (line 25) | static get toolbox() {
method render (line 32) | render() {
method save (line 63) | save(blockContent: HTMLElement) {
method sanitize (line 70) | static get sanitize() {
method isReadOnlySupported (line 76) | static get isReadOnlySupported() {
FILE: packages/evershop/src/components/common/form/editor/RowTemplates.tsx
function RowTemplates (line 6) | function RowTemplates({ addRow }: { addRow: (row: any) => void }) {
FILE: packages/evershop/src/components/common/locale/CountryOption.jsx
function CountryOptions (line 5) | function CountryOptions(props) {
FILE: packages/evershop/src/components/common/locale/CurrencyOption.jsx
function CurrencyOptions (line 5) | function CurrencyOptions(props) {
FILE: packages/evershop/src/components/common/locale/LanguageOption.jsx
function LanguageOptions (line 5) | function LanguageOptions(props) {
FILE: packages/evershop/src/components/common/locale/ProvinceOption.jsx
function ProvinceOptions (line 5) | function ProvinceOptions(props) {
FILE: packages/evershop/src/components/common/locale/TimezoneOption.jsx
function TimezoneOptions (line 5) | function TimezoneOptions(props) {
FILE: packages/evershop/src/components/common/modal/Alert.jsx
function reducer (line 20) | function reducer(state, action) {
function Alert (line 48) | function Alert({ children }) {
FILE: packages/evershop/src/components/common/react/Head.jsx
function Head (line 5) | function Head() {
FILE: packages/evershop/src/components/common/react/client/Client.tsx
type Window (line 9) | interface Window {
type AppProps (line 20) | interface AppProps {
function App (line 24) | function App({ children }: AppProps) {
FILE: packages/evershop/src/components/common/react/client/HotReload.tsx
type HotReloadProps (line 6) | interface HotReloadProps {
function HotReload (line 12) | function HotReload({ hot }: HotReloadProps): React.ReactElement | null {
FILE: packages/evershop/src/components/common/react/client/Hydrate.tsx
type HydrateProps (line 7) | interface HydrateProps {
function Hydrate (line 11) | function Hydrate({ client }: HydrateProps): React.ReactElement {
FILE: packages/evershop/src/components/common/react/client/HydrateAdmin.tsx
function HydrateAdmin (line 9) | function HydrateAdmin() {
FILE: packages/evershop/src/components/common/react/client/HydrateFrontStore.tsx
function HydrateFrontStore (line 9) | function HydrateFrontStore() {
FILE: packages/evershop/src/components/common/react/getComponents.js
function getComponents (line 6) | function getComponents() {
FILE: packages/evershop/src/components/common/react/server/Server.tsx
type ServerHtmlProps (line 6) | interface ServerHtmlProps {
function ServerHtml (line 12) | function ServerHtml({ route, css, js, appContext }: ServerHtmlProps) {
FILE: packages/evershop/src/components/common/react/server/render.tsx
function renderHtml (line 6) | function renderHtml(route, js, css, contextData, langeCode) {
FILE: packages/evershop/src/components/common/ui/Accordion.tsx
function Accordion (line 6) | function Accordion({ className, ...props }: AccordionPrimitive.Root.Prop...
function AccordionItem (line 16) | function AccordionItem({ className, ...props }: AccordionPrimitive.Item....
function AccordionTrigger (line 26) | function AccordionTrigger({
function AccordionContent (line 55) | function AccordionContent({
FILE: packages/evershop/src/components/common/ui/Alert.tsx
function Alert (line 22) | function Alert({
function AlertTitle (line 37) | function AlertTitle({ className, ...props }: React.ComponentProps<'div'>) {
function AlertDescription (line 50) | function AlertDescription({
function AlertAction (line 66) | function AlertAction({ className, ...props }: React.ComponentProps<'div'...
FILE: packages/evershop/src/components/common/ui/AlertDialog.tsx
function AlertDialog (line 6) | function AlertDialog({ ...props }: AlertDialogPrimitive.Root.Props) {
function AlertDialogTrigger (line 10) | function AlertDialogTrigger({ ...props }: AlertDialogPrimitive.Trigger.P...
function AlertDialogPortal (line 16) | function AlertDialogPortal({ ...props }: AlertDialogPrimitive.Portal.Pro...
function AlertDialogOverlay (line 22) | function AlertDialogOverlay({
function AlertDialogContent (line 38) | function AlertDialogContent({
function AlertDialogHeader (line 61) | function AlertDialogHeader({
function AlertDialogFooter (line 77) | function AlertDialogFooter({
function AlertDialogMedia (line 93) | function AlertDialogMedia({
function AlertDialogTitle (line 109) | function AlertDialogTitle({
function AlertDialogDescription (line 125) | function AlertDialogDescription({
function AlertDialogAction (line 141) | function AlertDialogAction({
function AlertDialogCancel (line 154) | function AlertDialogCancel({
FILE: packages/evershop/src/components/common/ui/AspectRatio.tsx
function AspectRatio (line 4) | function AspectRatio({
FILE: packages/evershop/src/components/common/ui/Avatar.tsx
function Avatar (line 5) | function Avatar({
function AvatarImage (line 25) | function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Prop...
function AvatarFallback (line 38) | function AvatarFallback({
function AvatarBadge (line 54) | function AvatarBadge({ className, ...props }: React.ComponentProps<'span...
function AvatarGroup (line 70) | function AvatarGroup({ className, ...props }: React.ComponentProps<'div'...
function AvatarGroupCount (line 83) | function AvatarGroupCount({
FILE: packages/evershop/src/components/common/ui/Badge.tsx
function Badge (line 35) | function Badge({
FILE: packages/evershop/src/components/common/ui/Breadcrumb.tsx
function Breadcrumb (line 7) | function Breadcrumb({ className, ...props }: React.ComponentProps<'nav'>) {
function BreadcrumbList (line 18) | function BreadcrumbList({ className, ...props }: React.ComponentProps<'o...
function BreadcrumbItem (line 31) | function BreadcrumbItem({ className, ...props }: React.ComponentProps<'l...
function BreadcrumbLink (line 41) | function BreadcrumbLink({
function BreadcrumbPage (line 61) | function BreadcrumbPage({ className, ...props }: React.ComponentProps<'s...
function BreadcrumbSeparator (line 74) | function BreadcrumbSeparator({
function BreadcrumbEllipsis (line 92) | function BreadcrumbEllipsis({
FILE: packages/evershop/src/components/common/ui/Button.tsx
function Button (line 46) | function Button({
FILE: packages/evershop/src/components/common/ui/ButtonGroup.tsx
function ButtonGroup (line 25) | function ButtonGroup({
function ButtonGroupText (line 41) | function ButtonGroupText({
function ButtonGroupSeparator (line 64) | function ButtonGroupSeparator({
FILE: packages/evershop/src/components/common/ui/Card.tsx
function Card (line 4) | function Card({
function CardHeader (line 22) | function CardHeader({ className, ...props }: React.ComponentProps<'div'>) {
function CardTitle (line 35) | function CardTitle({ className, ...props }: React.ComponentProps<'div'>) {
function CardDescription (line 48) | function CardDescription({ className, ...props }: React.ComponentProps<'...
function CardAction (line 58) | function CardAction({ className, ...props }: React.ComponentProps<'div'>) {
function CardContent (line 71) | function CardContent({ className, ...props }: React.ComponentProps<'div'...
function CardFooter (line 81) | function CardFooter({ className, ...props }: React.ComponentProps<'div'>) {
FILE: packages/evershop/src/components/common/ui/Chart.tsx
constant THEMES (line 7) | const THEMES = { light: '', dark: '.dark' } as const;
type ChartConfig (line 9) | type ChartConfig = {
type ChartContextProps (line 19) | type ChartContextProps = {
function useChart (line 25) | function useChart() {
function ChartContainer (line 35) | function ChartContainer({
function ChartTooltipContent (line 105) | function ChartTooltipContent({
function ChartLegendContent (line 253) | function ChartLegendContent({
function getPayloadConfigFromPayload (line 309) | function getPayloadConfigFromPayload(
FILE: packages/evershop/src/components/common/ui/Checkbox.tsx
function Checkbox (line 6) | function Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {
FILE: packages/evershop/src/components/common/ui/Circle.tsx
type CircleVariant (line 62) | type CircleVariant =
type CircleProps (line 71) | interface CircleProps {
function Circle (line 76) | function Circle({ variant = 'default', className }: CircleProps) {
FILE: packages/evershop/src/components/common/ui/Collapsible.tsx
function Collapsible (line 4) | function Collapsible({ ...props }: CollapsiblePrimitive.Root.Props) {
function CollapsibleTrigger (line 8) | function CollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.P...
function CollapsibleContent (line 14) | function CollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Pro...
FILE: packages/evershop/src/components/common/ui/ContextMenu.tsx
function ContextMenu (line 6) | function ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props) {
function ContextMenuPortal (line 10) | function ContextMenuPortal({ ...props }: ContextMenuPrimitive.Portal.Pro...
function ContextMenuTrigger (line 16) | function ContextMenuTrigger({
function ContextMenuContent (line 29) | function ContextMenuContent({
function ContextMenuGroup (line 63) | function ContextMenuGroup({ ...props }: ContextMenuPrimitive.Group.Props) {
function ContextMenuLabel (line 69) | function ContextMenuLabel({
function ContextMenuItem (line 89) | function ContextMenuItem({
function ContextMenuSub (line 112) | function ContextMenuSub({ ...props }: ContextMenuPrimitive.SubmenuRoot.P...
function ContextMenuSubTrigger (line 118) | function ContextMenuSubTrigger({
function ContextMenuSubContent (line 142) | function ContextMenuSubContent({
function ContextMenuCheckboxItem (line 155) | function ContextMenuCheckboxItem({
function ContextMenuRadioGroup (line 181) | function ContextMenuRadioGroup({
function ContextMenuRadioItem (line 192) | function ContextMenuRadioItem({
function ContextMenuSeparator (line 216) | function ContextMenuSeparator({
function ContextMenuShortcut (line 229) | function ContextMenuShortcut({
FILE: packages/evershop/src/components/common/ui/Dialog.tsx
function Dialog (line 7) | function Dialog({ ...props }: DialogPrimitive.Root.Props) {
function DialogTrigger (line 11) | function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {
function DialogPortal (line 15) | function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {
function DialogClose (line 19) | function DialogClose({ ...props }: DialogPrimitive.Close.Props) {
function DialogOverlay (line 23) | function DialogOverlay({
function DialogContent (line 39) | function DialogContent({
function DialogHeader (line 79) | function DialogHeader({ className, ...props }: React.ComponentProps<'div...
function DialogFooter (line 89) | function DialogFooter({
function DialogTitle (line 116) | function DialogTitle({ className, ...props }: DialogPrimitive.Title.Prop...
function DialogDescription (line 126) | function DialogDescription({
FILE: packages/evershop/src/components/common/ui/DropdownMenu.tsx
function DropdownMenu (line 6) | function DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {
function DropdownMenuPortal (line 10) | function DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {
function DropdownMenuTrigger (line 14) | function DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {
function DropdownMenuContent (line 18) | function DropdownMenuContent({
function DropdownMenuGroup (line 52) | function DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) {
function DropdownMenuLabel (line 56) | function DropdownMenuLabel({
function DropdownMenuItem (line 76) | function DropdownMenuItem({
function DropdownMenuSub (line 99) | function DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {
function DropdownMenuSubTrigger (line 103) | function DropdownMenuSubTrigger({
function DropdownMenuSubContent (line 127) | function DropdownMenuSubContent({
function DropdownMenuCheckboxItem (line 151) | function DropdownMenuCheckboxItem({
function DropdownMenuRadioGroup (line 180) | function DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.P...
function DropdownMenuRadioItem (line 189) | function DropdownMenuRadioItem({
function DropdownMenuSeparator (line 216) | function DropdownMenuSeparator({
function DropdownMenuShortcut (line 229) | function DropdownMenuShortcut({
FILE: packages/evershop/src/components/common/ui/Empty.tsx
function Empty (line 6) | function Empty({ className, ...props }: React.ComponentProps<'div'>) {
function EmptyHeader (line 19) | function EmptyHeader({ className, ...props }: React.ComponentProps<'div'...
function EmptyMedia (line 44) | function EmptyMedia({
function EmptyTitle (line 59) | function EmptyTitle({ className, ...props }: React.ComponentProps<'div'>) {
function EmptyDescription (line 69) | function EmptyDescription({ className, ...props }: React.ComponentProps<...
function EmptyContent (line 82) | function EmptyContent({ className, ...props }: React.ComponentProps<'div...
FILE: packages/evershop/src/components/common/ui/Field.tsx
function FieldSet (line 8) | function FieldSet({ className, ...props }: React.ComponentProps<'fieldse...
function FieldLegend (line 21) | function FieldLegend({
function FieldGroup (line 39) | function FieldGroup({ className, ...props }: React.ComponentProps<'div'>) {
function Field (line 70) | function Field({
function FieldContent (line 86) | function FieldContent({ className, ...props }: React.ComponentProps<'div...
function FieldLabel (line 99) | function FieldLabel({
function FieldTitle (line 116) | function FieldTitle({ className, ...props }: React.ComponentProps<'div'>) {
function FieldDescription (line 129) | function FieldDescription({ className, ...props }: React.ComponentProps<...
function FieldSeparator (line 144) | function FieldSeparator({
function FieldError (line 174) | function FieldError({
FILE: packages/evershop/src/components/common/ui/HoverCard.tsx
function HoverCard (line 5) | function HoverCard({ ...props }: PreviewCardPrimitive.Root.Props) {
function HoverCardTrigger (line 9) | function HoverCardTrigger({ ...props }: PreviewCardPrimitive.Trigger.Pro...
function HoverCardContent (line 15) | function HoverCardContent({
FILE: packages/evershop/src/components/common/ui/Item.tsx
function ItemGroup (line 8) | function ItemGroup({ className, ...props }: React.ComponentProps<'div'>) {
function ItemSeparator (line 22) | function ItemSeparator({
function Item (line 58) | function Item({
function ItemMedia (line 99) | function ItemMedia({
function ItemContent (line 114) | function ItemContent({ className, ...props }: React.ComponentProps<'div'...
function ItemTitle (line 127) | function ItemTitle({ className, ...props }: React.ComponentProps<'div'>) {
function ItemDescription (line 140) | function ItemDescription({ className, ...props }: React.ComponentProps<'...
function ItemActions (line 153) | function ItemActions({ className, ...props }: React.ComponentProps<'div'...
function ItemHeader (line 163) | function ItemHeader({ className, ...props }: React.ComponentProps<'div'>) {
function ItemFooter (line 176) | function ItemFooter({ className, ...props }: React.ComponentProps<'div'>) {
FILE: packages/evershop/src/components/common/ui/Kbd.tsx
function Kbd (line 4) | function Kbd({ className, ...props }: React.ComponentProps<'kbd'>) {
function KbdGroup (line 17) | function KbdGroup({ className, ...props }: React.ComponentProps<'div'>) {
FILE: packages/evershop/src/components/common/ui/Label.tsx
function Label (line 5) | function Label({ className, ...props }: React.ComponentProps<'label'>) {
FILE: packages/evershop/src/components/common/ui/Menubar.tsx
function Menubar (line 22) | function Menubar({ className, ...props }: MenubarPrimitive.Props) {
function MenubarMenu (line 35) | function MenubarMenu({ ...props }: React.ComponentProps<typeof DropdownM...
function MenubarGroup (line 39) | function MenubarGroup({
function MenubarPortal (line 45) | function MenubarPortal({
function MenubarTrigger (line 51) | function MenubarTrigger({
function MenubarContent (line 67) | function MenubarContent({
function MenubarItem (line 89) | function MenubarItem({
function MenubarCheckboxItem (line 109) | function MenubarCheckboxItem({
function MenubarRadioGroup (line 135) | function MenubarRadioGroup({
function MenubarRadioItem (line 141) | function MenubarRadioItem({
function MenubarLabel (line 165) | function MenubarLabel({
function MenubarSeparator (line 183) | function MenubarSeparator({
function MenubarShortcut (line 196) | function MenubarShortcut({
function MenubarSub (line 212) | function MenubarSub({
function MenubarSubTrigger (line 218) | function MenubarSubTrigger({
function MenubarSubContent (line 238) | function MenubarSubContent({
FILE: packages/evershop/src/components/common/ui/NavigationMenu.tsx
function NavigationMenu (line 7) | function NavigationMenu({
function NavigationMenuList (line 27) | function NavigationMenuList({
function NavigationMenuItem (line 43) | function NavigationMenuItem({
function NavigationMenuTrigger (line 60) | function NavigationMenuTrigger({
function NavigationMenuContent (line 80) | function NavigationMenuContent({
function NavigationMenuPositioner (line 96) | function NavigationMenuPositioner({
function NavigationMenuLink (line 125) | function NavigationMenuLink({
function NavigationMenuIndicator (line 141) | function NavigationMenuIndicator({
FILE: packages/evershop/src/components/common/ui/Pagination.tsx
function Pagination (line 11) | function Pagination({ className, ...props }: React.ComponentProps<'nav'>) {
function PaginationContent (line 23) | function PaginationContent({
function PaginationItem (line 36) | function PaginationItem({ ...props }: React.ComponentProps<'li'>) {
type PaginationLinkProps (line 40) | type PaginationLinkProps = {
function PaginationLink (line 45) | function PaginationLink({
function PaginationPrevious (line 69) | function PaginationPrevious({
function PaginationNext (line 86) | function PaginationNext({
function PaginationEllipsis (line 103) | function PaginationEllipsis({
FILE: packages/evershop/src/components/common/ui/Popover.tsx
function Popover (line 5) | function Popover({ ...props }: PopoverPrimitive.Root.Props) {
function PopoverTrigger (line 9) | function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {
function PopoverContent (line 13) | function PopoverContent({
function PopoverHeader (line 47) | function PopoverHeader({ className, ...props }: React.ComponentProps<'di...
function PopoverTitle (line 57) | function PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Pr...
function PopoverDescription (line 67) | function PopoverDescription({
FILE: packages/evershop/src/components/common/ui/Progress.tsx
function Progress (line 5) | function Progress({
function ProgressTrack (line 26) | function ProgressTrack({ className, ...props }: ProgressPrimitive.Track....
function ProgressIndicator (line 39) | function ProgressIndicator({
function ProgressLabel (line 52) | function ProgressLabel({ className, ...props }: ProgressPrimitive.Label....
function ProgressValue (line 62) | function ProgressValue({ className, ...props }: ProgressPrimitive.Value....
FILE: packages/evershop/src/components/common/ui/RadioGroup.tsx
function RadioGroup (line 7) | function RadioGroup({ className, ...props }: RadioGroupPrimitive.Props) {
function RadioGroupItem (line 17) | function RadioGroupItem({ className, ...props }: RadioPrimitive.Root.Pro...
FILE: packages/evershop/src/components/common/ui/ScrollArea.tsx
function ScrollArea (line 5) | function ScrollArea({
function ScrollBar (line 28) | function ScrollBar({
FILE: packages/evershop/src/components/common/ui/Select.tsx
function SelectGroup (line 8) | function SelectGroup({ className, ...props }: SelectPrimitive.Group.Prop...
function SelectValue (line 18) | function SelectValue({ className, ...props }: SelectPrimitive.Value.Prop...
function SelectTrigger (line 28) | function SelectTrigger({
function SelectContent (line 56) | function SelectContent({
function SelectLabel (line 97) | function SelectLabel({
function SelectItem (line 110) | function SelectItem({
function SelectSeparator (line 138) | function SelectSeparator({
function SelectScrollUpButton (line 151) | function SelectScrollUpButton({
function SelectScrollDownButton (line 169) | function SelectScrollDownButton({
FILE: packages/evershop/src/components/common/ui/Separator.tsx
function Separator (line 5) | function Separator({
FILE: packages/evershop/src/components/common/ui/Sheet.tsx
function Sheet (line 7) | function Sheet({ ...props }: SheetPrimitive.Root.Props) {
function SheetTrigger (line 11) | function SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {
function SheetClose (line 15) | function SheetClose({ ...props }: SheetPrimitive.Close.Props) {
function SheetPortal (line 19) | function SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {
function SheetOverlay (line 23) | function SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.P...
function SheetContent (line 36) | function SheetContent({
function SheetHeader (line 79) | function SheetHeader({ className, ...props }: React.ComponentProps<'div'...
function SheetFooter (line 89) | function SheetFooter({ className, ...props }: React.ComponentProps<'div'...
function SheetTitle (line 99) | function SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {
function SheetDescription (line 109) | function SheetDescription({
FILE: packages/evershop/src/components/common/ui/Sidebar.tsx
constant SIDEBAR_COOKIE_NAME (line 25) | const SIDEBAR_COOKIE_NAME = 'sidebar_state';
constant SIDEBAR_COOKIE_MAX_AGE (line 26) | const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
constant SIDEBAR_WIDTH (line 27) | const SIDEBAR_WIDTH = '16rem';
constant SIDEBAR_WIDTH_MOBILE (line 28) | const SIDEBAR_WIDTH_MOBILE = '18rem';
constant SIDEBAR_WIDTH_ICON (line 29) | const SIDEBAR_WIDTH_ICON = '3rem';
constant SIDEBAR_KEYBOARD_SHORTCUT (line 30) | const SIDEBAR_KEYBOARD_SHORTCUT = 'b';
type SidebarContextProps (line 32) | type SidebarContextProps = {
function useSidebar (line 44) | function useSidebar() {
function SidebarProvider (line 53) | function SidebarProvider({
function Sidebar (line 149) | function Sidebar({
function SidebarTrigger (line 251) | function SidebarTrigger({
function SidebarRail (line 277) | function SidebarRail({ className, ...props }: React.ComponentProps<'butt...
function SidebarInset (line 302) | function SidebarInset({ className, ...props }: React.ComponentProps<'mai...
function SidebarInput (line 315) | function SidebarInput({
function SidebarHeader (line 329) | function SidebarHeader({ className, ...props }: React.ComponentProps<'di...
function SidebarFooter (line 340) | function SidebarFooter({ className, ...props }: React.ComponentProps<'di...
function SidebarSeparator (line 351) | function SidebarSeparator({
function SidebarContent (line 365) | function SidebarContent({ className, ...props }: React.ComponentProps<'d...
function SidebarGroup (line 379) | function SidebarGroup({ className, ...props }: React.ComponentProps<'div...
function SidebarGroupLabel (line 390) | function SidebarGroupLabel({
function SidebarGroupAction (line 414) | function SidebarGroupAction({
function SidebarGroupContent (line 438) | function SidebarGroupContent({
function SidebarMenu (line 452) | function SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {
function SidebarMenuItem (line 463) | function SidebarMenuItem({ className, ...props }: React.ComponentProps<'...
function SidebarMenuButton (line 496) | function SidebarMenuButton({
function SidebarMenuAction (line 550) | function SidebarMenuAction({
function SidebarMenuBadge (line 580) | function SidebarMenuBadge({
function SidebarMenuSkeleton (line 597) | function SidebarMenuSkeleton({
function SidebarMenuSub (line 635) | function SidebarMenuSub({ className, ...props }: React.ComponentProps<'u...
function SidebarMenuSubItem (line 649) | function SidebarMenuSubItem({
function SidebarMenuSubButton (line 663) | function SidebarMenuSubButton({
FILE: packages/evershop/src/components/common/ui/Skeleton.tsx
function Skeleton (line 4) | function Skeleton({ className, ...props }: React.ComponentProps<'div'>) {
FILE: packages/evershop/src/components/common/ui/Slider.tsx
function Slider (line 5) | function Slider({
FILE: packages/evershop/src/components/common/ui/Spinner.tsx
function Spinner (line 5) | function Spinner({ className, ...props }: React.ComponentProps<'svg'>) {
FILE: packages/evershop/src/components/common/ui/Switch.tsx
function Switch (line 5) | function Switch({
FILE: packages/evershop/src/components/common/ui/Table.tsx
function Table (line 4) | function Table({ className, ...props }: React.ComponentProps<'table'>) {
function TableHeader (line 16) | function TableHeader({ className, ...props }: React.ComponentProps<'thea...
function TableBody (line 26) | function TableBody({ className, ...props }: React.ComponentProps<'tbody'...
function TableFooter (line 36) | function TableFooter({ className, ...props }: React.ComponentProps<'tfoo...
function TableRow (line 49) | function TableRow({ className, ...props }: React.ComponentProps<'tr'>) {
function TableHead (line 62) | function TableHead({ className, ...props }: React.ComponentProps<'th'>) {
function TableCell (line 75) | function TableCell({ className, ...props }: React.ComponentProps<'td'>) {
function TableCaption (line 88) | function TableCaption({
FILE: packages/evershop/src/components/common/ui/Tabs.tsx
function Tabs (line 6) | function Tabs({
function TabsList (line 39) | function TabsList({
function TabsTrigger (line 54) | function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {
function TabsContent (line 70) | function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {
FILE: packages/evershop/src/components/common/ui/Toggle.tsx
function Toggle (line 27) | function Toggle({
FILE: packages/evershop/src/components/common/ui/ToggleGroup.tsx
function ToggleGroup (line 20) | function ToggleGroup({
function ToggleGroupItem (line 56) | function ToggleGroupItem({
FILE: packages/evershop/src/components/common/ui/Tooltip.tsx
function TooltipProvider (line 5) | function TooltipProvider({
function Tooltip (line 18) | function Tooltip({ ...props }: TooltipPrimitive.Root.Props) {
function TooltipTrigger (line 26) | function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {
function TooltipContent (line 30) | function TooltipContent({
FILE: packages/evershop/src/components/common/ui/hooks/useIsMobile.tsx
constant MOBILE_BREAKPOINT (line 3) | const MOBILE_BREAKPOINT = 768;
function useIsMobile (line 5) | function useIsMobile() {
FILE: packages/evershop/src/components/frontStore/Coupon.tsx
type CouponState (line 8) | interface CouponState {
type CouponActions (line 17) | interface CouponActions {
type CouponProps (line 23) | interface CouponProps {
FILE: packages/evershop/src/components/frontStore/CouponForm.tsx
function CouponForm (line 14) | function CouponForm() {
FILE: packages/evershop/src/components/frontStore/Footer.tsx
type FooterProps (line 4) | interface FooterProps {
function Footer (line 8) | function Footer({ copyRight }: FooterProps) {
FILE: packages/evershop/src/components/frontStore/Header.tsx
function Header (line 4) | function Header() {
FILE: packages/evershop/src/components/frontStore/Og.tsx
type OgProps (line 4) | interface OgProps {
function Og (line 69) | function Og({
FILE: packages/evershop/src/components/frontStore/Pagination.tsx
type PaginationProps (line 13) | interface PaginationProps {
type PaginationRenderProps (line 23) | interface PaginationRenderProps {
function Pagination (line 219) | function Pagination({
FILE: packages/evershop/src/components/frontStore/cart/AddToCart.tsx
type ProductInfo (line 8) | interface ProductInfo {
type AddToCartState (line 13) | interface AddToCartState {
type AddToCartActions (line 20) | interface AddToCartActions {
type AddToCartProps (line 25) | interface AddToCartProps {
FILE: packages/evershop/src/components/frontStore/cart/CartContext.tsx
type CartSyncTrigger (line 32) | enum CartSyncTrigger {
type CartItem (line 45) | interface CartItem {
type PaymentMethod (line 125) | interface PaymentMethod {
type ShippingMethod (line 131) | interface ShippingMethod {
type ShippingAddressParams (line 138) | interface ShippingAddressParams {
type CartError (line 144) | interface CartError {
type CartData (line 151) | interface CartData {
type CartState (line 259) | interface CartState {
type CartAction (line 283) | type CartAction =
type CartDispatch (line 301) | interface CartDispatch {
type CartProviderProps (line 405) | interface CartProviderProps {
FILE: packages/evershop/src/components/frontStore/cart/CartItems.tsx
type CartItemsProps (line 11) | interface CartItemsProps {
function CartItems (line 22) | function CartItems({ children }: CartItemsProps) {
FILE: packages/evershop/src/components/frontStore/cart/CartTotalSummary.tsx
type CartTotalSummaryProps (line 239) | interface CartTotalSummaryProps {
function CartTotalSummary (line 254) | function CartTotalSummary({ children }: CartTotalSummaryProps) {
FILE: packages/evershop/src/components/frontStore/cart/DefaultCartItemList.tsx
type CartItemsTableProps (line 13) | interface CartItemsTableProps {
FILE: packages/evershop/src/components/frontStore/cart/DefaultMiniCartItemList.tsx
type CartItemsTableProps (line 6) | interface CartItemsTableProps {
FILE: packages/evershop/src/components/frontStore/cart/DefaultMinicartDropdownSummary.tsx
function DefaultMiniCartDropdownSummary (line 6) | function DefaultMiniCartDropdownSummary({
FILE: packages/evershop/src/components/frontStore/cart/ItemQuantity.tsx
type UseItemQuantityProps (line 13) | interface UseItemQuantityProps {
type UseItemQuantityReturn (line 24) | interface UseItemQuantityReturn {
type ItemQuantityProps (line 165) | interface ItemQuantityProps extends UseItemQuantityProps {
function ItemQuantity (line 174) | function ItemQuantity({
FILE: packages/evershop/src/components/frontStore/cart/MiniCart.tsx
type MiniCartProps (line 11) | interface MiniCartProps {
function MiniCart (line 36) | function MiniCart({
FILE: packages/evershop/src/components/frontStore/cart/ShoppingCartEmpty.tsx
function ShoppingCartEmpty (line 5) | function ShoppingCartEmpty() {
FILE: packages/evershop/src/components/frontStore/catalog/CategoryContext.tsx
type CategoryProducts (line 10) | interface CategoryProducts {
type CategoryData (line 16) | interface CategoryData {
type CategoryProviderProps (line 41) | interface CategoryProviderProps {
FILE: packages/evershop/src/components/frontStore/catalog/CategoryInfo.tsx
function CategoryInfo (line 7) | function CategoryInfo() {
FILE: packages/evershop/src/components/frontStore/catalog/CategoryProducts.tsx
function CategoryProducts (line 7) | function CategoryProducts() {
FILE: packages/evershop/src/components/frontStore/catalog/CategoryProductsFilter.tsx
function CategoryProductsFilter (line 8) | function CategoryProductsFilter() {
FILE: packages/evershop/src/components/frontStore/catalog/CategoryProductsPagination.tsx
function CategoryProductsPagination (line 8) | function CategoryProductsPagination() {
FILE: packages/evershop/src/components/frontStore/catalog/Media.tsx
type SliderType (line 14) | type SliderType = any;
type ImageWithDimensionsProps (line 66) | interface ImageWithDimensionsProps {
type MediaProps (line 73) | interface MediaProps {
FILE: packages/evershop/src/components/frontStore/catalog/ProductContext.tsx
type ProductPrice (line 4) | interface ProductPrice {
type ProductPriceData (line 9) | interface ProductPriceData {
type AttributeOption (line 14) | interface AttributeOption {
type VariantAttribute (line 20) | interface VariantAttribute {
type ImageData (line 27) | interface ImageData {
type AttributeIndexItem (line 32) | interface AttributeIndexItem {
type VariantGroup (line 39) | interface VariantGroup {
type ProductData (line 57) | interface ProductData {
type ProductProviderProps (line 81) | interface ProductProviderProps {
FILE: packages/evershop/src/components/frontStore/catalog/ProductFilter.tsx
type FilterInput (line 5) | interface FilterInput {
type FilterableAttribute (line 11) | interface FilterableAttribute {
type PriceRange (line 21) | interface PriceRange {
type CategoryFilter (line 28) | interface CategoryFilter {
type FilterComponent (line 34) | interface FilterComponent {
type ProductFilterRenderProps (line 41) | interface ProductFilterRenderProps {
type ProductFilterProps (line 77) | interface ProductFilterProps {
FILE: packages/evershop/src/components/frontStore/catalog/ProductList.tsx
type ProductListProps (line 8) | interface ProductListProps {
FILE: packages/evershop/src/components/frontStore/catalog/ProductListLoadingSkeleton.tsx
type LoadingSkeletonProps (line 3) | interface LoadingSkeletonProps {
FILE: packages/evershop/src/components/frontStore/catalog/ProductSingleForm.tsx
function ProductSingleForm (line 17) | function ProductSingleForm() {
FILE: packages/evershop/src/components/frontStore/catalog/ProductSorting.tsx
type SortOption (line 17) | interface SortOption {
type SortState (line 24) | interface SortState {
type ProductSortingProps (line 29) | interface ProductSortingProps {
function ProductSorting (line 58) | function ProductSorting({
FILE: packages/evershop/src/components/frontStore/catalog/SearchBox.tsx
constant SEARCH_PRODUCTS_QUERY (line 13) | const SEARCH_PRODUCTS_QUERY = `
constant PRODUCT_FRAGMENT (line 23) | const PRODUCT_FRAGMENT = `
type SearchResult (line 49) | interface SearchResult {
type SearchBoxProps (line 59) | interface SearchBoxProps {
function SearchBox (line 84) | function SearchBox({
FILE: packages/evershop/src/components/frontStore/catalog/SearchContext.tsx
type SearchProducts (line 5) | interface SearchProducts {
type SearchPageData (line 11) | interface SearchPageData {
type SearchProviderProps (line 20) | interface SearchProviderProps {
FILE: packages/evershop/src/components/frontStore/catalog/SearchInfo.tsx
function SearchInfo (line 6) | function SearchInfo() {
FILE: packages/evershop/src/components/frontStore/catalog/SearchProducts.tsx
function SearchProducts (line 7) | function SearchProducts() {
FILE: packages/evershop/src/components/frontStore/catalog/SearchProductsPagination.tsx
function SearchProductsPagination (line 9) | function SearchProductsPagination() {
FILE: packages/evershop/src/components/frontStore/catalog/VariantSelector.tsx
type SelectedOption (line 16) | interface SelectedOption {
type ProcessedAttribute (line 21) | interface ProcessedAttribute extends VariantAttribute {
type VariantOptionItemProps (line 123) | interface VariantOptionItemProps {
type VariantAttributeGroupProps (line 130) | interface VariantAttributeGroupProps {
type VariantsProps (line 137) | interface VariantsProps {
function VariantSelector (line 142) | function VariantSelector({
FILE: packages/evershop/src/components/frontStore/checkout/CheckoutButton.tsx
function CheckoutButton (line 9) | function CheckoutButton() {
FILE: packages/evershop/src/components/frontStore/checkout/CheckoutContext.tsx
type PaymentMethod (line 19) | interface PaymentMethod {
type PaymentMethodRendererProps (line 25) | interface PaymentMethodRendererProps {
type PaymentMethodComponent (line 29) | interface PaymentMethodComponent {
type ShippingMethod (line 35) | interface ShippingMethod {
type ShippingAddressParams (line 45) | interface ShippingAddressParams {
type CheckoutState (line 51) | interface CheckoutState {
type CheckoutAction (line 62) | type CheckoutAction =
type CheckoutContextValue (line 118) | interface CheckoutContextValue extends CheckoutState {
type CheckoutDispatchContextValue (line 126) | interface CheckoutDispatchContextValue<
type CheckoutProviderProps (line 157) | interface CheckoutProviderProps {
function CheckoutProvider (line 184) | function CheckoutProvider({
FILE: packages/evershop/src/components/frontStore/checkout/ContactInformation.tsx
function ContactInformation (line 211) | function ContactInformation() {
FILE: packages/evershop/src/components/frontStore/checkout/Payment.tsx
function Payment (line 24) | function Payment() {
FILE: packages/evershop/src/components/frontStore/checkout/Shipment.tsx
function Shipment (line 24) | function Shipment() {
FILE: packages/evershop/src/components/frontStore/checkout/payment/BillingAddress.tsx
function BillingAddress (line 26) | function BillingAddress({
FILE: packages/evershop/src/components/frontStore/checkout/payment/PaymentMethods.tsx
type PaymentMethod (line 17) | interface PaymentMethod {
function PaymentMethodSkeleton (line 28) | function PaymentMethodSkeleton() {
function PaymentMethods (line 55) | function PaymentMethods({
FILE: packages/evershop/src/components/frontStore/checkout/shipment/ShippingMethods.tsx
type ShippingMethod (line 25) | interface ShippingMethod {
function ShippingMethodSkeleton (line 37) | function ShippingMethodSkeleton() {
function ShippingMethods (line 64) | function ShippingMethods({
FILE: packages/evershop/src/components/frontStore/customer/AccountInfo.tsx
type AccountInfoProps (line 11) | interface AccountInfoProps {
function AccountInfo (line 15) | function AccountInfo({ title, showLogout }: AccountInfoProps) {
FILE: packages/evershop/src/components/frontStore/customer/CustomerContext.tsx
type ExtendedCustomerAddress (line 15) | type ExtendedCustomerAddress = CustomerAddressGraphql & {
type OrderItem (line 22) | interface OrderItem {
type Order (line 98) | interface Order {
type Customer (line 194) | interface Customer {
type CustomerState (line 209) | interface CustomerState {
type CustomerAction (line 214) | type CustomerAction =
type CustomerContextValue (line 245) | interface CustomerContextValue extends CustomerState {}
type CustomerDispatchContextValue (line 247) | interface CustomerDispatchContextValue {
type CustomerProviderProps (line 285) | interface CustomerProviderProps {
function CustomerProvider (line 309) | function CustomerProvider({
FILE: packages/evershop/src/components/frontStore/customer/MyAddresses.tsx
function MyAddresses (line 98) | function MyAddresses({ title }: { title?: string }) {
FILE: packages/evershop/src/components/frontStore/customer/OrderHistory.tsx
function OrderHistory (line 66) | function OrderHistory({ title }: { title?: string }) {
FILE: packages/evershop/src/components/frontStore/customer/address/addressForm/AddressForm.tsx
type CustomerAddressFormProps (line 11) | interface CustomerAddressFormProps {
function CustomerAddressForm (line 24) | function CustomerAddressForm({
FILE: packages/evershop/src/components/frontStore/customer/address/addressForm/AddressFormLoadingSkeleton.tsx
function AddressFormLoadingSkeleton (line 4) | function AddressFormLoadingSkeleton() {
FILE: packages/evershop/src/components/frontStore/customer/address/addressForm/Index.tsx
type IndexProps (line 20) | interface IndexProps {
function Index (line 26) | function Index({
FILE: packages/evershop/src/components/frontStore/customer/address/addressForm/NameAndTelephone.tsx
type NameAndTelephoneProps (line 6) | interface NameAndTelephoneProps {
function NameAndTelephone (line 11) | function NameAndTelephone({
FILE: packages/evershop/src/components/frontStore/customer/address/addressForm/ProvinceAndPostcode.tsx
type ProvinceAndPostcodeProps (line 6) | interface ProvinceAndPostcodeProps {
function ProvinceAndPostcode (line 17) | function ProvinceAndPostcode({
FILE: packages/evershop/src/lib/componee/getComponentsByRoute.ts
function getComponentsByRoute (line 9) | function getComponentsByRoute(route) {
type AllRouteComponentsMap (line 33) | interface AllRouteComponentsMap {
function getAllRouteComponents (line 41) | function getAllRouteComponents(isAdmin = false): AllRouteComponentsMap {
FILE: packages/evershop/src/lib/componee/scanForComponents.ts
type ComponentsMap (line 5) | interface ComponentsMap {
function scanForComponents (line 9) | function scanForComponents(path: string): string[] {
function scanRouteComponents (line 20) | function scanRouteComponents(
FILE: packages/evershop/src/lib/componee/scanForRootComponents.ts
function scanForRootComponents (line 14) | async function scanForRootComponents(callback): Promise<string[]> {
FILE: packages/evershop/src/lib/cronjob/cronjob.ts
function start (line 11) | async function start() {
FILE: packages/evershop/src/lib/cronjob/jobManager.ts
function isValidJsFilePath (line 15) | function isValidJsFilePath(filePath: string | undefined): boolean {
class JobManager (line 34) | class JobManager {
method _ensureMutable (line 56) | private _ensureMutable(): void {
method registerJob (line 73) | public registerJob(job: Job): boolean {
method removeJob (line 111) | public removeJob(jobName: string): boolean {
method updateJobSchedule (line 130) | public updateJobSchedule(jobName: string, newSchedule: string): boolean {
method getJob (line 153) | public getJob(jobName: string): Job | undefined {
method getAllJobs (line 170) | public getAllJobs(): Job[] {
method hasJob (line 184) | public hasJob(jobName: string): boolean {
function getAllJobs (line 196) | function getAllJobs(): Job[] {
function getEnabledJobs (line 207) | function getEnabledJobs(): Job[] {
function registerJob (line 219) | function registerJob(job: Job): boolean {
function updateJobSchedule (line 232) | function updateJobSchedule(
function removeJob (line 245) | function removeJob(jobName: string): boolean {
function getJob (line 253) | function getJob(jobName: string): Job | undefined {
function hasJob (line 262) | function hasJob(jobName: string): boolean {
FILE: packages/evershop/src/lib/event/callSubscibers.js
function callSubscribers (line 3) | async function callSubscribers(subscribers, eventData) {
FILE: packages/evershop/src/lib/event/emitter.ts
function emit (line 26) | async function emit(name: string, data: Record<string, any>) {
FILE: packages/evershop/src/lib/event/event-manager.js
function loadEvents (line 59) | async function loadEvents(count) {
function syncEvents (line 87) | async function syncEvents() {
function executeSubscribers (line 99) | async function executeSubscribers(event) {
FILE: packages/evershop/src/lib/event/loadSubscribers.js
function loadModuleSubscribers (line 6) | async function loadModuleSubscribers(modulePath) {
function loadSubscribers (line 45) | async function loadSubscribers(modules) {
FILE: packages/evershop/src/lib/event/subscriber.ts
type EventSubscriber (line 19) | type EventSubscriber<T extends EventName> = (
function createSubscriber (line 37) | function createSubscriber<T extends EventName>(
FILE: packages/evershop/src/lib/helpers.ts
constant CONSTANTS (line 13) | const CONSTANTS = Object.freeze({
FILE: packages/evershop/src/lib/locale/countries.ts
type Country (line 1) | interface Country {
FILE: packages/evershop/src/lib/locale/currencies.ts
type Currency (line 1) | interface Currency {
FILE: packages/evershop/src/lib/locale/provinces.ts
type Province (line 1) | interface Province {
FILE: packages/evershop/src/lib/locale/timezones.ts
type Timezone (line 1) | interface Timezone {
FILE: packages/evershop/src/lib/locale/translate/_.ts
function _ (line 1) | function _(text: string, values?: Record<string, string>): string {
FILE: packages/evershop/src/lib/locale/translate/translate.ts
function translate (line 8) | function translate(enText: string, values: Record<string, string> = {}) {
function loadCsv (line 22) | async function loadCsv(): Promise<Record<string, string>> {
FILE: packages/evershop/src/lib/log/CustomColorize.js
class CustomColorize (line 7) | class CustomColorize extends colorize.Colorizer {
method constructor (line 8) | constructor(opts = {}) {
method transform (line 12) | transform(info, opts) {
FILE: packages/evershop/src/lib/log/logger.js
function createLogger (line 7) | function createLogger() {
function debug (line 14) | function debug(message) {
function error (line 19) | function error(e) {
function warning (line 24) | function warning(message) {
function info (line 29) | function info(message) {
function success (line 34) | function success(message) {
FILE: packages/evershop/src/lib/mail/emailHelper.ts
type SendEmailArguments (line 44) | type SendEmailArguments = {
function validateSendEmailArguments (line 59) | function validateSendEmailArguments(
type EmailService (line 115) | interface EmailService {
function isValidEmailService (line 124) | function isValidEmailService(service: unknown): service is EmailService {
function getEmailService (line 137) | function getEmailService(): EmailService | undefined {
function registerEmailService (line 151) | function registerEmailService(service: EmailService): void {
function sendEmail (line 168) | async function sendEmail(
type EmailData (line 193) | interface EmailData {
function buildEmailBodyFromTemplate (line 222) | async function buildEmailBodyFromTemplate(
function prepareData (line 239) | async function prepareData(data: EmailData): Promise<EmailData> {
FILE: packages/evershop/src/lib/middleware/Handler.js
class Handler (line 12) | class Handler {
method constructor (line 13) | constructor(routeId) {
method addMiddleware (line 17) | static addMiddleware(middleware) {
method getMiddlewares (line 21) | static getMiddlewares() {
method getMiddleware (line 25) | static getMiddleware(id) {
method getMiddlewareByRoute (line 29) | static getMiddlewareByRoute(route) {
method getAppLevelMiddlewares (line 69) | static getAppLevelMiddlewares(region) {
method removeMiddleware (line 75) | static removeMiddleware(path) {
method removeMiddlewares (line 79) | static removeMiddlewares(basePath) {
method addMiddlewareFromPath (line 91) | static addMiddlewareFromPath(path) {
method middleware (line 106) | static middleware() {
FILE: packages/evershop/src/lib/middleware/addMiddleware.js
function addMiddleware (line 4) | function addMiddleware(middleware) {
FILE: packages/evershop/src/lib/middleware/buildMiddlewareFunction.js
function buildMiddlewareFunction (line 22) | function buildMiddlewareFunction(id, path) {
FILE: packages/evershop/src/lib/middleware/delegate.ts
function createWriteOnceMap (line 3) | function createWriteOnceMap<K, V>() {
function getDelegateManager (line 50) | function getDelegateManager(request: EvershopRequest) {
function hasDelegate (line 61) | function hasDelegate(id: string, request: EvershopRequest): boolean {
function getDelegate (line 72) | function getDelegate<T>(
function getDelegates (line 79) | function getDelegates(request: EvershopRequest): Record<string, any> {
function setDelegate (line 89) | function setDelegate<T>(
FILE: packages/evershop/src/lib/middleware/eNext.js
function noop (line 3) | function noop() {}
function eNext (line 5) | function eNext(request, response, next) {
FILE: packages/evershop/src/lib/middleware/findDublicatedMiddleware.js
function findDublicatedMiddleware (line 1) | function findDublicatedMiddleware(registeredMiddlewares, newMiddleware) {
FILE: packages/evershop/src/lib/middleware/getRouteFromPath.js
function getRouteFromPath (line 3) | function getRouteFromPath(path) {
FILE: packages/evershop/src/lib/middleware/index.js
function getAdminMiddlewares (line 10) | function getAdminMiddlewares(routeId) {
function getFrontMiddlewares (line 19) | function getFrontMiddlewares(routeId) {
function getModuleMiddlewares (line 36) | function getModuleMiddlewares(path) {
function getAllSortedMiddlewares (line 97) | function getAllSortedMiddlewares() {
FILE: packages/evershop/src/lib/middleware/isNextRequired.js
function isNextRequired (line 3) | function isNextRequired(path) {
FILE: packages/evershop/src/lib/middleware/noDuplicateId.js
function noDublicateId (line 11) | function noDublicateId(registeredMiddlewares, newMiddleware) {
FILE: packages/evershop/src/lib/middleware/parseFromFile.js
function parseFromFile (line 5) | function parseFromFile(path) {
FILE: packages/evershop/src/lib/middleware/scanForMiddlewareFunctions.js
function scanForMiddlewareFunctions (line 13) | function scanForMiddlewareFunctions(path) {
FILE: packages/evershop/src/lib/middleware/sort.js
function sortMiddlewares (line 10) | function sortMiddlewares(middlewares = []) {
FILE: packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/collection.js
function collection (line 4) | function collection(request, response, next) {
FILE: packages/evershop/src/lib/middleware/tests/unit/404page.handling.test.js
method validateStatus (line 27) | validateStatus(status) {
method validateStatus (line 39) | validateStatus(status) {
FILE: packages/evershop/src/lib/middleware/tests/unit/500error.handling.test.js
method validateStatus (line 22) | validateStatus(status) {
FILE: packages/evershop/src/lib/middleware/tests/unit/apiHandler.middleware.test.js
method validateStatus (line 22) | validateStatus(status) {
FILE: packages/evershop/src/lib/middleware/tests/unit/delegate.test.js
method validateStatus (line 57) | validateStatus(status) {
FILE: packages/evershop/src/lib/middleware/tests/unit/handlers.middleware.test.js
method validateStatus (line 27) | validateStatus(status) {
method validateStatus (line 40) | validateStatus(status) {
FILE: packages/evershop/src/lib/middleware/tests/unit/middleware.buildMiddlewareFunction.test.js
method nullOrAny (line 6) | nullOrAny(received, expected) {
FILE: packages/evershop/src/lib/middlewares/publicStatic.ts
function publicStatic (line 8) | async function publicStatic(
FILE: packages/evershop/src/lib/middlewares/static.ts
constant ALLOWED_EXTENSIONS (line 10) | const ALLOWED_EXTENSIONS = [
FILE: packages/evershop/src/lib/middlewares/themePublicStatic.ts
function themePublicStatic (line 8) | async function themePublicStatic(
FILE: packages/evershop/src/lib/pathToRegexp.js
function parse (line 3) | function parse(e, t) {
function compile (line 41) | function compile(e, t) {
function encodeURIComponentPretty (line 44) | function encodeURIComponentPretty(e) {
function encodeAsterisk (line 50) | function encodeAsterisk(e) {
function tokensToFunction (line 56) | function tokensToFunction(e) {
function escapeString (line 112) | function escapeString(e) {
function escapeGroup (line 115) | function escapeGroup(e) {
function attachKeys (line 118) | function attachKeys(e, t) {
function flags (line 121) | function flags(e) {
function regexpToRegexp (line 124) | function regexpToRegexp(e, t) {
function arrayToRegexp (line 142) | function arrayToRegexp(e, t, r) {
function stringToRegexp (line 147) | function stringToRegexp(e, t, r) {
function tokensToRegExp (line 150) | function tokensToRegExp(e, t, r) {
function pathToRegexp (line 176) | function pathToRegexp(e, t, r) {
FILE: packages/evershop/src/lib/postgres/connection.ts
function getConnection (line 65) | async function getConnection(): Promise<PoolClient> {
FILE: packages/evershop/src/lib/response/render.ts
function normalizeAssets (line 18) | function normalizeAssets(assets) {
function buildContextData (line 26) | function buildContextData(
function renderDevelopment (line 59) | function renderDevelopment(
function renderProduction (line 102) | function renderProduction(request, response) {
function render (line 153) | function render(request, response) {
FILE: packages/evershop/src/lib/router/Router.js
class Router (line 3) | class Router {
method constructor (line 4) | constructor() {
method getFrontStoreRoutes (line 8) | getFrontStoreRoutes() {
method getAdminRoutes (line 12) | getAdminRoutes() {
method getRoutes (line 16) | getRoutes() {
method addRoute (line 20) | addRoute(route) {
method hasRoute (line 29) | hasRoute(id) {
method deleteRoute (line 33) | deleteRoute(id) {
method empty (line 37) | empty() {
FILE: packages/evershop/src/lib/router/registerAdminRoute.js
function registerAdminRoute (line 11) | function registerAdminRoute(
FILE: packages/evershop/src/lib/router/registerFrontStoreRoute.js
function registerFrontStoreRoute (line 11) | function registerFrontStoreRoute(
FILE: packages/evershop/src/lib/router/scanForRoutes.js
function startWith (line 5) | function startWith(str, prefix) {
function validateRoute (line 9) | function validateRoute(methods, path, routePath) {
function parseRoute (line 35) | function parseRoute(jsonPath, isAdmin = false, isApi = false) {
function scanForRoutes (line 74) | function scanForRoutes(path, isAdmin, isApi) {
FILE: packages/evershop/src/lib/router/sortRoutes.js
function sortRoutes (line 1) | function sortRoutes(routes) {
function calculateRouteSpecificity (line 10) | function calculateRouteSpecificity(path) {
FILE: packages/evershop/src/lib/util/assign.js
function assign (line 8) | function assign(object, data) {
FILE: packages/evershop/src/lib/util/buildFilterFromUrl.ts
type FilterInput (line 1) | interface FilterInput {
FILE: packages/evershop/src/lib/util/cn.ts
function cn (line 4) | function cn(...inputs: ClassValue[]) {
FILE: packages/evershop/src/lib/util/events.ts
constant FORM_VALIDATED (line 1) | const FORM_VALIDATED = 'FORM_VALIDATED';
constant FORM_SUBMIT (line 2) | const FORM_SUBMIT = 'FORM_SUBMIT';
constant FORM_FIELD_UPDATED (line 3) | const FORM_FIELD_UPDATED = 'FORM_FIELD_UPDATED';
FILE: packages/evershop/src/lib/util/filterOperationMap.ts
type SQLFilterOperation (line 1) | enum SQLFilterOperation {
constant OPERATION_MAP (line 14) | const OPERATION_MAP: Record<string, SQLFilterOperation> = {
FILE: packages/evershop/src/lib/util/formToJson.js
function update (line 1) | function update(data, keys, value) {
function serializeForm (line 34) | function serializeForm(formDataEntries, dataFilter) {
FILE: packages/evershop/src/lib/util/get.ts
function get (line 10) | function get<T = any, D = any>(
FILE: packages/evershop/src/lib/util/getBaseUrl.ts
function getBaseUrl (line 4) | function getBaseUrl(): string {
FILE: packages/evershop/src/lib/util/getConfig.ts
type ConfigStructure (line 3) | type ConfigStructure = {
type PathValue (line 143) | type PathValue<T, P extends string> = P extends keyof T
type ConfigPath (line 151) | type ConfigPath =
function getConfig (line 180) | function getConfig<P extends ConfigPath>(
FILE: packages/evershop/src/lib/util/getEnabledTheme.ts
type Theme (line 9) | type Theme = {
function getEnabledTheme (line 15) | function getEnabledTheme(): Theme | null {
FILE: packages/evershop/src/lib/util/getEnv.ts
function getEnv (line 8) | function getEnv(name: string, defaultValue?: string): string {
FILE: packages/evershop/src/lib/util/hookable.ts
type Hook (line 1) | type Hook = {
type HookPosition (line 6) | enum HookPosition {
type HookStorage (line 11) | type HookStorage = Map<string, Hook[]>;
function isAsyncFunction (line 17) | function isAsyncFunction(func: Function): boolean {
function hook (line 21) | function hook(
function hookAfter (line 51) | function hookAfter<
function hookBefore (line 67) | function hookBefore<TContext = any, TArgs extends any[] = any[]>(
function hookable (line 75) | function hookable<T extends Function>(
function getHooks (line 122) | function getHooks(): {
function clearHooks (line 132) | function clearHooks(): void {
function lockHooks (line 137) | function lockHooks(): void {
FILE: packages/evershop/src/lib/util/httpStatus.ts
constant INVALID_PAYLOAD (line 2) | const INVALID_PAYLOAD = 400;
constant INTERNAL_SERVER_ERROR (line 3) | const INTERNAL_SERVER_ERROR = 500;
constant NOT_FOUND (line 4) | const NOT_FOUND = 404;
constant UNAUTHORIZED (line 5) | const UNAUTHORIZED = 401;
constant FORBIDDEN (line 6) | const FORBIDDEN = 403;
constant CONFLICT (line 7) | const CONFLICT = 409;
constant UNPROCESSABLE_ENTITY (line 8) | const UNPROCESSABLE_ENTITY = 422;
constant TOO_MANY_REQUESTS (line 9) | const TOO_MANY_REQUESTS = 429;
constant GATEWAY_TIMEOUT (line 10) | const GATEWAY_TIMEOUT = 504;
FILE: packages/evershop/src/lib/util/isAjax.ts
function isAjax (line 3) | function isAjax(request: EvershopRequest) {
FILE: packages/evershop/src/lib/util/isPlainObject.ts
function isPlainObject (line 6) | function isPlainObject(obj: unknown): boolean {
FILE: packages/evershop/src/lib/util/isResolvable.ts
type AliasConfig (line 4) | type AliasConfig = Record<string, string[]>;
function isResolvable (line 13) | function isResolvable(
FILE: packages/evershop/src/lib/util/jsonParse.ts
function jsonParse (line 10) | function jsonParse<T>(path: PathLike): T {
FILE: packages/evershop/src/lib/util/jwt.ts
constant TOKEN_TYPES (line 4) | const TOKEN_TYPES = {
type TokenType (line 9) | type TokenType = (typeof TOKEN_TYPES)[keyof typeof TOKEN_TYPES];
function getJwtConfig (line 15) | function getJwtConfig() {
type DecodedAccessToken (line 33) | interface DecodedAccessToken extends UserPayload, CustomerPayload {
type DecodedRefreshToken (line 42) | interface DecodedRefreshToken extends UserPayload, CustomerPayload {
type UserPayload (line 51) | interface UserPayload {
type CustomerPayload (line 55) | interface CustomerPayload {
function generateToken (line 62) | function generateToken(
function verifyToken (line 98) | function verifyToken(token: string, tokenType: TokenType) {
function generateRefreshToken (line 136) | function generateRefreshToken(
function verifyRefreshToken (line 171) | function verifyRefreshToken(token: string, tokenType: TokenType) {
function decodeToken (line 210) | function decodeToken(
FILE: packages/evershop/src/lib/util/keyGenerator.ts
function simpleHash (line 2) | function simpleHash(str: string): string {
function generateComponentKey (line 16) | function generateComponentKey(text: string): string {
FILE: packages/evershop/src/lib/util/merge.js
function merge (line 12) | function merge(target, source, maxDepth = 20, currentDepth = 0) {
FILE: packages/evershop/src/lib/util/passwordHelper.ts
function hashPassword (line 5) | function hashPassword(password: string): string {
function comparePassword (line 11) | function comparePassword(password: string, hash: string): boolean {
function verifyPassword (line 15) | function verifyPassword(password: string): boolean {
function addPasswordValidationRule (line 37) | function addPasswordValidationRule(rule: Validator<string>): void {
FILE: packages/evershop/src/lib/util/preloadScan.ts
type PreloadImage (line 1) | interface PreloadImage {
function extractPreloadImages (line 8) | function extractPreloadImages(html: string): PreloadImage[] {
function generatePreloadLinks (line 45) | function generatePreloadLinks(images: PreloadImage[]): string {
function injectPreloadLinks (line 72) | function injectPreloadLinks(html: string): string {
function injectPreloadLinksAfterCharset (line 88) | function injectPreloadLinksAfterCharset(html: string): string {
function cleanupPreloadAttributes (line 107) | function cleanupPreloadAttributes(html: string): string {
function processPreloadImages (line 111) | function processPreloadImages(html: string): string {
FILE: packages/evershop/src/lib/util/readCsvFile.ts
function readCsvFile (line 4) | async function readCsvFile<T>(
FILE: packages/evershop/src/lib/util/registry.ts
type RegistryValue (line 5) | type RegistryValue<T> = {
type SyncProcessor (line 15) | type SyncProcessor<T> = (value: T) => T;
type AsyncProcessor (line 16) | type AsyncProcessor<T> = (value: T) => Promise<T>;
class Registry (line 18) | class Registry {
method get (line 21) | async get<T>(
method getSync (line 75) | getSync<T>(
method addProcessor (line 145) | addProcessor<T>(
method addFinalProcessor (line 187) | addFinalProcessor<T>(
method getProcessors (line 201) | getProcessors(name: string): {
function getValue (line 222) | async function getValue<T>(
function getValueSync (line 258) | function getValueSync<T>(
function addProcessor (line 283) | function addProcessor<T>(
function addFinalProcessor (line 291) | function addFinalProcessor(
function getProcessors (line 298) | function getProcessors<T>(name: string): {
function lockRegistry (line 305) | function lockRegistry(): void {
FILE: packages/evershop/src/lib/util/sanitizeHtml.ts
type Row (line 19) | interface Row {
function sanitizeRawHtml (line 34) | function sanitizeRawHtml(editorJSData: Row[]) {
FILE: packages/evershop/src/lib/util/validateConfiguration.js
function validateConfiguration (line 4) | function validateConfiguration(config) {
function errorFormatter (line 61) | function errorFormatter(errors) {
FILE: packages/evershop/src/lib/util/validator.ts
type Validator (line 1) | type Validator<T> = {
class ValidatorManager (line 7) | class ValidatorManager<T> {
method constructor (line 10) | constructor(initial: Validator<T>[] = []) {
method add (line 16) | add(validator: Validator<T>) {
method validate (line 20) | async validate(input: T) {
method validateSync (line 44) | validateSync(input: T) {
method getAllIds (line 67) | getAllIds() {
method getValidator (line 71) | getValidator(id: string) {
method remove (line 75) | remove(id: string) {
method clear (line 79) | clear() {
FILE: packages/evershop/src/lib/webpack/createBaseConfig.js
function isRealDirectorySync (line 16) | function isRealDirectorySync(path) {
function createBaseConfig (line 31) | function createBaseConfig(isServer) {
FILE: packages/evershop/src/lib/webpack/dev/createConfigClient.js
function createConfigClient (line 12) | function createConfigClient(isAdmin = false) {
FILE: packages/evershop/src/lib/webpack/getRouteBuildPath.js
function getRouteBuildPath (line 5) | function getRouteBuildPath(route) {
FILE: packages/evershop/src/lib/webpack/getRouteBuildSubPath.js
function getRouteBuildSubPath (line 1) | function getRouteBuildSubPath(route) {
FILE: packages/evershop/src/lib/webpack/loaders/AreaLoader.js
function buildComponentsPerRoute (line 11) | function buildComponentsPerRoute(components, imports) {
function AreaLoader (line 84) | function AreaLoader(c) {
FILE: packages/evershop/src/lib/webpack/loaders/GraphQLAPILoader.js
function GraphqlAPILoader (line 1) | function GraphqlAPILoader(source) {
FILE: packages/evershop/src/lib/webpack/loaders/GraphqlLoader.js
function GraphqlLoader (line 1) | function GraphqlLoader(content) {
FILE: packages/evershop/src/lib/webpack/loaders/LayoutLoader.js
function LayoutLoader (line 1) | function LayoutLoader(content) {
FILE: packages/evershop/src/lib/webpack/loaders/StyleLoader.js
function StyleLoader (line 1) | function StyleLoader() {
FILE: packages/evershop/src/lib/webpack/loaders/TailwindLoader.js
function TailwindLoader (line 11) | async function TailwindLoader(c) {
FILE: packages/evershop/src/lib/webpack/loaders/TranslationLoader.js
function TranslationLoader (line 1) | async function TranslationLoader(c) {
FILE: packages/evershop/src/lib/webpack/loaders/loadTranslationFromCsv.ts
function loadCsvTranslationFiles (line 8) | async function loadCsvTranslationFiles(): Promise<
FILE: packages/evershop/src/lib/webpack/plugins/FileListPlugin.js
method apply (line 4) | apply(compiler) {
FILE: packages/evershop/src/lib/webpack/plugins/GraphqlPlugin.js
method constructor (line 8) | constructor(isAdmin = false) {
method apply (line 15) | apply(compiler) {
FILE: packages/evershop/src/lib/webpack/plugins/InjectTailwindSources.ts
method Once (line 6) | Once(root) {
FILE: packages/evershop/src/lib/webpack/plugins/Tailwindcss.ts
type WebpackCompiler (line 10) | type WebpackCompiler = webpack.Compiler;
type WebpackCompilation (line 11) | type WebpackCompilation = webpack.Compilation;
type WebpackAssets (line 12) | type WebpackAssets = webpack.Compilation['assets'];
class Tailwindcss (line 14) | class Tailwindcss {
method constructor (line 17) | constructor(route: Route) {
method apply (line 21) | apply(compiler: WebpackCompiler): void {
method processRouteAssetsAfterEmit (line 35) | async processRouteAssetsAfterEmit(
method getRouteCSSAssets (line 58) | getRouteCSSAssets(assets: WebpackAssets, route: Route): string[] {
method processCSSWithTailwindFromDisk (line 72) | async processCSSWithTailwindFromDisk(
FILE: packages/evershop/src/lib/webpack/plugins/ThemeWatcherPlugin.ts
type AsyncWebpackSubscription (line 10) | interface AsyncWebpackSubscription {
type Module (line 15) | interface Module {
class ThemeWatcherPlugin (line 23) | class ThemeWatcherPlugin implements WebpackPluginInstance {
method constructor (line 26) | constructor() {
method apply (line 30) | apply(compiler: Compiler): void {
method initializeGlobalWatcher (line 137) | private initializeGlobalWatcher(): void {
method cleanupGlobalWatcher (line 176) | private cleanupGlobalWatcher(): void {
FILE: packages/evershop/src/lib/webpack/prod/createConfigClient.js
function createConfigClient (line 14) | function createConfigClient(routes) {
FILE: packages/evershop/src/lib/webpack/prod/createConfigServer.js
function createConfigServer (line 8) | function createConfigServer(routes) {
FILE: packages/evershop/src/lib/webpack/resolveAlias.js
function getAllFilesInFolder (line 4) | function getAllFilesInFolder(folderPath) {
function resolveAlias (line 46) | function resolveAlias(extensions = [], themePath = null) {
FILE: packages/evershop/src/lib/webpack/util/getTailwindConfig.js
function getTailwindConfig (line 9) | async function getTailwindConfig(isAdmin = false) {
FILE: packages/evershop/src/lib/webpack/util/getTailwindSources.ts
function getTailwindSources (line 6) | function getTailwindSources(): string[] {
FILE: packages/evershop/src/lib/webpack/util/parseGraphql.js
function parseGraphql (line 8) | function parseGraphql(modules) {
FILE: packages/evershop/src/lib/webpack/util/parseGraphqlByFile.js
function parseGraphqlByFile (line 8) | function parseGraphqlByFile(module) {
FILE: packages/evershop/src/lib/widget/widgetManager.ts
function isValidJsFilePath (line 15) | function isValidJsFilePath(filePath: string | undefined): boolean {
function isComponentNameUppercase (line 41) | function isComponentNameUppercase(filePath: string | undefined): boolean {
function isValidType (line 58) | function isValidType(type: string | undefined): boolean {
class WidgetManager (line 66) | class WidgetManager {
method _ensureMutable (line 88) | private _ensureMutable(): void {
method registerWidget (line 108) | public registerWidget(widget: Widget): boolean {
method updateWidget (line 165) | public updateWidget(widgetType: string, updates: Partial<Widget>): boo...
method removeWidget (line 238) | public removeWidget(widgetType: string): boolean {
method getWidget (line 258) | public getWidget(widgetType: string): Widget | undefined {
method getAllWidgets (line 275) | public getAllWidgets(): Widget[] {
method hasWidget (line 290) | public hasWidget(widgetType: string): boolean {
function getAllWidgets (line 304) | function getAllWidgets(): Widget[] {
function getEnabledWidgets (line 321) | function getEnabledWidgets(): Widget[] {
function registerWidget (line 341) | function registerWidget(widget: Widget): boolean {
function updateWidget (line 352) | function updateWidget(
function removeWidget (line 365) | function removeWidget(widgetName: string): boolean {
function getWidget (line 373) | function getWidget(widgetType: string): Widget | undefined {
function hasWidget (line 382) | function hasWidget(widgetType: string): boolean {
FILE: packages/evershop/src/modules/auth/pages/admin/adminLogin/LoginForm.tsx
type LoginFormProps (line 10) | interface LoginFormProps {
function LoginForm (line 28) | function LoginForm({ authUrl, dashboardUrl }: LoginFormProps) {
FILE: packages/evershop/src/modules/auth/pages/admin/all/AdminUser.jsx
function AdminUser (line 14) | function AdminUser({ adminUser, logoutUrl, loginPage }) {
FILE: packages/evershop/src/modules/auth/services/loginUserWithEmail.ts
function loginUserWithEmail (line 10) | async function loginUserWithEmail(
FILE: packages/evershop/src/modules/auth/services/logoutUser.ts
function logoutUser (line 4) | function logoutUser() {
FILE: packages/evershop/src/modules/base/api/global/[auth]payloadValidate.ts
method compile (line 14) | compile(sch, parentSchema) {
FILE: packages/evershop/src/modules/base/pages/admin/all/FormCss.tsx
function FormCss (line 3) | function FormCss() {
FILE: packages/evershop/src/modules/base/pages/admin/all/GlobalCss.tsx
function GlobalCss (line 4) | function GlobalCss() {
FILE: packages/evershop/src/modules/base/pages/admin/all/Layout.tsx
function AdminLayout (line 4) | function AdminLayout() {
FILE: packages/evershop/src/modules/base/pages/admin/all/Meta.tsx
type SeoMetaProps (line 5) | interface SeoMetaProps {
function SeoMeta (line 12) | function SeoMeta({
FILE: packages/evershop/src/modules/base/pages/admin/all/TailwindCss.tsx
function TailwindCss (line 4) | function TailwindCss() {
FILE: packages/evershop/src/modules/base/pages/frontStore/all/Base.tsx
type BaseProps (line 15) | interface BaseProps {
function Base (line 26) | function Base({
FILE: packages/evershop/src/modules/base/pages/frontStore/all/Breadcrumb.tsx
type BreadcrumbProps (line 11) | interface BreadcrumbProps {
function Breadcrumb (line 20) | function Breadcrumb({ pageInfo: { breadcrumbs } }: BreadcrumbProps) {
FILE: packages/evershop/src/modules/base/pages/frontStore/all/GlobalCss.tsx
function GlobalCss (line 4) | function GlobalCss() {
FILE: packages/evershop/src/modules/base/pages/frontStore/all/HeadTags.tsx
type HeadTagsProps (line 8) | interface HeadTagsProps {
function HeadTags (line 41) | function HeadTags({
FILE: packages/evershop/src/modules/base/pages/frontStore/all/Logo.tsx
type LogoProps (line 3) | interface LogoProps {
function Logo (line 13) | function Logo({
FILE: packages/evershop/src/modules/base/pages/frontStore/all/Notification.tsx
function Notification (line 7) | function Notification() {
FILE: packages/evershop/src/modules/base/pages/frontStore/all/TailwindCss.tsx
function TailwindCss (line 4) | function TailwindCss() {
FILE: packages/evershop/src/modules/base/services/escapePayload.ts
function escapeHtmlTags (line 3) | function escapeHtmlTags(str) {
function escapePayload (line 14) | function escapePayload(obj) {
FILE: packages/evershop/src/modules/base/services/getAjv.js
function getAjv (line 5) | function getAjv() {
FILE: packages/evershop/src/modules/base/services/markSkipEscape.ts
function markSkipEscape (line 8) | function markSkipEscape(obj, path) {
FILE: packages/evershop/src/modules/base/services/notifications.js
function addNotificationMessage (line 4) | function addNotificationMessage(request, message, type = 'info') {
FILE: packages/evershop/src/modules/catalog/components/CollectionProducts.tsx
type CollectionProductsProps (line 6) | interface CollectionProductsProps {
function CollectionProducts (line 19) | function CollectionProducts({
FILE: packages/evershop/src/modules/catalog/components/CollectionProductsSetting.tsx
type CollectionProductsSettingProps (line 29) | interface CollectionProductsSettingProps {
function CollectionProductsSetting (line 36) | function CollectionProductsSetting({
FILE: packages/evershop/src/modules/catalog/pages/admin/all/CatalogMenuGroup.jsx
function CatalogMenuGroup (line 6) | function CatalogMenuGroup({
FILE: packages/evershop/src/modules/catalog/pages/admin/all/NewProductQuickLink.jsx
function NewProductQuickLink (line 6) | function NewProductQuickLink({ productNew }) {
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeEdit+attributeNew/Avaibility.tsx
type GeneralProps (line 12) | interface GeneralProps {
function General (line 20) | function General({ attribute }: GeneralProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeEdit+attributeNew/General.tsx
type Group (line 37) | interface Group {
type GeneralProps (line 232) | interface GeneralProps {
function General (line 253) | function General({ attribute, createGroupApi }: GeneralProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeEdit+attributeNew/PageHeading.tsx
type AttributeEditPageHeadingProps (line 4) | interface AttributeEditPageHeadingProps {
function AttributeEditPageHeading (line 11) | function AttributeEditPageHeading({
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeEdit/AttributeEditForm.tsx
type AttributeEditFormProps (line 6) | interface AttributeEditFormProps {
function AttributeEditForm (line 10) | function AttributeEditForm({
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeGrid/Grid.jsx
function Actions (line 33) | function Actions({ attributes = [], selectedIds = [] }) {
function AttributeGrid (line 123) | function AttributeGrid({
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeGrid/NewAttributeButton.tsx
type NewAttributeButtonProps (line 4) | interface NewAttributeButtonProps {
function NewAttributeButton (line 7) | function NewAttributeButton({
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeGrid/PageHeading.tsx
type AttributGridPageHeadingProps (line 4) | interface AttributGridPageHeadingProps {
function AttributGridPageHeading (line 7) | function AttributGridPageHeading() {
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeGrid/rows/AttributeName.tsx
type AttributeNameRowProps (line 4) | interface AttributeNameRowProps {
function AttributeNameRow (line 9) | function AttributeNameRow({ url, name }: AttributeNameRowProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeGrid/rows/GroupRow.tsx
type GroupRowProps (line 10) | interface GroupRowProps {
function GroupRow (line 17) | function GroupRow({ groups }: GroupRowProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/attributeNew/AttributeNewForm.tsx
type AttributeNewFormProps (line 7) | interface AttributeNewFormProps {
function AttributeNewForm (line 11) | function AttributeNewForm({
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryEdit+categoryNew/General.tsx
type GeneralProps (line 111) | interface GeneralProps {
function General (line 134) | function General({ category }: GeneralProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryEdit+categoryNew/Image.tsx
type ImageProps (line 14) | interface ImageProps {
function Image (line 20) | function Image({ category }: ImageProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryEdit+categoryNew/PageHeading.tsx
type CategoryEditPageHeadingProps (line 4) | interface CategoryEditPageHeadingProps {
function CategoryEditPageHeading (line 11) | function CategoryEditPageHeading({
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryEdit+categoryNew/Seo.tsx
type CategorySeoProps (line 13) | interface CategorySeoProps {
function Seo (line 20) | function Seo({ category }: CategorySeoProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryEdit+categoryNew/Status.tsx
type CategoryStatusProps (line 11) | interface CategoryStatusProps {
function Status (line 19) | function Status({ category }: CategoryStatusProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryEdit/CategoryEditForm.tsx
type CategoryEditFormProps (line 6) | interface CategoryEditFormProps {
function CategoryEditForm (line 11) | function CategoryEditForm({
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryEdit/Products.tsx
type ProductsProps (line 51) | interface ProductsProps {
function Products (line 58) | function Products({
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryGrid/Grid.jsx
function Actions (line 30) | function Actions({ categories = [], selectedIds = [] }) {
function CategoryGrid (line 103) | function CategoryGrid({
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryGrid/NewCategoryButton.tsx
type NewCategoryButtonProps (line 4) | interface NewCategoryButtonProps {
function NewCategoryButton (line 7) | function NewCategoryButton({
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryGrid/PageHeading.tsx
function CategoryGridPageHeading (line 4) | function CategoryGridPageHeading() {
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryGrid/rows/CategoryName.tsx
type CategoryNameRowProps (line 4) | interface CategoryNameRowProps {
function CategoryNameRow (line 11) | function CategoryNameRow({ category }: CategoryNameRowProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/categoryNew/CategoryNewForm.tsx
type CategoryNewFormProps (line 7) | interface CategoryNewFormProps {
function CategoryNewForm (line 12) | function CategoryNewForm({
FILE: packages/evershop/src/modules/catalog/pages/admin/collectionEdit+collectionNew/General.tsx
type GeneralProps (line 14) | interface GeneralProps {
function General (line 23) | function General({ collection }: GeneralProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/collectionEdit+collectionNew/PageHeading.tsx
type CollectionEditPageHeadingProps (line 4) | interface CollectionEditPageHeadingProps {
function CollectionEditPageHeading (line 11) | function CollectionEditPageHeading({
FILE: packages/evershop/src/modules/catalog/pages/admin/collectionEdit/CollectionEditForm.tsx
type CollectionEditFormProps (line 6) | interface CollectionEditFormProps {
function CollectionEditForm (line 11) | function CollectionEditForm({
FILE: packages/evershop/src/modules/catalog/pages/admin/collectionEdit/Products.tsx
type ProductsProps (line 51) | interface ProductsProps {
function Products (line 58) | function Products({
FILE: packages/evershop/src/modules/catalog/pages/admin/collectionGrid/Grid.jsx
function Actions (line 30) | function Actions({ collections = [], selectedIds = [] }) {
function CollectionGrid (line 103) | function CollectionGrid({
FILE: packages/evershop/src/modules/catalog/pages/admin/collectionGrid/NewCollectionButton.tsx
type NewCollectionButtonProps (line 4) | interface NewCollectionButtonProps {
function NewCollectionButton (line 7) | function NewCollectionButton({
FILE: packages/evershop/src/modules/catalog/pages/admin/collectionGrid/PageHeading.tsx
function CollectionGridPageHeading (line 4) | function CollectionGridPageHeading() {
FILE: packages/evershop/src/modules/catalog/pages/admin/collectionGrid/rows/CollectionNameRow.tsx
type CollectionNameRowProps (line 4) | interface CollectionNameRowProps {
function CollectionNameRow (line 9) | function CollectionNameRow({ name, url }: CollectionNameRowProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/collectionNew/CollectionNewForm.tsx
type CollectionNewFormProps (line 7) | interface CollectionNewFormProps {
function CollectionNewForm (line 12) | function CollectionNewForm({
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit+productNew/Attributes.tsx
type Field (line 28) | interface Field {
type Attribute (line 36) | interface Attribute extends Field {
type Group (line 42) | interface Group {
type AttributesProps (line 90) | interface AttributesProps {
type FormValues (line 105) | interface FormValues {
function Attributes (line 109) | function Attributes({
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit+productNew/General.tsx
type GeneralProps (line 195) | interface GeneralProps {
function General (line 238) | function General({
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit+productNew/Inventory.tsx
type InventoryProps (line 12) | interface InventoryProps {
function Inventory (line 23) | function Inventory({ product }: InventoryProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit+productNew/Media.tsx
type MediaProps (line 12) | interface MediaProps {
function Media (line 26) | function Media({ product }: MediaProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit+productNew/PageHeading.tsx
type ProductEditPageHeadingProps (line 4) | interface ProductEditPageHeadingProps {
function ProductEditPageHeading (line 11) | function ProductEditPageHeading({
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit+productNew/Seo.tsx
type SEOProps (line 13) | interface SEOProps {
function SEO (line 23) | function SEO({ product }: SEOProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit+productNew/Shipping.tsx
type ShippingProps (line 13) | interface ShippingProps {
function Shipping (line 27) | function Shipping({ product, setting }: ShippingProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit+productNew/Status.tsx
type StatusProps (line 12) | interface StatusProps {
function Status (line 20) | function Status({ product }: StatusProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit/Collection.tsx
type Collection (line 11) | interface Collection {
function Collections (line 16) | function Collections({
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit/ProductEditForm.tsx
function ProductEditForm (line 40) | function ProductEditForm({
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit/VariantGroup.tsx
type VariantGroup (line 11) | interface VariantGroup {
type VariantProduct (line 17) | interface VariantProduct {
type VariantAttribute (line 23) | interface VariantAttribute {
type VariantGroupProps (line 33) | interface VariantGroupProps {
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit/variants/CreateVariantGroup.tsx
type Attribute (line 26) | interface Attribute {
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit/variants/Skeleton.tsx
type SkeletonProps (line 9) | interface SkeletonProps {
FILE: packages/evershop/src/modules/catalog/pages/admin/productEdit/variants/Variants.tsx
type VariantsProps (line 68) | interface VariantsProps {
type VariantItem (line 75) | interface VariantItem {
FILE: packages/evershop/src/modules/catalog/pages/admin/productGrid/Grid.jsx
function Actions (line 42) | function Actions({ products = [], selectedIds = [] }) {
function ProductGrid (line 177) | function ProductGrid({
FILE: packages/evershop/src/modules/catalog/pages/admin/productGrid/NewProductButton.tsx
type NewProductButtonProps (line 4) | interface NewProductButtonProps {
function NewProductButton (line 7) | function NewProductButton({
FILE: packages/evershop/src/modules/catalog/pages/admin/productGrid/PageHeading.tsx
type ProductGridPageHeadingProps (line 4) | interface ProductGridPageHeadingProps {
function ProductEditPageHeading (line 11) | function ProductEditPageHeading({
FILE: packages/evershop/src/modules/catalog/pages/admin/productGrid/rows/ProductName.tsx
type ProductNameRowProps (line 4) | interface ProductNameRowProps {
function ProductNameRow (line 8) | function ProductNameRow({ url, name }: ProductNameRowProps) {
FILE: packages/evershop/src/modules/catalog/pages/admin/productNew/ProductNewForm.tsx
function ProductNewForm (line 8) | function ProductNewForm({
FILE: packages/evershop/src/modules/catalog/pages/frontStore/all/SearchBox.tsx
type SearchBoxProps (line 5) | interface SearchBoxProps {
function SearchBox (line 8) | function SearchBox({ searchPageUrl }: SearchBoxProps) {
FILE: packages/evershop/src/modules/catalog/pages/frontStore/catalogSearch/SearchPage.tsx
type SearchPageProps (line 11) | interface SearchPageProps {
function SearchPage (line 15) | function SearchPage({ search }: SearchPageProps) {
FILE: packages/evershop/src/modules/catalog/pages/frontStore/categoryView/CategoryView.tsx
type CategoryViewProps (line 14) | interface CategoryViewProps {
function CategoryView (line 18) | function CategoryView({ category }: CategoryViewProps) {
FILE: packages/evershop/src/modules/catalog/pages/frontStore/productView/ProductView.tsx
function ProductView (line 13) | function ProductView({ product }: ProductData) {
FILE: packages/evershop/src/modules/catalog/services/AttributeCollection.js
class AttributeCollection (line 5) | class AttributeCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 10) | async init(filters = []) {
method items (line 43) | async items() {
method total (line 48) | async total() {
method currentFilters (line 54) | currentFilters() {
FILE: packages/evershop/src/modules/catalog/services/AttributeGroupCollection.js
class AttributeGroupCollection (line 6) | class AttributeGroupCollection {
method constructor (line 7) | constructor(baseQuery) {
method init (line 11) | async init(filters = []) {
method items (line 79) | async items() {
method total (line 84) | async total() {
method currentFilters (line 90) | currentFilters() {
FILE: packages/evershop/src/modules/catalog/services/CategoryCollection.js
class CategoryCollection (line 5) | class CategoryCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 11) | async init(filters = [], isAdmin = false) {
method items (line 50) | async items() {
method total (line 55) | async total() {
method currentFilters (line 61) | currentFilters() {
FILE: packages/evershop/src/modules/catalog/services/CollectionCollection.js
class CollectionCollection (line 5) | class CollectionCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 11) | async init(filters = []) {
method items (line 44) | async items() {
method total (line 49) | async total() {
method currentFilters (line 55) | currentFilters() {
FILE: packages/evershop/src/modules/catalog/services/ProductCollection.js
class ProductCollection (line 7) | class ProductCollection {
method constructor (line 8) | constructor(baseQuery) {
method init (line 18) | async init(filters = [], isAdmin = false) {
method items (line 127) | async items() {
method total (line 132) | async total() {
method currentFilters (line 138) | currentFilters() {
FILE: packages/evershop/src/modules/catalog/services/attribute/createProductAttribute.ts
type AttributeData (line 19) | type AttributeData = {
function validateAttributeDataBeforeInsert (line 30) | function validateAttributeDataBeforeInsert(data: AttributeData) {
function insertAttributeGroups (line 54) | async function insertAttributeGroups(attributeId: number, groups: number...
function insertAttributeOptions (line 73) | async function insertAttributeOptions(
function insertAttributeData (line 102) | async function insertAttributeData(data: AttributeData, connection: Pool...
function createAttribute (line 112) | async function createAttribute(data: AttributeData, context: Record<stri...
FILE: packages/evershop/src/modules/catalog/services/attribute/deleteProductAttribute.ts
function deleteAttributeData (line 12) | async function deleteAttributeData(uuid: string, connection: PoolClient) {
function deleteAttribute (line 20) | async function deleteAttribute(uuid: string, context: Record<string, any...
FILE: packages/evershop/src/modules/catalog/services/attribute/updateProductAttribute.ts
type AttributeData (line 18) | type AttributeData = {
function validateAttributeDataBeforeInsert (line 26) | function validateAttributeDataBeforeInsert(data: AttributeData) {
function updateAttributeOptions (line 43) | async function updateAttributeOptions(
function updateAttributeGroups (line 104) | async function updateAttributeGroups(attributeId: number, groups: number...
function updateAttributeData (line 143) | async function updateAttributeData(uuid: string, data: AttributeData, co...
function updateAttribute (line 173) | async function updateAttribute(uuid: string, data: AttributeData, contex...
FILE: packages/evershop/src/modules/catalog/services/category/createCategory.ts
type CategoryData (line 21) | type CategoryData = {
function validateCategoryDataBeforeInsert (line 28) | function validateCategoryDataBeforeInsert(data: CategoryData) {
function insertCategoryData (line 45) | async function insertCategoryData(data: CategoryData & { parent_id?: num...
function createCategory (line 76) | async function createCategory(data: CategoryData, context: Record<string...
FILE: packages/evershop/src/modules/catalog/services/category/deleteCategory.ts
function deleteCategoryData (line 12) | async function deleteCategoryData(uuid: string, connection: PoolClient) {
function deleteCategory (line 20) | async function deleteCategory(uuid: string, context: Record<string, any>) {
FILE: packages/evershop/src/modules/catalog/services/category/updateCategory.ts
function validateCategoryDataBeforeInsert (line 21) | function validateCategoryDataBeforeInsert(data: CategoryData) {
function updateCategoryData (line 38) | async function updateCategoryData(uuid: string, data: CategoryData, conn...
function updateCategory (line 84) | async function updateCategory(uuid: string, data: CategoryData, context:...
FILE: packages/evershop/src/modules/catalog/services/collection/createCollection.ts
type CollectionData (line 13) | type CollectionData = {
function insertCollectionData (line 20) | async function insertCollectionData(
function createCollection (line 33) | async function createCollection(
FILE: packages/evershop/src/modules/catalog/services/collection/deleteCollection.ts
function deleteCollectionData (line 12) | async function deleteCollectionData(uuid: string, connection: PoolClient) {
function deleteCollection (line 20) | async function deleteCollection(uuid: string, context: Record<string, an...
FILE: packages/evershop/src/modules/catalog/services/collection/updateCollection.ts
function updateCollectionData (line 15) | async function updateCollectionData(
function updateCollection (line 51) | async function updateCollection(
FILE: packages/evershop/src/modules/catalog/services/product/createProduct.ts
type ProductData (line 24) | type ProductData = ProductInventoryData & {
type ProductInventoryData (line 38) | type ProductInventoryData = {
type ProductAttributeData (line 45) | type ProductAttributeData = {
function validateProductDataBeforeInsert (line 51) | function validateProductDataBeforeInsert(data: ProductData) {
function insertProductInventory (line 77) | async function insertProductInventory(inventoryData: ProductInventoryDat...
function insertProductAttributes (line 85) | async function insertProductAttributes(attributes: ProductAttributeData[...
function insertProductImages (line 189) | async function insertProductImages(images: string[], productId: number, ...
function insertProductData (line 210) | async function insertProductData(data: ProductData, connection: PoolClie...
function createProduct (line 230) | async function createProduct(data: ProductData, context: Record<string, ...
FILE: packages/evershop/src/modules/catalog/services/product/deleteProduct.ts
function deleteProductData (line 13) | async function deleteProductData(uuid: string, connection: PoolClient) {
function deleteProduct (line 22) | async function deleteProduct(uuid: string, context: Record<string, any>) {
FILE: packages/evershop/src/modules/catalog/services/product/updateProduct.ts
function validateProductDataBeforeUpdate (line 26) | function validateProductDataBeforeUpdate(data: ProductData) {
function updateProductInventory (line 43) | async function updateProductInventory(inventoryData: ProductInventoryDat...
function saveProductAttributes (line 64) | async function saveProductAttributes(productId: number, attributes: Prod...
function updateProductAttributes (line 177) | async function updateProductAttributes(
function updateProductImages (line 232) | async function updateProductImages(images, productId, connection) {
function updateProductData (line 285) | async function updateProductData(uuid: string, data: ProductData, connec...
function updateProduct (line 361) | async function updateProduct(uuid: string, data: ProductData, context: R...
FILE: packages/evershop/src/modules/catalog/services/registerDefaultAttributeCollectionFilters.js
function registerDefaultAttributeCollectionFilters (line 4) | async function registerDefaultAttributeCollectionFilters() {
FILE: packages/evershop/src/modules/catalog/services/registerDefaultCategoryCollectionFilters.js
function registerDefaultCategoryCollectionFilters (line 4) | async function registerDefaultCategoryCollectionFilters() {
FILE: packages/evershop/src/modules/catalog/services/registerDefaultCollectionCollectionFilters.js
function registerDefaultCollectionCollectionFilters (line 4) | async function registerDefaultCollectionCollectionFilters() {
FILE: packages/evershop/src/modules/catalog/services/registerDefaultProductCollectionFilters.js
function registerDefaultProductCollectionFilters (line 6) | async function registerDefaultProductCollectionFilters() {
FILE: packages/evershop/src/modules/checkout/pages/admin/all/ShippingSettingMenu.tsx
type ShippingSettingMenuProps (line 13) | interface ShippingSettingMenuProps {
function ShippingSettingMenu (line 16) | function ShippingSettingMenu({
FILE: packages/evershop/src/modules/checkout/pages/admin/shippingSetting/ShippingSetting.tsx
function ShippingSetting (line 11) | function ShippingSetting({
FILE: packages/evershop/src/modules/checkout/pages/admin/shippingSetting/shippingSetting/Method.tsx
type ShippingMethod (line 12) | interface ShippingMethod {
type MethodProps (line 36) | interface MethodProps {
function Method (line 41) | function Method({ method, reload }: MethodProps) {
FILE: packages/evershop/src/modules/checkout/pages/admin/shippingSetting/shippingSetting/MethodForm.tsx
type ConditionProps (line 32) | interface ConditionProps {
function Condition (line 36) | function Condition({ method }: ConditionProps) {
type MethodFormProps (line 105) | interface MethodFormProps {
function MethodForm (line 150) | function MethodForm({
FILE: packages/evershop/src/modules/checkout/pages/admin/shippingSetting/shippingSetting/Methods.tsx
type MethodsProps (line 19) | interface MethodsProps {
function Methods (line 25) | function Methods({ reload, methods, addMethodApi }: MethodsProps) {
FILE: packages/evershop/src/modules/checkout/pages/admin/shippingSetting/shippingSetting/PriceBasedPrice.tsx
type PriceBasedPriceProps (line 15) | interface PriceBasedPriceProps {
function PriceBasedPrice (line 22) | function PriceBasedPrice({ lines }: PriceBasedPriceProps) {
FILE: packages/evershop/src/modules/checkout/pages/admin/shippingSetting/shippingSetting/WeightBasedPrice.tsx
type WeightBasedPriceProps (line 15) | interface WeightBasedPriceProps {
function WeightBasedPrice (line 22) | function WeightBasedPrice({ lines }: WeightBasedPriceProps) {
FILE: packages/evershop/src/modules/checkout/pages/admin/shippingSetting/shippingSetting/Zone.tsx
type ShippingZone (line 17) | interface ShippingZone {
type ZoneProps (line 34) | interface ZoneProps {
function Zone (line 39) | function Zone({ zone, reload }: ZoneProps) {
FILE: packages/evershop/src/modules/checkout/pages/admin/shippingSetting/shippingSetting/ZoneForm.tsx
type ZoneFormProps (line 11) | interface ZoneFormProps {
function ZoneForm (line 32) | function ZoneForm({
FILE: packages/evershop/src/modules/checkout/pages/admin/shippingSetting/shippingSetting/Zones.tsx
type ShippingCountry (line 13) | interface ShippingCountry {
function Zones (line 78) | function Zones({
FILE: packages/evershop/src/modules/checkout/pages/frontStore/all/MiniCartIcon.tsx
type MiniCartIconProps (line 4) | interface MiniCartIconProps {
function MiniCartIcon (line 7) | function MiniCartIcon({ cartUrl }: MiniCartIconProps) {
FILE: packages/evershop/src/modules/checkout/pages/frontStore/cart/ShoppingCart.tsx
type ShoppingCartProps (line 21) | interface ShoppingCartProps {
function ShoppingCart (line 24) | function ShoppingCart({ checkoutUrl }: ShoppingCartProps) {
FILE: packages/evershop/src/modules/checkout/pages/frontStore/checkout/Checkout.tsx
type CheckoutPageProps (line 16) | interface CheckoutPageProps {
function CheckoutPage (line 23) | function CheckoutPage({
FILE: packages/evershop/src/modules/checkout/pages/frontStore/checkout/index.ts
type SessionData (line 8) | interface SessionData {
FILE: packages/evershop/src/modules/checkout/pages/frontStore/checkoutSuccess/CheckoutSuccess.jsx
function CheckoutSuccessPage (line 5) | function CheckoutSuccessPage() {
FILE: packages/evershop/src/modules/checkout/pages/frontStore/checkoutSuccess/CustomerInfo.tsx
type CustomerInfoProps (line 6) | interface CustomerInfoProps {
function CustomerInfo (line 48) | function CustomerInfo({
FILE: packages/evershop/src/modules/checkout/pages/frontStore/checkoutSuccess/ShippingNote.tsx
type ShippingNoteProps (line 3) | interface ShippingNoteProps {
function ShippingNote (line 12) | function ShippingNote({
FILE: packages/evershop/src/modules/checkout/pages/frontStore/checkoutSuccess/Summary.tsx
type SummaryProps (line 8) | interface SummaryProps {
function Summary (line 12) | function Summary({ order }: SummaryProps) {
FILE: packages/evershop/src/modules/checkout/services/addBillingAddress.ts
type BillingAddress (line 16) | interface BillingAddress extends Address {
function addBillingAddressService (line 33) | async function addBillingAddressService<
function saveBillingAddress (line 108) | async function saveBillingAddress(
function updateCartWithAddress (line 129) | async function updateCartWithAddress(
FILE: packages/evershop/src/modules/checkout/services/addCartItem.ts
function addCartItem (line 5) | async function addCartItem(
FILE: packages/evershop/src/modules/checkout/services/addShippingAddress.ts
type ShippingAddress (line 16) | interface ShippingAddress extends Address {
function addShippingAddressService (line 32) | async function addShippingAddressService<
function findShippingZone (line 121) | async function findShippingZone(addressData: Address, connection: PoolCl...
function saveShippingAddress (line 143) | async function saveShippingAddress(
function updateCartWithAddress (line 164) | async function updateCartWithAddress(
FILE: packages/evershop/src/modules/checkout/services/cart/Cart.js
class Item (line 11) | class Item extends DataObject {
method constructor (line 16) | constructor(cart, initialData = {}) {
method getProduct (line 21) | async getProduct() {
method getId (line 31) | getId() {
method getCart (line 35) | getCart() {
class Cart (line 40) | class Cart extends DataObject {
method constructor (line 41) | constructor(initialData = {}) {
method getId (line 46) | getId() {
method getItems (line 53) | getItems() {
method addItem (line 64) | async addItem(productID, qty, context) {
method removeItem (line 74) | async removeItem(uuid, context) {
method removeItemBySku (line 84) | async removeItemBySku(sku, context) {
method updateItemQty (line 98) | async updateItemQty(uuid, qty, action, context) {
method updateItemQtyBySku (line 109) | async updateItemQtyBySku(sku, qty, action, context) {
method createItem (line 125) | async createItem(productId, qty) {
method getItem (line 143) | getItem(uuid) {
method hasItemError (line 148) | hasItemError() {
method hasError (line 161) | hasError() {
method exportData (line 165) | exportData() {
function createNewCart (line 178) | async function createNewCart(initialData) {
function getCart (line 184) | async function getCart(uuid) {
FILE: packages/evershop/src/modules/checkout/services/cart/DataObject.js
class DataObject (line 4) | class DataObject {
method constructor (line 15) | constructor(fields, initialData = {}) {
method build (line 23) | async build() {
method getTriggeredField (line 57) | getTriggeredField() {
method getRequestedValue (line 61) | getRequestedValue() {
method getData (line 65) | getData(key) {
method setError (line 74) | setError(key, message) {
method setData (line 82) | async setData(key, value, force = false) {
method hasError (line 109) | hasError() {
method getErrors (line 113) | getErrors() {
method export (line 117) | export() {
FILE: packages/evershop/src/modules/checkout/services/cart/registerCartBaseFields.js
function registerCartBaseFields (line 16) | function registerCartBaseFields(fields) {
FILE: packages/evershop/src/modules/checkout/services/cart/registerCartItemBaseFields.js
function registerCartItemBaseFields (line 7) | function registerCartItemBaseFields(fields) {
FILE: packages/evershop/src/modules/checkout/services/cart/sortFields.js
function sortFields (line 3) | function sortFields(fields) {
FILE: packages/evershop/src/modules/checkout/services/checkout.ts
function checkoutService (line 9) | async function checkoutService(
FILE: packages/evershop/src/modules/checkout/services/createNewCart.ts
function createNewCart (line 10) | async function createNewCart(
FILE: packages/evershop/src/modules/checkout/services/getAvailablePaymentMethods.ts
type PaymentMethodInfo (line 3) | type PaymentMethodInfo = {
type PaymentMethodFactory (line 8) | type PaymentMethodFactory = {
function getAvailablePaymentMethods (line 17) | async function getAvailablePaymentMethods(): Promise<
function registerPaymentMethod (line 55) | function registerPaymentMethod(factory: PaymentMethodFactory): void {
FILE: packages/evershop/src/modules/checkout/services/orderCreator.ts
type SaveOrderContext (line 27) | interface SaveOrderContext {
type SaveOrderArgs (line 32) | type SaveOrderArgs = [cart: Cart, connection: PoolClient];
type SaveOrderItemsContext (line 35) | interface SaveOrderItemsContext {
type SaveOrderItemsArgs (line 40) | type SaveOrderItemsArgs = [
type DisableCartContext (line 47) | interface DisableCartContext {
type DisableCartArgs (line 52) | type DisableCartArgs = [cartId: number, connection: PoolClient];
type CreateOrderContext (line 55) | interface CreateOrderContext {
type CreateOrderArgs (line 60) | type CreateOrderArgs = [cart: Cart];
type CreateOrderResult (line 66) | type CreateOrderResult = InsertResultWithRow<OrderRow>;
function disableCart (line 68) | async function disableCart(cartId: number, connection: PoolClient) {
function saveOrder (line 76) | async function saveOrder<T = CreateOrderResult>(
function saveOrderItems (line 153) | async function saveOrderItems(
function createOrderFunc (line 174) | async function createOrderFunc<T extends CreateOrderResult>(cart: Cart) {
FILE: packages/evershop/src/modules/checkout/services/orderValidator.ts
function validateBeforeCreateOrder (line 79) | async function validateBeforeCreateOrder(
function addOrderValidationRule (line 91) | function addOrderValidationRule(rule: Validator<Cart>): void {
FILE: packages/evershop/src/modules/checkout/services/removeCartItem.ts
function removeCartItem (line 4) | async function removeCartItem(cart: Cart, uuid: string) {
FILE: packages/evershop/src/modules/checkout/services/toPrice.ts
type RoundType (line 3) | type RoundType = 'up' | 'down' | 'round';
function toPrice (line 4) | function toPrice(value: string, forDisplay: boolean = false) {
FILE: packages/evershop/src/modules/checkout/services/updateCartItemQty.ts
function updateCartItemQty (line 4) | async function updateCartItemQty(
FILE: packages/evershop/src/modules/cms/components/Banner.tsx
type BannerProps (line 4) | interface BannerProps {
function Banner (line 14) | function Banner({
FILE: packages/evershop/src/modules/cms/components/BannerSetting.tsx
type AlignmentType (line 8) | type AlignmentType = 'left' | 'center' | 'right';
type BannerSettingProps (line 10) | interface BannerSettingProps {
function BannerSetting (line 21) | function BannerSetting({
FILE: packages/evershop/src/modules/cms/components/BasicMenu.tsx
type BasicMenuProps (line 13) | interface BasicMenuProps {
function BasicMenu (line 33) | function BasicMenu({
FILE: packages/evershop/src/modules/cms/components/BasicMenuSetting.tsx
type MenuItem (line 57) | interface MenuItem {
type SortableMenuItemProps (line 66) | interface SortableMenuItemProps {
type BasicMenuSettingProps (line 327) | interface BasicMenuSettingProps {
function BasicMenuSetting (line 335) | function BasicMenuSetting({
FILE: packages/evershop/src/modules/cms/components/Slideshow.tsx
function PrevArrow (line 6) | function PrevArrow(props: any) {
function NextArrow (line 33) | function NextArrow(props: any) {
function CustomDot (line 60) | function CustomDot(props: any) {
type SlideData (line 80) | interface SlideData {
type SlideshowProps (line 92) | interface SlideshowProps {
function Slideshow (line 102) | function Slideshow({
FILE: packages/evershop/src/modules/cms/components/SlideshowSetting.tsx
type SlideData (line 13) | interface SlideData {
type SlideshowSettingProps (line 25) | interface SlideshowSettingProps {
function SlideshowSetting (line 39) | function SlideshowSetting({
FILE: packages/evershop/src/modules/cms/components/TextBlock.tsx
type TextBlockProps (line 5) | interface TextBlockProps {
function TextBlock (line 11) | function TextBlock({
FILE: packages/evershop/src/modules/cms/components/TextBlockSetting.tsx
type TextBlockSettingProps (line 6) | interface TextBlockSettingProps {
function TextBlockSetting (line 12) | function TextBlockSetting({
FILE: packages/evershop/src/modules/cms/graphql/types/Widget/Widget.resolvers.js
method textWidget (line 53) | textWidget(_, { text, className }) {
method bannerWidget (line 68) | bannerWidget(_, { src, alignment, width, height, alt }) {
method slideshowWidget (line 71) | slideshowWidget(
FILE: packages/evershop/src/modules/cms/pages/admin/adminNotFound/Meta.tsx
function SeoMeta (line 5) | function SeoMeta() {
FILE: packages/evershop/src/modules/cms/pages/admin/adminNotFound/NotFound.tsx
function Name (line 5) | function Name() {
type ContentProps (line 11) | interface ContentProps {
function Content (line 14) | function Content({ dashboardUrl }: ContentProps) {
function NotFound (line 31) | function NotFound({ dashboardUrl }: ContentProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/all/CmsMenuGroup.jsx
function CmsMenuGroup (line 6) | function CmsMenuGroup({ cmsPageGrid, widgetGrid }) {
FILE: packages/evershop/src/modules/cms/pages/admin/all/CopyRight.tsx
type CopyRightProps (line 3) | interface CopyRightProps {
function CopyRight (line 8) | function CopyRight({
FILE: packages/evershop/src/modules/cms/pages/admin/all/Logo.tsx
type LogoProps (line 3) | interface LogoProps {
function Logo (line 6) | function Logo({ dashboardUrl }: LogoProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/all/Navigation.jsx
function AdminNavigation (line 5) | function AdminNavigation() {
FILE: packages/evershop/src/modules/cms/pages/admin/all/Notification.jsx
function Notification (line 7) | function Notification() {
FILE: packages/evershop/src/modules/cms/pages/admin/all/QuickLinks.jsx
function QuickLinks (line 6) | function QuickLinks({ dashboard }) {
FILE: packages/evershop/src/modules/cms/pages/admin/all/SearchBox.tsx
type SearchBoxProps (line 58) | interface SearchBoxProps {
function SearchBox (line 65) | function SearchBox({ resourceLinks }: SearchBoxProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/all/Survey.tsx
function Survey (line 5) | function Survey() {
FILE: packages/evershop/src/modules/cms/pages/admin/all/Version.jsx
function Version (line 5) | function Version({ version }) {
FILE: packages/evershop/src/modules/cms/pages/admin/all/search/NoResult.tsx
type NoResultProps (line 3) | interface NoResultProps {
function NoResult (line 11) | function NoResult({ keyword = '', resourseLinks = [] }: NoResultProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/all/search/Results.jsx
function Results (line 10) | function Results({ keyword, results = {} }) {
FILE: packages/evershop/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/General.tsx
type CmsPageGeneralProps (line 13) | interface CmsPageGeneralProps {
function General (line 23) | function General({ page }: CmsPageGeneralProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/PageHeading.tsx
type CmsGridPageHeadingProps (line 4) | interface CmsGridPageHeadingProps {
function CmsGridPageHeading (line 11) | function CmsGridPageHeading({
FILE: packages/evershop/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/Seo.tsx
type CmsPageSeoProps (line 12) | interface CmsPageSeoProps {
function Seo (line 21) | function Seo({ page }: CmsPageSeoProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/cmsPageEdit/PageEditForm.tsx
type CmsPageEditFormProps (line 6) | interface CmsPageEditFormProps {
function CmsPageEditForm (line 10) | function CmsPageEditForm({
FILE: packages/evershop/src/modules/cms/pages/admin/cmsPageGrid/Grid.jsx
function Actions (line 29) | function Actions({ pages = [], selectedIds = [] }) {
function CMSPageGrid (line 161) | function CMSPageGrid({
FILE: packages/evershop/src/modules/cms/pages/admin/cmsPageGrid/NewPageButton.tsx
type NewPageButtonProps (line 4) | interface NewPageButtonProps {
function NewPageButton (line 8) | function NewPageButton({ newPageUrl }: NewPageButtonProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/cmsPageGrid/PageHeading.tsx
function CmsPageHeading (line 4) | function CmsPageHeading() {
FILE: packages/evershop/src/modules/cms/pages/admin/cmsPageGrid/rows/PageName.tsx
type PageNameProps (line 4) | interface PageNameProps {
function PageName (line 9) | function PageName({ url, name }: PageNameProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/cmsPageNew/PageNewForm.tsx
type CmsPageNewFormProps (line 7) | interface CmsPageNewFormProps {
function CmsPageNewForm (line 11) | function CmsPageNewForm({
FILE: packages/evershop/src/modules/cms/pages/admin/dashboard/Layout.jsx
function DashboardLayout (line 5) | function DashboardLayout() {
FILE: packages/evershop/src/modules/cms/pages/admin/dashboard/PageHeading.tsx
function DashboardPageHeading (line 4) | function DashboardPageHeading() {
FILE: packages/evershop/src/modules/cms/pages/admin/widgetEdit+widgetNew/General.tsx
type GeneralProps (line 90) | interface GeneralProps {
function General (line 107) | function General({ widget, routes }: GeneralProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/widgetEdit+widgetNew/PageHeading.tsx
type WidgetEditPageHeadingProps (line 4) | interface WidgetEditPageHeadingProps {
function WidgetEditPageHeading (line 10) | function WidgetEditPageHeading({
FILE: packages/evershop/src/modules/cms/pages/admin/widgetEdit+widgetNew/Setting.tsx
type SettingProps (line 11) | interface SettingProps {
function Setting (line 18) | function Setting({ type }: SettingProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/widgetEdit/WidgetEditForm.tsx
type WidgetEditFormProps (line 7) | interface WidgetEditFormProps {
function WidgetEditForm (line 18) | function WidgetEditForm({
FILE: packages/evershop/src/modules/cms/pages/admin/widgetGrid/Grid.jsx
function Actions (line 31) | function Actions({ widgets = [], selectedIds = [] }) {
function WidgetGrid (line 163) | function WidgetGrid({
FILE: packages/evershop/src/modules/cms/pages/admin/widgetGrid/Heading.tsx
function WidgetGridHeading (line 4) | function WidgetGridHeading() {
FILE: packages/evershop/src/modules/cms/pages/admin/widgetGrid/NewWidgetButton.tsx
type WidgetType (line 18) | interface WidgetType {
type NewWidgetButtonProps (line 53) | interface NewWidgetButtonProps {
function NewWidgetButton (line 57) | function NewWidgetButton({ widgetTypes }: NewWidgetButtonProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/widgetGrid/rows/Name.tsx
type NameProps (line 4) | interface NameProps {
function Name (line 9) | function Name({ url, name }: NameProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/widgetGrid/rows/WidgetTypeRow.tsx
type WidgetTypeRowProps (line 4) | interface WidgetTypeRowProps {
function WidgetTypeRow (line 12) | function WidgetTypeRow({ code, types }: WidgetTypeRowProps) {
FILE: packages/evershop/src/modules/cms/pages/admin/widgetNew/WidgetNewForm.tsx
type WidgetNewFormProps (line 8) | interface WidgetNewFormProps {
function WidgetNewForm (line 19) | function WidgetNewForm({
FILE: packages/evershop/src/modules/cms/pages/frontStore/cmsPageView/CmsPageView.tsx
type CmsPage (line 5) | interface CmsPage {
type CmsPageViewProps (line 10) | interface CmsPageViewProps {
function CmsPageView (line 13) | function CmsPageView({ page }: CmsPageViewProps) {
FILE: packages/evershop/src/modules/cms/pages/frontStore/notFound/Meta.tsx
function SeoMeta (line 5) | function SeoMeta() {
FILE: packages/evershop/src/modules/cms/pages/frontStore/notFound/NotFound.tsx
function Name (line 6) | function Name() {
type ContentProps (line 14) | interface ContentProps {
function Content (line 18) | function Content({ continueShoppingUrl }: ContentProps) {
type NotFoundProps (line 36) | interface NotFoundProps {
function NotFound (line 39) | function NotFound({ continueShoppingUrl }: NotFoundProps) {
FILE: packages/evershop/src/modules/cms/services/CMSPageCollection.js
class CMSPageCollection (line 5) | class CMSPageCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 10) | async init(filters = [], isAdmin = false) {
method items (line 46) | async items() {
method total (line 51) | async total() {
method currentFilters (line 57) | currentFilters() {
FILE: packages/evershop/src/modules/cms/services/CustomMemoryStorage.js
function CustomMemoryStorage (line 3) | function CustomMemoryStorage(opts) {
FILE: packages/evershop/src/modules/cms/services/WidgetCollection.js
class WidgetCollection (line 5) | class WidgetCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 10) | async init(filters = [], isAdmin = false) {
method items (line 46) | async items() {
method total (line 51) | async total() {
method currentFilters (line 57) | currentFilters() {
FILE: packages/evershop/src/modules/cms/services/browFiles.ts
type FileBrowser (line 8) | interface FileBrowser {
FILE: packages/evershop/src/modules/cms/services/getMulter.js
function fileFilter (line 6) | function fileFilter(request, file, cb) {
FILE: packages/evershop/src/modules/cms/services/imageProcessor.ts
type ProcessedImage (line 46) | interface ProcessedImage {
FILE: packages/evershop/src/modules/cms/services/page/createPage.ts
function validatePageDataBeforeInsert (line 17) | function validatePageDataBeforeInsert(data) {
function insertPageData (line 36) | async function insertPageData(data, connection) {
function createPage (line 54) | async function createPage(data, context) {
FILE: packages/evershop/src/modules/cms/services/page/deletePage.ts
function deletePageData (line 11) | async function deletePageData(uuid, connection) {
function deletePage (line 19) | async function deletePage(uuid, context) {
FILE: packages/evershop/src/modules/cms/services/page/updatePage.ts
function validatePageDataBeforeInsert (line 18) | function validatePageDataBeforeInsert(data) {
function updatePageData (line 31) | async function updatePageData(uuid, data, connection) {
function updatePage (line 75) | async function updatePage(uuid, data, context) {
FILE: packages/evershop/src/modules/cms/services/pageMetaInfo.ts
function setPageMetaInfo (line 8) | function setPageMetaInfo(
function getPageMetaInfo (line 17) | function getPageMetaInfo(request: EvershopRequest): PageMetaInfo {
FILE: packages/evershop/src/modules/cms/services/registerDefaultPageCollectionFilters.js
function registerDefaultPageCollectionFilters (line 4) | async function registerDefaultPageCollectionFilters() {
FILE: packages/evershop/src/modules/cms/services/registerDefaultWidgetCollectionFilters.js
function registerDefaultWidgetCollectionFilters (line 4) | async function registerDefaultWidgetCollectionFilters() {
FILE: packages/evershop/src/modules/cms/services/tests/unit/imageProcessor.test.js
function fileExists (line 21) | async function fileExists(filePath) {
constant ROOTPATH (line 35) | const ROOTPATH = path.join(__dirname, 'root');
constant BUILDPATH (line 38) | const BUILDPATH = path.join(ROOTPATH, 'images');
constant MEDIA_DIR (line 41) | const MEDIA_DIR = path.join(ROOTPATH, 'media');
constant TEMP_DIR (line 44) | const TEMP_DIR = MEDIA_DIR;
FILE: packages/evershop/src/modules/cms/services/uploadFile.ts
type UploadedFile (line 9) | interface UploadedFile extends FileBrowser {
FILE: packages/evershop/src/modules/cms/services/validatePath.js
function validatePath (line 3) | function validatePath(root, requestedPath) {
FILE: packages/evershop/src/modules/cms/services/widget/createWidget.js
function validateWidgetDataBeforeInsert (line 16) | function validateWidgetDataBeforeInsert(data) {
function insertWidgetData (line 32) | async function insertWidgetData(data, connection) {
function createWidget (line 42) | async function createWidget(data, context) {
FILE: packages/evershop/src/modules/cms/services/widget/deleteWidget.js
function deleteWidgetData (line 11) | async function deleteWidgetData(uuid, connection) {
function deleteWidget (line 19) | async function deleteWidget(uuid, context) {
FILE: packages/evershop/src/modules/cms/services/widget/loadWidgetInstances.js
function loadWidgetInstances (line 7) | async function loadWidgetInstances(request) {
FILE: packages/evershop/src/modules/cms/services/widget/updateWidget.js
function validateWidgetDataBeforeInsert (line 17) | function validateWidgetDataBeforeInsert(data) {
function updateWidgetData (line 33) | async function updateWidgetData(uuid, data, connection) {
function updateWidget (line 54) | async function updateWidget(uuid, data, context) {
FILE: packages/evershop/src/modules/cod/pages/admin/orderEdit/CaptureButton.jsx
function CaptureButton (line 9) | function CaptureButton({
FILE: packages/evershop/src/modules/cod/pages/admin/paymentSetting/CODSetting.tsx
type CODPaymentProps (line 12) | interface CODPaymentProps {
function CODPayment (line 18) | function CODPayment({
FILE: packages/evershop/src/modules/cod/pages/frontStore/checkout/CashOnDelivery.tsx
type CashOnDeliveryMethodProps (line 10) | interface CashOnDeliveryMethodProps {
type CODLogoProps (line 16) | interface CODLogoProps {
function CODLogo (line 21) | function CODLogo({ width = 100, height = 30 }: CODLogoProps) {
function CashOnDeliveryMethod (line 33) | function CashOnDeliveryMethod({
FILE: packages/evershop/src/modules/customer/pages/admin/all/CustomerMenuGroup.jsx
function CustomerMenuGroup (line 6) | function CustomerMenuGroup({ customerGrid }) {
FILE: packages/evershop/src/modules/customer/pages/admin/customerEdit+customerNew/General.jsx
function FullName (line 7) | function FullName({ fullName }) {
function Group (line 22) | function Group({ group }) {
function Email (line 39) | function Email({ email }) {
function Status (line 54) | function Status({ status }) {
function General (line 69) | function General({ customer }) {
FILE: packages/evershop/src/modules/customer/pages/admin/customerEdit+customerNew/OrderHistory.jsx
function OrderHistory (line 11) | function OrderHistory({ customer: { orders = [] } }) {
FILE: packages/evershop/src/modules/customer/pages/admin/customerEdit+customerNew/PageHeading.tsx
type CustomerEditPageHeadingProps (line 4) | interface CustomerEditPageHeadingProps {
function CustomerEditPageHeading (line 11) | function CustomerEditPageHeading({
FILE: packages/evershop/src/modules/customer/pages/admin/customerEdit/CustomerEditForm.jsx
function CustomerEditForm (line 5) | function CustomerEditForm() {
FILE: packages/evershop/src/modules/customer/pages/admin/customerGrid/Grid.jsx
function Actions (line 39) | function Actions({ customers = [], selectedIds = [] }) {
function CustomerGrid (line 135) | function CustomerGrid({
FILE: packages/evershop/src/modules/customer/pages/admin/customerGrid/Heading.tsx
function CustomerGridHeading (line 4) | function CustomerGridHeading() {
FILE: packages/evershop/src/modules/customer/pages/admin/customerGrid/rows/CustomerName.tsx
type CustomerNameProps (line 4) | interface CustomerNameProps {
function CustomerName (line 9) | function CustomerName({ url, name }: CustomerNameProps) {
FILE: packages/evershop/src/modules/customer/pages/frontStore/account/MyAccount.tsx
function MyAccount (line 8) | function MyAccount() {
FILE: packages/evershop/src/modules/customer/pages/frontStore/all/CustomerIcon.tsx
type UserIconProps (line 4) | interface UserIconProps {
function UserIcon (line 14) | function UserIcon({
FILE: packages/evershop/src/modules/customer/pages/frontStore/login/LoginPage.tsx
type LoginPageProps (line 7) | interface LoginPageProps {
function LoginPage (line 13) | function LoginPage({
FILE: packages/evershop/src/modules/customer/pages/frontStore/register/RegisterPage.tsx
type RegisterPageProps (line 7) | interface RegisterPageProps {
function RegisterPage (line 11) | function RegisterPage({ homeUrl, loginUrl }: RegisterPageProps) {
FILE: packages/evershop/src/modules/customer/pages/frontStore/resetPasswordPage/ResetPasswordPage.tsx
function Success (line 10) | function Success({ children }: { children?: React.ReactNode }) {
type ResetFormProps (line 100) | interface ResetFormProps {
function ResetForm (line 104) | function ResetForm({ action }: ResetFormProps) {
type ResetPasswordFormProps (line 133) | interface ResetPasswordFormProps {
function ResetPasswordPage (line 138) | function ResetPasswordPage({
FILE: packages/evershop/src/modules/customer/services/CustomerCollection.js
class CustomerCollection (line 5) | class CustomerCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 11) | async init(filters = []) {
method items (line 44) | async items() {
method total (line 49) | async total() {
method currentFilters (line 55) | currentFilters() {
FILE: packages/evershop/src/modules/customer/services/CustomerGroupCollection.js
class CustomerGroupCollection (line 5) | class CustomerGroupCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 10) | async init(args, { filters = [] }) {
method items (line 43) | async items() {
method total (line 48) | async total() {
method currentFilters (line 54) | currentFilters() {
FILE: packages/evershop/src/modules/customer/services/customer/address/addressValidators.ts
function validateAddress (line 94) | function validateAddress(address: Address): {
function addAddressValidationRule (line 107) | function addAddressValidationRule(rule: Validator<Address>): void {
FILE: packages/evershop/src/modules/customer/services/customer/address/createCustomerAddress.ts
function insertCustomerAddressData (line 16) | async function insertCustomerAddressData(
function createCustomerAddress (line 41) | async function createCustomerAddress(
FILE: packages/evershop/src/modules/customer/services/customer/address/deleteCustomerAddress.ts
function deleteCustomerAddressData (line 13) | async function deleteCustomerAddressData(uuid: string, connection: PoolC...
function deleteCustomerAddress (line 23) | async function deleteCustomerAddress(
FILE: packages/evershop/src/modules/customer/services/customer/address/updateCustomerAddress.ts
function updateCustomerAddressData (line 15) | async function updateCustomerAddressData(
function updateCustomerAddress (line 54) | async function updateCustomerAddress(
FILE: packages/evershop/src/modules/customer/services/customer/createCustomer.ts
type CustomerData (line 27) | interface CustomerData {
function validateCustomerDataBeforeInsert (line 35) | function validateCustomerDataBeforeInsert<T extends CustomerData>(data: ...
function insertCustomerData (line 55) | async function insertCustomerData<T extends CustomerData>(data: T, conne...
function createCustomer (line 67) | async function createCustomer<T extends CustomerData>(data: T, context: ...
FILE: packages/evershop/src/modules/customer/services/customer/deleteCustomer.ts
function deleteCustomerData (line 13) | async function deleteCustomerData(uuid: string, connection: PoolClient) {
function deleteCustomer (line 21) | async function deleteCustomer(uuid: string, context: Record<string, any>) {
FILE: packages/evershop/src/modules/customer/services/customer/loginCustomerWithEmail.ts
function loginCustomerWithEmail (line 10) | async function loginCustomerWithEmail(email: string, password: string) {
FILE: packages/evershop/src/modules/customer/services/customer/logoutCustomer.js
function logoutCustomer (line 4) | function logoutCustomer() {
FILE: packages/evershop/src/modules/customer/services/customer/updateCustomer.ts
function validateCustomerDataBeforeInsert (line 20) | function validateCustomerDataBeforeInsert(data: CustomerData) {
function updateCustomerData (line 37) | async function updateCustomerData(uuid: string, data: CustomerData, conn...
function updateCustomer (line 67) | async function updateCustomer(uuid: string, data: CustomerData, context:...
FILE: packages/evershop/src/modules/customer/services/customer/updatePassword.ts
function updateCustomerPassword (line 16) | async function updateCustomerPassword(
function updatePassword (line 35) | async function updatePassword(
FILE: packages/evershop/src/modules/customer/services/registerDefaultCustomerCollectionFilters.js
function registerDefaultCustomerCollectionFilters (line 4) | async function registerDefaultCustomerCollectionFilters() {
FILE: packages/evershop/src/modules/customer/services/registerDefaultCustomerGroupCollectionFilters.js
function registerDefaultCustomerGroupCollectionFilters (line 4) | async function registerDefaultCustomerGroupCollectionFilters() {
FILE: packages/evershop/src/modules/customer/services/sendResetPasswordEmail.ts
constant TEMPLATE (line 14) | const TEMPLATE = `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio...
function sendResetPasswordEmail (line 153) | async function sendResetPasswordEmail(email, existingCustomer, token) {
FILE: packages/evershop/src/modules/customer/subscribers/customer_registered/sendWelcomeEmail.ts
constant TEMPLATE (line 14) | const TEMPLATE = `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio...
function sendCustomerWelcomeEmail (line 168) | async function sendCustomerWelcomeEmail(
FILE: packages/evershop/src/modules/graphql/pages/global/[buildQuery]graphql[response].js
function graphql (line 17) | async function graphql(request, response, next) {
FILE: packages/evershop/src/modules/graphql/services/buildResolvers.js
function buildResolvers (line 9) | async function buildResolvers(isAdmin = false) {
FILE: packages/evershop/src/modules/graphql/services/buildSchema.js
function rebuildSchema (line 11) | async function rebuildSchema() {
FILE: packages/evershop/src/modules/graphql/services/buildStoreFrontSchema.js
function rebuildStoreFrontSchema (line 11) | async function rebuildStoreFrontSchema() {
FILE: packages/evershop/src/modules/graphql/services/buildTypes.js
function buildTypeDefs (line 7) | function buildTypeDefs(isAdmin = false) {
FILE: packages/evershop/src/modules/graphql/services/contextHelper.ts
function getContextValue (line 5) | function getContextValue<T>(
function setContextValue (line 25) | function setContextValue<T>(
function getContext (line 35) | function getContext(request: EvershopRequest): Record<string, any> {
function hasContextValue (line 44) | function hasContextValue(
FILE: packages/evershop/src/modules/graphql/services/graphqlErrorMessageFormat.js
function graphqlErrorMessageFormat (line 1) | function graphqlErrorMessageFormat(
FILE: packages/evershop/src/modules/oms/pages/admin/all/OmsMenuGroup.jsx
function OmsMenuGroup (line 6) | function OmsMenuGroup({ orderGrid }) {
FILE: packages/evershop/src/modules/oms/pages/admin/dashboard/Bestcustomers.jsx
function BestCustomers (line 21) | function BestCustomers({ listUrl, setting }) {
FILE: packages/evershop/src/modules/oms/pages/admin/dashboard/Bestsellers.tsx
type BestSellersProps (line 20) | interface BestSellersProps {
function BestSellers (line 38) | function BestSellers({
FILE: packages/evershop/src/modules/oms/pages/admin/dashboard/Lifetimesales.jsx
constant COLORS (line 14) | const COLORS = ['#aee9d1', '#fed3d1', '#a4e8f2'];
function LifetimeSale (line 32) | function LifetimeSale({ api }) {
FILE: packages/evershop/src/modules/oms/pages/admin/dashboard/Statistic.jsx
function SaleStatistic (line 24) | function SaleStatistic({ api }) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/Activities.jsx
function Activities (line 5) | function Activities({ order: { activities = [] } }) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/AddTrackingButton.tsx
type AddTrackingButtonProps (line 17) | interface AddTrackingButtonProps {
function AddTrackingButton (line 32) | function AddTrackingButton({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/CancelButton.tsx
type CancelButtonProps (line 18) | interface CancelButtonProps {
function CancelButton (line 31) | function CancelButton({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/Customer.tsx
type CustomerProps (line 10) | interface CustomerProps {
function Customer (line 51) | function Customer({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/CustomerNotes.tsx
type CustomerNotesProps (line 10) | interface CustomerNotesProps {
function CustomerNotes (line 15) | function CustomerNotes({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/Items.jsx
function Items (line 16) | function Items({ order: { items, shipmentStatus } }) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/Layout.jsx
function OrderEdit (line 5) | function OrderEdit() {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/MarkDeliveredButton.tsx
type MarkDeliveredButtonProps (line 5) | interface MarkDeliveredButtonProps {
function MarkDeliveredButton (line 19) | function MarkDeliveredButton({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/PageHeading.tsx
type OrderEditPageHeadingProps (line 4) | interface OrderEditPageHeadingProps {
function OrderEditPageHeading (line 11) | function OrderEditPageHeading({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/Payment.jsx
function OrderSummary (line 17) | function OrderSummary({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/ShipButton.tsx
type ShipButtonProps (line 10) | interface ShipButtonProps {
function ShipButton (line 27) | function ShipButton({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/Status.jsx
function Status (line 5) | function Status({ order: { status } }) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/TrackingButton.tsx
type TrackingButtonProps (line 4) | interface TrackingButtonProps {
function TrackingButton (line 18) | function TrackingButton({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/items/ItemVariantOptions.tsx
type ItemVariantOptionsProps (line 3) | interface ItemVariantOptionsProps {
function ItemVariantOptions (line 10) | function ItemVariantOptions({ options = [] }: ItemVariantOptionsProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/items/Name.tsx
type NameProps (line 5) | interface NameProps {
function Name (line 15) | function Name({
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/items/Price.tsx
type PriceProps (line 4) | interface PriceProps {
function Price (line 9) | function Price({ price, qty }: PriceProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/items/Thumbnail.tsx
type ThumbnailProps (line 4) | interface ThumbnailProps {
function Thumbnail (line 9) | function Thumbnail({ imageUrl, qty }: ThumbnailProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/payment/Discount.tsx
type DiscountProps (line 3) | interface DiscountProps {
function Discount (line 8) | function Discount({ discount, code }: DiscountProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/payment/Shipping.tsx
type ShippingProps (line 3) | interface ShippingProps {
function Shipping (line 8) | function Shipping({ method, cost }: ShippingProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/payment/SubTotal.tsx
type SubTotalProps (line 3) | interface SubTotalProps {
function SubTotal (line 8) | function SubTotal({ count, total }: SubTotalProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/payment/Tax.tsx
type TaxProps (line 4) | interface TaxProps {
function Tax (line 9) | function Tax({ taxClass, amount }: TaxProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderEdit/payment/Total.tsx
type TotalProps (line 3) | interface TotalProps {
function Total (line 7) | function Total({ total }: TotalProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderGrid/Grid.jsx
function Actions (line 40) | function Actions({ orders = [], selectedIds = [] }) {
function OrderGrid (line 120) | function OrderGrid({
FILE: packages/evershop/src/modules/oms/pages/admin/orderGrid/Heading.tsx
function OrderGridHeading (line 4) | function OrderGridHeading() {
FILE: packages/evershop/src/modules/oms/pages/admin/orderGrid/rows/OrderNumber.tsx
type OrderNumberProps (line 4) | interface OrderNumberProps {
function OrderNumber (line 9) | function OrderNumber({ editUrl, number }: OrderNumberProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderGrid/rows/PaymentStatus.tsx
type PaymentStatusProps (line 5) | interface PaymentStatusProps {
function PaymentStatus (line 12) | function PaymentStatus({ status }: PaymentStatusProps) {
FILE: packages/evershop/src/modules/oms/pages/admin/orderGrid/rows/ShipmentStatus.tsx
type ShipmentStatusProps (line 5) | interface ShipmentStatusProps {
function ShipmentStatus (line 12) | function ShipmentStatus({ status }: ShipmentStatusProps) {
FILE: packages/evershop/src/modules/oms/services/OrderCollection.js
class OrderCollection (line 5) | class OrderCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 11) | async init(filters = []) {
method items (line 40) | async items() {
method total (line 45) | async total() {
method currentFilters (line 51) | currentFilters() {
FILE: packages/evershop/src/modules/oms/services/addOrderActivityLog.ts
function addOrderActivityLog (line 4) | async function addOrderActivityLog(
FILE: packages/evershop/src/modules/oms/services/cancelOrder.ts
function validateStatus (line 19) | function validateStatus(paymentStatus: string, shipmentStatus: string) {
function updatePaymentStatusToCancel (line 40) | async function updatePaymentStatusToCancel(
function updateShipmentStatusToCancel (line 47) | async function updateShipmentStatusToCancel(
function reStockAfterCancel (line 54) | async function reStockAfterCancel(orderID: number, connection: PoolClien...
function cancelOrder (line 70) | async function cancelOrder(uuid: string, reason: string | undefined) {
FILE: packages/evershop/src/modules/oms/services/createShipment.ts
function createShipment (line 14) | async function createShipment(
FILE: packages/evershop/src/modules/oms/services/registerDefaultOrderCollectionFilters.js
function registerDefaultOrderCollectionFilters (line 4) | async function registerDefaultOrderCollectionFilters() {
FILE: packages/evershop/src/modules/oms/services/updateOrderStatus.ts
function getOrderStatusFlow (line 21) | function getOrderStatusFlow() {
function resolveOrderStatus (line 40) | function resolveOrderStatus(
function updateOrderStatus (line 75) | async function updateOrderStatus(
function addOrderStatusChangeEvents (line 88) | async function addOrderStatusChangeEvents(
function changeOrderStatus (line 106) | async function changeOrderStatus(
FILE: packages/evershop/src/modules/oms/services/updatePaymentStatus.ts
function validatePaymentStatusBeforeUpdate (line 15) | function validatePaymentStatusBeforeUpdate(status: string): boolean {
function changePaymentStatus (line 26) | async function changePaymentStatus(
FILE: packages/evershop/src/modules/oms/services/updateShipmentStatus.ts
function validateShipmentStatusBeforeUpdate (line 15) | function validateShipmentStatusBeforeUpdate(status: string): boolean {
function changeShipmentStatus (line 26) | async function changeShipmentStatus(
FILE: packages/evershop/src/modules/oms/subscribers/order_placed/sendOrderConfirmationEmail.ts
constant TEMPLATE (line 19) | const TEMPLATE = `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio...
function sendOrderConfirmationEmail (line 624) | async function sendOrderConfirmationEmail(
FILE: packages/evershop/src/modules/paypal/pages/admin/orderEdit/PaypalCaptureButton.tsx
type Props (line 8) | interface Props {
function PaypalCaptureButton (line 19) | function PaypalCaptureButton({
FILE: packages/evershop/src/modules/paypal/pages/admin/paymentSetting/PaypalSetting.tsx
type PaypalPaymentProps (line 13) | interface PaypalPaymentProps {
function PaypalPayment (line 23) | function PaypalPayment({
FILE: packages/evershop/src/modules/paypal/pages/frontStore/checkout/Paypal.tsx
type PaypalMethodProps (line 11) | interface PaypalMethodProps {
type PaypalLogoProps (line 18) | interface PaypalLogoProps {
function PaypalLogo (line 23) | function PaypalLogo({ width = 70, height = 30 }: PaypalLogoProps) {
function PaypalMethod (line 35) | function PaypalMethod({
FILE: packages/evershop/src/modules/paypal/pages/frontStore/paypalReturn/Error.tsx
function Error (line 4) | function Error() {
FILE: packages/evershop/src/modules/paypal/services/getApiBaseUrl.js
function getApiBaseUrl (line 3) | async function getApiBaseUrl() {
FILE: packages/evershop/src/modules/paypal/services/requester.js
function createAxiosInstance (line 6) | async function createAxiosInstance(request) {
function requestAccessToken (line 34) | async function requestAccessToken() {
FILE: packages/evershop/src/modules/paypal/services/voidPaymentTransaction.js
function voidPaymentTransaction (line 6) | async function voidPaymentTransaction(orderID) {
FILE: packages/evershop/src/modules/promotion/pages/admin/all/CouponMenuGroup.tsx
type CouponMenuGroupProps (line 5) | interface CouponMenuGroupProps {
function CatalogMenuGroup (line 9) | function CatalogMenuGroup({ couponGrid }: CouponMenuGroupProps) {
FILE: packages/evershop/src/modules/promotion/pages/admin/all/NewCouponQuickLink.tsx
type NewCouponQuickLinkProps (line 5) | interface NewCouponQuickLinkProps {
function NewProductQuickLink (line 9) | function NewProductQuickLink({
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/CustomerCondition.tsx
type CustomerConditionProps (line 15) | interface CustomerConditionProps {
function CustomerCondition (line 25) | function CustomerCondition({
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/DiscountType.tsx
type DiscountTypeProps (line 9) | interface DiscountTypeProps {
function DiscountType (line 12) | function DiscountType({ coupon }: DiscountTypeProps) {
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/General.tsx
type Coupon (line 11) | interface Coupon {
function General (line 49) | function General({ coupon }: { coupon?: Coupon }) {
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/OrderCondition.tsx
type OrderConditionProps (line 8) | interface OrderConditionProps {
function OrderCondition (line 17) | function OrderCondition({ coupon = {} }: OrderConditionProps) {
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/PageHeading.tsx
type CouponEditPageHeadingProps (line 4) | interface CouponEditPageHeadingProps {
function CouponEditPageHeading (line 9) | function CouponEditPageHeading({
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/components/BuyXGetY.tsx
type Product (line 22) | interface Product {
type Field (line 69) | interface Field {
type BuyXGetY (line 77) | interface BuyXGetY {
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/components/RequireProducts.tsx
type RequiredProduct (line 18) | interface RequiredProduct {
type RequiredProductsProps (line 26) | interface RequiredProductsProps {
type RequiredProducts (line 30) | interface RequiredProducts {
function RequiredProducts (line 36) | function RequiredProducts({
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/components/TargetProducts.tsx
type Product (line 19) | interface Product {
function Products (line 26) | function Products({
type TargetProductsProps (line 254) | interface TargetProductsProps {
function TargetProducts (line 258) | function TargetProducts({
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/components/conditionCriterias.ts
type Operator (line 1) | enum Operator {
type ConditionKey (line 12) | type ConditionKey = {
type OperatorOption (line 17) | type OperatorOption = {
FILE: packages/evershop/src/modules/promotion/pages/admin/couponEdit/CouponEditForm.tsx
type CouponEditFormProps (line 13) | interface CouponEditFormProps {
function CouponEditForm (line 17) | function CouponEditForm({
FILE: packages/evershop/src/modules/promotion/pages/admin/couponGrid/Grid.jsx
function Actions (line 40) | function Actions({ coupons = [], selectedIds = [] }) {
function CouponGrid (line 174) | function CouponGrid({
FILE: packages/evershop/src/modules/promotion/pages/admin/couponGrid/Heading.tsx
function CouponGridHeading (line 4) | function CouponGridHeading() {
FILE: packages/evershop/src/modules/promotion/pages/admin/couponGrid/NewCouponButton.tsx
type NewCouponButtonProps (line 4) | interface NewCouponButtonProps {
function NewCouponButton (line 8) | function NewCouponButton({
FILE: packages/evershop/src/modules/promotion/pages/admin/couponGrid/rows/CouponName.tsx
type CouponNameProps (line 4) | interface CouponNameProps {
function CouponName (line 9) | function CouponName({ url, name }: CouponNameProps) {
FILE: packages/evershop/src/modules/promotion/pages/admin/couponNew/CouponNewForm.tsx
type CouponNewFormProps (line 14) | interface CouponNewFormProps {
function CouponNewForm (line 18) | function CouponNewForm({ action, gridUrl }: CouponNewFormProps) {
FILE: packages/evershop/src/modules/promotion/pages/admin/navigation/CouponNewMenuItem.tsx
type CouponNewMenuItemProps (line 5) | interface CouponNewMenuItemProps {
function CouponNewMenuItem (line 9) | function CouponNewMenuItem({ url }: CouponNewMenuItemProps) {
FILE: packages/evershop/src/modules/promotion/pages/admin/navigation/CouponsMenuItem.tsx
type CouponsMenuItemProps (line 5) | interface CouponsMenuItemProps {
function CouponsMenuItem (line 9) | function CouponsMenuItem({ url }: CouponsMenuItemProps) {
FILE: packages/evershop/src/modules/promotion/services/CouponCollection.js
class CouponCollection (line 5) | class CouponCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 10) | async init(filters = []) {
method items (line 43) | async items() {
method total (line 48) | async total() {
method currentFilters (line 54) | currentFilters() {
FILE: packages/evershop/src/modules/promotion/services/coupon/createCoupon.js
function validateCouponDataBeforeInsert (line 16) | function validateCouponDataBeforeInsert(data) {
function insertCouponData (line 37) | async function insertCouponData(data, connection) {
function createCoupon (line 47) | async function createCoupon(data, context) {
FILE: packages/evershop/src/modules/promotion/services/coupon/deleteCoupon.js
function deleteCouponData (line 11) | async function deleteCouponData(uuid, connection) {
function deleteCoupon (line 20) | async function deleteCoupon(uuid, context) {
FILE: packages/evershop/src/modules/promotion/services/coupon/updateCoupon.js
function validateCouponDataBeforeInsert (line 17) | function validateCouponDataBeforeInsert(data) {
function updateCouponData (line 33) | async function updateCouponData(uuid, data, connection) {
function updateCoupon (line 64) | async function updateCoupon(uuid, data, context) {
FILE: packages/evershop/src/modules/promotion/services/couponValidator.js
function validateCoupon (line 10) | async function validateCoupon(cart, couponCode) {
FILE: packages/evershop/src/modules/promotion/services/discountCalculator.js
function calculateDiscount (line 3) | async function calculateDiscount(cart, couponCode = null) {
FILE: packages/evershop/src/modules/promotion/services/registerCartItemPromotionFields.js
function registerCartItemPromotionFields (line 4) | function registerCartItemPromotionFields(fields) {
FILE: packages/evershop/src/modules/promotion/services/registerCartPromotionFields.js
function registerCartPromotionFields (line 6) | function registerCartPromotionFields(fields) {
FILE: packages/evershop/src/modules/promotion/services/registerDefaultCalculators.js
function registerDefaultCalculators (line 6) | function registerDefaultCalculators() {
FILE: packages/evershop/src/modules/promotion/services/registerDefaultCouponCollectionFilters.js
function registerDefaultCouponCollectionFilters (line 4) | async function registerDefaultCouponCollectionFilters() {
FILE: packages/evershop/src/modules/promotion/services/registerDefaultValidators.js
function registerDefaultValidators (line 6) | function registerDefaultValidators() {
FILE: packages/evershop/src/modules/setting/pages/admin/all/PaymentSettingMenu.tsx
type PaymentSettingMenuProps (line 13) | interface PaymentSettingMenuProps {
function PaymentSettingMenu (line 17) | function PaymentSettingMenu({
FILE: packages/evershop/src/modules/setting/pages/admin/all/SettingMenuGroup.tsx
type CmsMenuGroupProps (line 5) | interface CmsMenuGroupProps {
function CmsMenuGroup (line 9) | function CmsMenuGroup({ storeSetting }: CmsMenuGroupProps) {
FILE: packages/evershop/src/modules/setting/pages/admin/all/StoreSettingMenu.tsx
type StoreSettingMenuProps (line 13) | interface StoreSettingMenuProps {
function StoreSettingMenu (line 17) | function StoreSettingMenu({
FILE: packages/evershop/src/modules/setting/pages/admin/paymentSetting/PaymentSetting.tsx
type PaymentSettingProps (line 6) | interface PaymentSettingProps {
function PaymentSetting (line 10) | function PaymentSetting({
FILE: packages/evershop/src/modules/setting/pages/admin/storeSetting/StoreSetting.tsx
type StoreSettingProps (line 174) | interface StoreSettingProps {
function StoreSetting (line 189) | function StoreSetting({
FILE: packages/evershop/src/modules/setting/services/setting.ts
type Setting (line 4) | type Setting = {
function getSetting (line 11) | async function getSetting<T>(name: string, defaultValue: T): Promise<T> {
function refreshSetting (line 23) | async function refreshSetting(): Promise<void> {
FILE: packages/evershop/src/modules/stripe/pages/admin/orderEdit/StripeCaptureButton.jsx
function StripeCaptureButton (line 10) | function StripeCaptureButton({
FILE: packages/evershop/src/modules/stripe/pages/admin/orderEdit/StripeRefundButton.tsx
type StripeRefundButtonProps (line 11) | interface StripeRefundButtonProps {
function StripeRefundButton (line 25) | function StripeRefundButton({
FILE: packages/evershop/src/modules/stripe/pages/admin/paymentSetting/StripePayment.tsx
type StripePaymentProps (line 13) | interface StripePaymentProps {
function StripePayment (line 23) | function StripePayment({
FILE: packages/evershop/src/modules/stripe/pages/frontStore/checkout/Stripe.tsx
type CheckoutFormProps (line 108) | interface CheckoutFormProps {
function CheckoutForm (line 114) | function CheckoutForm({
type StripeAppProps (line 281) | interface StripeAppProps {
type CardsProps (line 290) | interface CardsProps {
function Cards (line 295) | function Cards({ width = 24, height = 24 }: CardsProps) {
type StripeMethodProps (line 342) | interface StripeMethodProps {
function StripeMethod (line 358) | function StripeMethod({
FILE: packages/evershop/src/modules/stripe/services/cancelPayment.js
function cancelPaymentIntent (line 8) | async function cancelPaymentIntent(orderID) {
FILE: packages/evershop/src/modules/tax/pages/admin/all/TaxSettingMenu.tsx
type TaxSettingMenuProps (line 13) | interface TaxSettingMenuProps {
function TaxSettingMenu (line 17) | function TaxSettingMenu({ taxSettingUrl }: TaxSettingMenuProps) {
FILE: packages/evershop/src/modules/tax/pages/admin/taxSetting/TaxSetting.tsx
type TaxSettingProps (line 64) | interface TaxSettingProps {
function TaxSetting (line 73) | function TaxSetting({
FILE: packages/evershop/src/modules/tax/pages/admin/taxSetting/components/Rate.tsx
type TaxRate (line 11) | interface TaxRate {
type RateProps (line 23) | interface RateProps {
function Rate (line 28) | function Rate({ rate, getTaxClasses }: RateProps) {
FILE: packages/evershop/src/modules/tax/pages/admin/taxSetting/components/RateForm.tsx
type MethodFormProps (line 23) | interface MethodFormProps {
function RateForm (line 30) | function RateForm({
FILE: packages/evershop/src/modules/tax/pages/admin/taxSetting/components/Rates.tsx
type RatesProps (line 20) | interface RatesProps {
function Rates (line 25) | function Rates({ getTaxClasses, rates, addRateApi }: RatesProps) {
FILE: packages/evershop/src/modules/tax/pages/admin/taxSetting/components/TaxClass.tsx
type TaxClassProps (line 6) | interface TaxClassProps {
function TaxClass (line 15) | function TaxClass({ taxClass, getTaxClasses }: TaxClassProps) {
FILE: packages/evershop/src/modules/tax/pages/admin/taxSetting/components/TaxClassForm.tsx
type TaxClassFormProps (line 6) | interface TaxClassFormProps {
function TaxClassForm (line 12) | function TaxClassForm({
FILE: packages/evershop/src/modules/tax/pages/admin/taxSetting/components/TaxClasses.tsx
type TaxClassesProps (line 5) | interface TaxClassesProps {
function TaxClasses (line 15) | function TaxClasses({ getTaxClasses, classes }: TaxClassesProps) {
FILE: packages/evershop/src/modules/tax/services/TaxClassCollection.js
class TaxClassCollection (line 5) | class TaxClassCollection {
method constructor (line 6) | constructor(baseQuery) {
method init (line 10) | async init(args, { filters = [] }) {
method items (line 43) | async items() {
method total (line 48) | async total() {
method currentFilters (line 54) | currentFilters() {
FILE: packages/evershop/src/modules/tax/services/calculateTaxAmount.js
function calculateTaxAmount (line 3) | function calculateTaxAmount(
FILE: packages/evershop/src/modules/tax/services/getTaxPercent.js
function getTaxPercent (line 1) | function getTaxPercent(rates) {
FILE: packages/evershop/src/modules/tax/services/getTaxRates.js
function getTaxRates (line 4) | async function getTaxRates(
FILE: packages/evershop/src/modules/tax/services/registerDefaultTaxClassCollectionFilters.js
function registerDefaultTaxClassCollectionFilters (line 4) | async function registerDefaultTaxClassCollectionFilters() {
FILE: packages/evershop/src/types/apiResponse.ts
type ErrorResponse (line 1) | interface ErrorResponse {
type SuccessResponse (line 8) | interface SuccessResponse<T> {
type ApiResponse (line 13) | type ApiResponse<T> = ErrorResponse | SuccessResponse<T>;
FILE: packages/evershop/src/types/appContext.tsx
type GraphqlScalar (line 3) | type GraphqlScalar = string | number | boolean | null;
type GraphqlResponseValue (line 4) | type GraphqlResponseValue =
type Config (line 9) | interface Config {
type AppStateContextValue (line 19) | interface AppStateContextValue {
type AppContextDispatchValue (line 32) | interface AppContextDispatchValue {
FILE: packages/evershop/src/types/atLeastOne.ts
type AtLeastOne (line 1) | type AtLeastOne<T> = {
FILE: packages/evershop/src/types/checkoutData.ts
type CheckoutData (line 3) | interface CheckoutData {
FILE: packages/evershop/src/types/componentLayout.ts
type ComponentLayout (line 1) | type ComponentLayout = {
FILE: packages/evershop/src/types/cronjob.ts
type Job (line 1) | interface Job {
FILE: packages/evershop/src/types/customerAddress.ts
type CustomerAddressGraphql (line 1) | interface CustomerAddressGraphql {
type Address (line 19) | interface Address {
FILE: packages/evershop/src/types/db/index.ts
type AdminUserRow (line 23) | interface AdminUserRow {
type AdminUserInsert (line 34) | type AdminUserInsert = Omit<
type AdminUserUpdate (line 38) | type AdminUserUpdate = Partial<Omit<AdminUserRow, 'admin_user_id'>>;
type AttributeRow (line 44) | interface AttributeRow {
type AttributeInsert (line 56) | type AttributeInsert = Omit<AttributeRow, 'attribute_id' | 'uuid'>;
type AttributeUpdate (line 57) | type AttributeUpdate = Partial<Omit<AttributeRow, 'attribute_id'>>;
type AttributeGroupRow (line 63) | interface AttributeGroupRow {
type AttributeGroupInsert (line 71) | type AttributeGroupInsert = Omit<
type AttributeGroupUpdate (line 75) | type AttributeGroupUpdate = Partial<
type AttributeGroupLinkRow (line 83) | interface AttributeGroupLinkRow {
type AttributeGroupLinkInsert (line 89) | type AttributeGroupLinkInsert = Omit<
type AttributeGroupLinkUpdate (line 93) | type AttributeGroupLinkUpdate = Partial<
type AttributeOptionRow (line 101) | interface AttributeOptionRow {
type AttributeOptionInsert (line 109) | type AttributeOptionInsert = Omit<
type AttributeOptionUpdate (line 113) | type AttributeOptionUpdate = Partial<
type CartRow (line 121) | interface CartRow {
type CartInsert (line 160) | type CartInsert = Omit<
type CartUpdate (line 164) | type CartUpdate = Partial<Omit<CartRow, 'cart_id'>>;
type CartAddressRow (line 170) | interface CartAddressRow {
type CartAddressInsert (line 183) | type CartAddressInsert = Omit<
type CartAddressUpdate (line 187) | type CartAddressUpdate = Partial<
type CartItemRow (line 195) | interface CartItemRow {
type CartItemInsert (line 225) | type CartItemInsert = Omit<
type CartItemUpdate (line 229) | type CartItemUpdate = Partial<Omit<CartItemRow, 'cart_item_id'>>;
type CategoryRow (line 235) | interface CategoryRow {
type CategoryInsert (line 247) | type CategoryInsert = Omit<
type CategoryUpdate (line 251) | type CategoryUpdate = Partial<Omit<CategoryRow, 'category_id'>>;
type CategoryDescriptionRow (line 257) | interface CategoryDescriptionRow {
type CategoryDescriptionInsert (line 270) | type CategoryDescriptionInsert = Omit<
type CategoryDescriptionUpdate (line 274) | type CategoryDescriptionUpdate = Partial<
type CmsPageRow (line 282) | interface CmsPageRow {
type CmsPageInsert (line 290) | type CmsPageInsert = Omit<
type CmsPageUpdate (line 294) | type CmsPageUpdate = Partial<Omit<CmsPageRow, 'cms_page_id'>>;
type CmsPageDescriptionRow (line 300) | interface CmsPageDescriptionRow {
type CmsPageDescriptionInsert (line 311) | type CmsPageDescriptionInsert = Omit<
type CmsPageDescriptionUpdate (line 315) | type CmsPageDescriptionUpdate = Partial<
type CollectionRow (line 323) | interface CollectionRow {
type CollectionInsert (line 333) | type CollectionInsert = Omit<
type CollectionUpdate (line 337) | type CollectionUpdate = Partial<Omit<CollectionRow, 'collection_id'>>;
type CouponRow (line 343) | interface CouponRow {
type CouponInsert (line 365) | type CouponInsert = Omit<
type CouponUpdate (line 369) | type CouponUpdate = Partial<Omit<CouponRow, 'coupon_id'>>;
type CustomerRow (line 375) | interface CustomerRow {
type CustomerInsert (line 388) | type CustomerInsert = Omit<
type CustomerUpdate (line 392) | type CustomerUpdate = Partial<Omit<CustomerRow, 'customer_id'>>;
type CustomerAddressRow (line 398) | interface CustomerAddressRow {
type CustomerAddressInsert (line 415) | type CustomerAddressInsert = Omit<
type CustomerAddressUpdate (line 419) | type CustomerAddressUpdate = Partial<
type CustomerGroupRow (line 427) | interface CustomerGroupRow {
type CustomerGroupInsert (line 435) | type CustomerGroupInsert = Omit<
type CustomerGroupUpdate (line 439) | type CustomerGroupUpdate = Partial<
type EventRow (line 447) | interface EventRow {
type EventInsert (line 455) | type EventInsert = Omit<EventRow, 'event_id' | 'uuid' | 'created_at'>;
type EventUpdate (line 456) | type EventUpdate = Partial<Omit<EventRow, 'event_id'>>;
type MigrationRow (line 462) | interface MigrationRow {
type MigrationInsert (line 470) | type MigrationInsert = Omit<
type MigrationUpdate (line 474) | type MigrationUpdate = Partial<Omit<MigrationRow, 'migration_id'>>;
type OrderRow (line 480) | interface OrderRow {
type OrderInsert (line 523) | type OrderInsert = Omit<
type OrderUpdate (line 527) | type OrderUpdate = Partial<Omit<OrderRow, 'order_id'>>;
type OrderActivityRow (line 533) | interface OrderActivityRow {
type OrderActivityInsert (line 543) | type OrderActivityInsert = Omit<
type OrderActivityUpdate (line 547) | type OrderActivityUpdate = Partial<
type OrderAddressRow (line 555) | interface OrderAddressRow {
type OrderAddressInsert (line 568) | type OrderAddressInsert = Omit<
type OrderAddressUpdate (line 572) | type OrderAddressUpdate = Partial<
type OrderItemRow (line 580) | interface OrderItemRow {
type OrderItemInsert (line 610) | type OrderItemInsert = Omit<OrderItemRow, 'order_item_id' | 'uuid'>;
type OrderItemUpdate (line 611) | type OrderItemUpdate = Partial<Omit<OrderItemRow, 'order_item_id'>>;
type PaymentTransactionRow (line 617) | interface PaymentTransactionRow {
type PaymentTransactionInsert (line 630) | type PaymentTransactionInsert = Omit<
type PaymentTransactionUpdate (line 634) | type PaymentTransactionUpdate = Partial<
type ProductRow (line 642) | interface ProductRow {
type ProductInsert (line 660) | type ProductInsert = Omit<
type ProductUpdate (line 664) | type ProductUpdate = Partial<Omit<ProductRow, 'product_id'>>;
type ProductAttributeValueIndexRow (line 670) | interface ProductAttributeValueIndexRow {
type ProductAttributeValueIndexInsert (line 678) | type ProductAttributeValueIndexInsert = Omit<
type ProductAttributeValueIndexUpdate (line 682) | type ProductAttributeValueIndexUpdate = Partial<
type ProductCategoryRow (line 690) | interface ProductCategoryRow {
type ProductCategoryInsert (line 696) | type ProductCategoryInsert = Omit<
type ProductCategoryUpdate (line 700) | type ProductCategoryUpdate = Partial<
type ProductCollectionRow (line 708) | interface ProductCollectionRow {
type ProductCollectionInsert (line 714) | type ProductCollectionInsert = Omit<
type ProductCollectionUpdate (line 718) | type ProductCollectionUpdate = Partial<
type ProductCustomOptionRow (line 726) | interface ProductCustomOptionRow {
type ProductCustomOptionInsert (line 736) | type ProductCustomOptionInsert = Omit<
type ProductCustomOptionUpdate (line 740) | type ProductCustomOptionUpdate = Partial<
type ProductCustomOptionValueRow (line 748) | interface ProductCustomOptionValueRow {
type ProductCustomOptionValueInsert (line 757) | type ProductCustomOptionValueInsert = Omit<
type ProductCustomOptionValueUpdate (line 761) | type ProductCustomOptionValueUpdate = Partial<
type ProductDescriptionRow (line 769) | interface ProductDescriptionRow {
type ProductDescriptionInsert (line 781) | type ProductDescriptionInsert = Omit<
type ProductDescriptionUpdate (line 785) | type ProductDescriptionUpdate = Partial<
type ProductImageRow (line 793) | interface ProductImageRow {
type ProductImageInsert (line 803) | type ProductImageInsert = Omit<ProductImageRow, 'product_image_id'>;
type ProductImageUpdate (line 804) | type ProductImageUpdate = Partial<
type ProductInventoryRow (line 812) | interface ProductInventoryRow {
type ProductInventoryInsert (line 820) | type ProductInventoryInsert = Omit<
type ProductInventoryUpdate (line 824) | type ProductInventoryUpdate = Partial<
type ResetPasswordTokenRow (line 832) | interface ResetPasswordTokenRow {
type ResetPasswordTokenInsert (line 839) | type ResetPasswordTokenInsert = Omit<
type ResetPasswordTokenUpdate (line 843) | type ResetPasswordTokenUpdate = Partial<
type SessionRow (line 851) | interface SessionRow {
type SessionInsert (line 857) | type SessionInsert = SessionRow;
type SessionUpdate (line 858) | type SessionUpdate = Partial<Omit<SessionRow, 'sid'>>;
type SettingRow (line 864) | interface SettingRow {
type SettingInsert (line 872) | type SettingInsert = Omit<SettingRow, 'setting_id' | 'uuid'>;
type SettingUpdate (line 873) | type SettingUpdate = Partial<Omit<SettingRow, 'setting_id'>>;
type ShipmentRow (line 879) | interface ShipmentRow {
type ShipmentInsert (line 889) | type ShipmentInsert = Omit<
type ShipmentUpdate (line 893) | type ShipmentUpdate = Partial<Omit<ShipmentRow, 'shipment_id'>>;
type ShippingMethodRow (line 899) | interface ShippingMethodRow {
type ShippingMethodInsert (line 905) | type ShippingMethodInsert = Omit<
type ShippingMethodUpdate (line 909) | type ShippingMethodUpdate = Partial<
type ShippingZoneRow (line 917) | interface ShippingZoneRow {
type ShippingZoneInsert (line 924) | type ShippingZoneInsert = Omit<
type ShippingZoneUpdate (line 928) | type ShippingZoneUpdate = Partial<
type ShippingZoneMethodRow (line 936) | interface ShippingZoneMethodRow {
type ShippingZoneMethodInsert (line 950) | type ShippingZoneMethodInsert = Omit<
type ShippingZoneMethodUpdate (line 954) | type ShippingZoneMethodUpdate = Partial<
type ShippingZoneProvinceRow (line 962) | interface ShippingZoneProvinceRow {
type ShippingZoneProvinceInsert (line 969) | type ShippingZoneProvinceInsert = Omit<
type ShippingZoneProvinceUpdate (line 973) | type ShippingZoneProvinceUpdate = Partial<
type TaxClassRow (line 981) | interface TaxClassRow {
type TaxClassInsert (line 987) | type TaxClassInsert = Omit<TaxClassRow, 'tax_class_id' | 'uuid'>;
type TaxClassUpdate (line 988) | type TaxClassUpdate = Partial<Omit<TaxClassRow, 'tax_class_id'>>;
type TaxRateRow (line 994) | interface TaxRateRow {
type TaxRateInsert (line 1007) | type TaxRateInsert = Omit<TaxRateRow, 'tax_rate_id' | 'uuid'>;
type TaxRateUpdate (line 1008) | type TaxRateUpdate = Partial<Omit<TaxRateRow, 'tax_rate_id'>>;
type UrlRewriteRow (line 1014) | interface UrlRewriteRow {
type UrlRewriteInsert (line 1023) | type UrlRewriteInsert = Omit<UrlRewriteRow, 'url_rewrite_id'>;
type UrlRewriteUpdate (line 1024) | type UrlRewriteUpdate = Partial<Omit<UrlRewriteRow, 'url_rewrite_id'>>;
type VariantGroupRow (line 1030) | interface VariantGroupRow {
type VariantGroupInsert (line 1042) | type VariantGroupInsert = Omit<
type VariantGroupUpdate (line 1046) | type VariantGroupUpdate = Partial<
type WidgetRow (line 1054) | interface WidgetRow {
type WidgetInsert (line 1068) | type WidgetInsert = Omit<
type WidgetUpdate (line 1072) | type WidgetUpdate = Partial<Omit<WidgetRow, 'widget_id'>>;
type SiteRow (line 1078) | interface SiteRow {
type SiteInsert (line 1100) | type SiteInsert = Omit<
type SiteUpdate (line 1104) | type SiteUpdate = Partial<Omit<SiteRow, 'site_id'>>;
type InsertResult (line 1113) | interface InsertResult<T = Record<string, unknown>> {
type UpdateResult (line 1121) | interface UpdateResult {
type InsertResultWithRow (line 1128) | type InsertResultWithRow<T> = T & { insertId: number };
FILE: packages/evershop/src/types/event.ts
type EventDataRegistry (line 33) | interface EventDataRegistry {
type EventName (line 124) | type EventName = keyof EventDataRegistry;
type EventData (line 129) | type EventData<T extends EventName> = EventDataRegistry[T];
FILE: packages/evershop/src/types/extension.ts
type Extension (line 1) | type Extension = {
FILE: packages/evershop/src/types/graphqlFilter.ts
type GraphQLFilter (line 1) | type GraphQLFilter = {
type GraphQLFilterOperation (line 6) | type GraphQLFilterOperation =
FILE: packages/evershop/src/types/middleware.ts
type SyncMiddlewareFunction (line 5) | type SyncMiddlewareFunction<T, D> = (
type AsyncMiddlewareFunction (line 11) | type AsyncMiddlewareFunction<T, D> = (
type ErrorMiddlewareFunction (line 17) | type ErrorMiddlewareFunction = (
type SyncMiddleware (line 24) | interface SyncMiddleware<T, D> extends Middleware {
type AsyncMiddleware (line 28) | interface AsyncMiddleware<T, D> extends Middleware {
type ENext (line 34) | type ENext = (error?: Error, ...args: any[]) => void;
type MiddlewareFunction (line 36) | type MiddlewareFunction = (
type MiddlewareFunctionWrapper (line 42) | type MiddlewareFunctionWrapper = (
type ErrorMiddlewareFunctionWrapper (line 48) | type ErrorMiddlewareFunctionWrapper = (
type Middleware (line 55) | interface Middleware {
FILE: packages/evershop/src/types/order.ts
type PaymentStatus (line 1) | type PaymentStatus = {
type ShipmentStatus (line 8) | type ShipmentStatus = {
type OrderStatus (line 15) | type OrderStatus = {
FILE: packages/evershop/src/types/pageMeta.ts
type OgInfo (line 1) | interface OgInfo {
type PageMetaInfo (line 14) | interface PageMetaInfo {
FILE: packages/evershop/src/types/request.d.ts
type EvershopRequest (line 3) | interface EvershopRequest extends ExpressRequest {
FILE: packages/evershop/src/types/request.ts
type CurrentCustomer (line 4) | interface CurrentCustomer {
type CurrentUser (line 15) | interface CurrentUser {
type EvershopRequest (line 26) | interface EvershopRequest extends ExpressRequest {
FILE: packages/evershop/src/types/response.ts
type EvershopResponse (line 3) | interface EvershopResponse extends ExpressResponse {
FILE: packages/evershop/src/types/route.ts
type Route (line 1) | interface Route {
FILE: packages/evershop/src/types/widget.ts
type Widget (
Condensed preview — 1781 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,262K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 81,
"preview": "# These are supported funding model platforms\n\nopen_collective: evershopcommerce\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 734,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG]\"\nlabels: ''\nassignees: treoden\n\n---\n\n**Desc"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 617,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[FEATURE REQUEST]\"\nlabels: ''\nassignees: treod"
},
{
"path": ".github/pull_request_template.md",
"chars": 895,
"preview": "## PR Checklist\nPlease check if your PR fulfills the following requirements:\n\n- [ ] Tests for the changes have been adde"
},
{
"path": ".github/workflows/build_test.yml",
"chars": 484,
"preview": "name: Github build\n\non: [pull_request]\n\njobs:\n build:\n runs-on: ubuntu-latest\n strategy:\n matrix:\n no"
},
{
"path": ".gitignore",
"chars": 541,
"preview": "node_modules\n.env\ndist\n!packages/create-evershop-app/sample/extensions/sample/dist\n!packages/create-evershop-app/sample/"
},
{
"path": ".husky/pre-commit",
"chars": 80,
"preview": "#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\n#FORCE_COLOR=1 npm run lint"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5456,
"preview": "# Contributor Covenant Code of Conduct\r\n\r\n## Our Pledge\r\n\r\nWe as members, contributors, and leaders pledge to make parti"
},
{
"path": "CONTRIBUTING.md",
"chars": 2641,
"preview": "# Contributing to EverShop\n\nWe love your input! We want to make contributing to this project as easy and transparent as "
},
{
"path": "Dockerfile",
"chars": 321,
"preview": "FROM node:18-alpine\nWORKDIR /app\nRUN npm install -g npm@9\nCOPY package*.json .\nCOPY packages ./packages\nCOPY themes ./th"
},
{
"path": "LICENSE",
"chars": 35148,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 5227,
"preview": "<p> </p>\n<p align=\"center\">\n<img width=\"60\" height=\"68\" alt=\"EverShop Logo\" src=\"http"
},
{
"path": "docker-compose.yml",
"chars": 739,
"preview": "version: '3.8'\n\nservices:\n app:\n image: evershop/evershop:latest\n restart: always\n environment:\n DB_HOST:"
},
{
"path": "eslint.config.js",
"chars": 2808,
"preview": "// eslint.config.js\nimport eslintPluginTypescript from '@typescript-eslint/eslint-plugin';\nimport typescriptParser from "
},
{
"path": "jest.config.js",
"chars": 503,
"preview": "export default {\n testEnvironment: \"node\",\n moduleNameMapper: {\n '^@evershop/postgres-query-builder$': '<rootDir>/p"
},
{
"path": "package.json",
"chars": 2422,
"preview": "{\n \"name\": \"evershop\",\n \"version\": \"2.1.0\",\n \"type\": \"module\",\n \"description\": \"A shopping cart platform with Expres"
},
{
"path": "packages/create-evershop-app/README.md",
"chars": 381,
"preview": "# create-evershop-app\n\nThis package includes the global command for [Create EverShop App](https://evershop.io/).<br> Ple"
},
{
"path": "packages/create-evershop-app/createEverShopApp.js",
"chars": 19626,
"preview": "const https = require('https');\nconst chalk = require('chalk');\nconst commander = require('commander');\nconst dns = requ"
},
{
"path": "packages/create-evershop-app/index.js",
"chars": 419,
"preview": "#!/usr/bin/env node\n\nconst currentNodeVersion = process.versions.node;\nconst semver = currentNodeVersion.split('.');\ncon"
},
{
"path": "packages/create-evershop-app/package.json",
"chars": 854,
"preview": "{\n \"name\": \"create-evershop-app\",\n \"version\": \"2.3.0\",\n \"description\": \"Create EverShop App\",\n \"main\": \"index.js\",\n "
},
{
"path": "packages/create-evershop-app/sample/themes/sample/dist/pages/all/EveryWhere.d.ts",
"chars": 161,
"preview": "import React from 'react';\nexport default function EveryWhere(): React.JSX.Element;\nexport declare const layout: {\n a"
},
{
"path": "packages/create-evershop-app/sample/themes/sample/dist/pages/all/EveryWhere.js",
"chars": 1249,
"preview": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule"
},
{
"path": "packages/create-evershop-app/sample/themes/sample/dist/pages/all/EveryWhere.js.map",
"chars": 477,
"preview": "{\"version\":3,\"file\":\"EveryWhere.js\",\"sourceRoot\":\"\",\"sources\":[\"../../../src/pages/all/EveryWhere.tsx\"],\"names\":[],\"mapp"
},
{
"path": "packages/create-evershop-app/sample/themes/sample/dist/pages/homepage/OnlyHomePage.d.ts",
"chars": 163,
"preview": "import React from 'react';\nexport default function OnlyHomePage(): React.JSX.Element;\nexport declare const layout: {\n "
},
{
"path": "packages/create-evershop-app/sample/themes/sample/dist/pages/homepage/OnlyHomePage.js",
"chars": 1257,
"preview": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule"
},
{
"path": "packages/create-evershop-app/sample/themes/sample/dist/pages/homepage/OnlyHomePage.js.map",
"chars": 486,
"preview": "{\"version\":3,\"file\":\"OnlyHomePage.js\",\"sourceRoot\":\"\",\"sources\":[\"../../../src/pages/homepage/OnlyHomePage.tsx\"],\"names\""
},
{
"path": "packages/create-evershop-app/sample/themes/sample/package.json",
"chars": 253,
"preview": "{\n \"name\": \"sample-evershop-theme\",\n \"version\": \"1.0.0\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"test\": \"echo \\\"Erro"
},
{
"path": "packages/create-evershop-app/sample/themes/sample/src/pages/all/EveryWhere.tsx",
"chars": 740,
"preview": "import React from 'react';\n\nexport default function EveryWhere() {\n return (\n <div className=\"container mx-auto px-4"
},
{
"path": "packages/create-evershop-app/sample/themes/sample/src/pages/homepage/OnlyHomePage.tsx",
"chars": 744,
"preview": "import React from 'react';\n\nexport default function OnlyHomePage() {\n return (\n <div className=\"container mx-auto px"
},
{
"path": "packages/create-evershop-app/sample/themes/sample/tsconfig.json",
"chars": 599,
"preview": "{\n \"compilerOptions\": {\n \"module\": \"NodeNext\",\n \"target\": \"ES2018\",\n \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],"
},
{
"path": "packages/evershop/.swcrc",
"chars": 632,
"preview": "{\n \"$schema\": \"https://swc.rs/schema.json\",\n \"jsc\": {\n \"parser\": {\n \"syntax\": \"typescript\",\n \"tsx\": true,"
},
{
"path": "packages/evershop/README.md",
"chars": 4835,
"preview": "<p> </p>\n<p align=\"center\">\n<img width=\"60\" height=\"68\" alt=\"EverShop Logo\" src=\"http"
},
{
"path": "packages/evershop/package.json",
"chars": 7934,
"preview": "{\n \"name\": \"@evershop/evershop\",\n \"version\": \"2.1.1\",\n \"type\": \"module\",\n \"description\": \"The React Ecommerce platfo"
},
{
"path": "packages/evershop/scripts/postpack.js",
"chars": 927,
"preview": "import fs from 'fs';\nimport path from 'path';\nimport packageJson from '../package.json' with { type: 'json' };\n// Get th"
},
{
"path": "packages/evershop/scripts/postpublish.js",
"chars": 648,
"preview": "import fs from 'fs';\nimport path from 'path';\n\nfunction getFileRecursive(dir, files) {\n const list = fs.readdirSync(dir"
},
{
"path": "packages/evershop/scripts/prepublish.js",
"chars": 192,
"preview": "import fs from 'fs';\nimport path from 'path';\n\nfs.copyFile(\n path.resolve(__dirname, '../../README.md'),\n path.resolve"
},
{
"path": "packages/evershop/src/bin/build/client/index.js",
"chars": 607,
"preview": "import webpack from 'webpack';\nimport { error } from '../../../src/lib/log/logger';\nimport { createConfigClient } from '"
},
{
"path": "packages/evershop/src/bin/build/complie.js",
"chars": 779,
"preview": "import pkg from 'webpack';\nimport { error } from '../../lib/log/logger.js';\nimport { createConfigClient } from '../../li"
},
{
"path": "packages/evershop/src/bin/build/index.js",
"chars": 2477,
"preview": "import { existsSync, mkdirSync, rmSync } from 'fs';\nimport path from 'path';\nimport config from 'config';\nimport { CONST"
},
{
"path": "packages/evershop/src/bin/build/initEnvBuild.ts",
"chars": 106,
"preview": "import 'dotenv/config';\nprocess.env.NODE_ENV = 'production';\nprocess.env.ALLOW_CONFIG_MUTATIONS = 'true';\n"
},
{
"path": "packages/evershop/src/bin/build/server/index.js",
"chars": 655,
"preview": "import pkg from 'webpack';\nimport { error } from '../../../src/lib/log/logger.js';\nimport { createConfigServer } from '."
},
{
"path": "packages/evershop/src/bin/build/server/useDDL.js",
"chars": 7578,
"preview": "import { existsSync, rmdirSync } from 'fs';\nimport { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\nimp"
},
{
"path": "packages/evershop/src/bin/build/server/useVendorChunk.js",
"chars": 2358,
"preview": "import { existsSync, rmSync } from 'fs';\nimport path from 'path';\nimport { green, red } from 'kleur';\nimport ora from 'o"
},
{
"path": "packages/evershop/src/bin/dev/compileTs.js",
"chars": 494,
"preview": "import path from 'path';\nimport { compileSwc } from '../lib/watch/compileSwc.js';\nimport { getSrcPaths } from '../lib/wa"
},
{
"path": "packages/evershop/src/bin/dev/enableWatcher.js",
"chars": 842,
"preview": "import { subscribe } from '@parcel/watcher';\nimport { CONSTANTS } from '../../lib/helpers.js';\nimport { watchHandler } f"
},
{
"path": "packages/evershop/src/bin/dev/hooks.js",
"chars": 855,
"preview": "import { isBuiltin } from 'node:module';\nimport path, { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:"
},
{
"path": "packages/evershop/src/bin/dev/index.ts",
"chars": 1074,
"preview": "import path from 'path';\nimport { fileURLToPath } from 'url';\nimport spawn from 'cross-spawn';\nimport { debug, error } f"
},
{
"path": "packages/evershop/src/bin/dev/init.ts",
"chars": 921,
"preview": "import './register.js';\nimport './initEnvDev.js';\nimport { debug, error } from '../../lib/log/logger.js';\nimport { start"
},
{
"path": "packages/evershop/src/bin/dev/initEnvDev.ts",
"chars": 107,
"preview": "import 'dotenv/config';\nprocess.env.NODE_ENV = 'development';\nprocess.env.ALLOW_CONFIG_MUTATIONS = 'true';\n"
},
{
"path": "packages/evershop/src/bin/dev/register.js",
"chars": 473,
"preview": "import { register } from 'node:module';\nimport { MessageChannel } from 'node:worker_threads';\nexport const maps = new Ma"
},
{
"path": "packages/evershop/src/bin/evershop.js",
"chars": 1419,
"preview": "#!/usr/bin/env node\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nconst { argv } = yargs(hideBin("
},
{
"path": "packages/evershop/src/bin/extension/index.ts",
"chars": 2862,
"preview": "import { existsSync } from 'fs';\nimport { resolve } from 'path';\nimport { CONSTANTS } from '../../lib/helpers.js';\nimpor"
},
{
"path": "packages/evershop/src/bin/install/createMigrationTable.js",
"chars": 585,
"preview": "import { execute } from '@evershop/postgres-query-builder';\n\nexport async function createMigrationTable(connection) {\n "
},
{
"path": "packages/evershop/src/bin/install/index.js",
"chars": 8686,
"preview": "import { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\nimport {\n commit,\n execute,\n insertOnUpdate,"
},
{
"path": "packages/evershop/src/bin/install/templates/config.json",
"chars": 281,
"preview": "{\n \"shop\": {\n \"currency\": \"USD\",\n \"language\": \"en\",\n \"weightUnit\": \"kg\",\n \"timezone\": \"UTC\"\n },\n \"system\""
},
{
"path": "packages/evershop/src/bin/lib/addDefaultMiddlewareFuncs.ts",
"chars": 8003,
"preview": "import { select } from '@evershop/postgres-query-builder';\nimport sessionStorage from 'connect-pg-simple';\nimport cookie"
},
{
"path": "packages/evershop/src/bin/lib/app.js",
"chars": 2264,
"preview": "import express from 'express';\nimport { error } from '../../lib/log/logger.js';\nimport { Handler } from '../../lib/middl"
},
{
"path": "packages/evershop/src/bin/lib/bootstrap/bootstrap.ts",
"chars": 1044,
"preview": "import { existsSync } from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\ninterface Module {\n pat"
},
{
"path": "packages/evershop/src/bin/lib/bootstrap/migrate.js",
"chars": 2995,
"preview": "import { existsSync, readdirSync } from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport {\n c"
},
{
"path": "packages/evershop/src/bin/lib/buildEntry.js",
"chars": 5519,
"preview": "import fs from 'fs';\nimport { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\nimport { pathToFileURL } f"
},
{
"path": "packages/evershop/src/bin/lib/devEnvHelper.ts",
"chars": 1929,
"preview": "import webpack from 'webpack';\nimport middleware from 'webpack-dev-middleware';\nimport webpackHotMiddleware from 'webpac"
},
{
"path": "packages/evershop/src/bin/lib/loadModules.js",
"chars": 2583,
"preview": "import { readdirSync } from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = file"
},
{
"path": "packages/evershop/src/bin/lib/normalizePort.js",
"chars": 263,
"preview": "/**\n * Normalize a port into a number, string, or false.\n */\nexport function normalizePort() {\n const port = parseInt(p"
},
{
"path": "packages/evershop/src/bin/lib/onError.js",
"chars": 677,
"preview": "import { error } from '../../lib/log/logger.js';\nimport { normalizePort } from './normalizePort.js';\n\nconst port = norma"
},
{
"path": "packages/evershop/src/bin/lib/onListening.js",
"chars": 532,
"preview": "import boxen from 'boxen';\nimport kleur from 'kleur';\nimport { normalizePort } from './normalizePort.js';\n\nconst port = "
},
{
"path": "packages/evershop/src/bin/lib/prepare.js",
"chars": 2057,
"preview": "import { getAdminRoutes } from '../../src/lib/router/Router.js';\n\nexport function prepare(app, middlewares, routes) {\n "
},
{
"path": "packages/evershop/src/bin/lib/startCronProcess.ts",
"chars": 909,
"preview": "import path from 'path';\nimport { fileURLToPath } from 'url';\nimport spawn from 'cross-spawn';\nimport { error } from '.."
},
{
"path": "packages/evershop/src/bin/lib/startSubscriberProcess.ts",
"chars": 848,
"preview": "import path from 'path';\nimport { fileURLToPath } from 'url';\nimport spawn from 'cross-spawn';\nimport { error } from '.."
},
{
"path": "packages/evershop/src/bin/lib/startUp.js",
"chars": 3003,
"preview": "import http from 'http';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport config from 'config';\nimpo"
},
{
"path": "packages/evershop/src/bin/lib/watch/broadcast.js",
"chars": 317,
"preview": "import { getRoutes } from '../../../lib/router/Router.js';\n\nexport const broadcast = async () => {\n const routes = getR"
},
{
"path": "packages/evershop/src/bin/lib/watch/compileSwc.ts",
"chars": 1935,
"preview": "import fs, { promises as fsp } from 'fs';\nimport type { PathLike } from 'fs';\nimport path from 'path';\nimport { execa } "
},
{
"path": "packages/evershop/src/bin/lib/watch/effect.ts",
"chars": 7693,
"preview": "import { existsSync } from 'fs';\nimport { basename, dirname } from 'path';\nimport { Application } from 'express';\nimport"
},
{
"path": "packages/evershop/src/bin/lib/watch/getDistPaths.ts",
"chars": 149,
"preview": "import { PathLike } from 'fs';\n\nexport function getDistPaths(): PathLike[] {\n return ['dist', 'packages/evershop/dist',"
},
{
"path": "packages/evershop/src/bin/lib/watch/getRootPaths.ts",
"chars": 761,
"preview": "import { PathLike } from 'fs';\nimport path from 'path';\nimport type { Event } from './watchHandler.js';\n/**\n * Deduplica"
},
{
"path": "packages/evershop/src/bin/lib/watch/getSrcPaths.ts",
"chars": 746,
"preview": "import { PathLike } from 'fs';\nimport path from 'path';\nimport { getEnabledExtensions } from '../../../bin/extension/ind"
},
{
"path": "packages/evershop/src/bin/lib/watch/isDist.js",
"chars": 256,
"preview": "import path from 'path';\nimport { getDistPaths } from './getDistPaths.js';\n\nexport function isDist(pathName) {\n if (\n "
},
{
"path": "packages/evershop/src/bin/lib/watch/isRestartRequired.ts",
"chars": 732,
"preview": "import path from 'path';\nimport { CONSTANTS } from '../../../lib/helpers.js';\nimport { isSrc } from './isSrc.js';\nimport"
},
{
"path": "packages/evershop/src/bin/lib/watch/isSrc.js",
"chars": 250,
"preview": "import path from 'path';\nimport { getSrcPaths } from './getSrcPaths.js';\n\nexport function isSrc(pathName) {\n if (\n g"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/addAdminRoute.ts",
"chars": 730,
"preview": "import { Application } from 'express';\nimport { warning } from '../../../../lib/log/logger.js';\nimport { addRoute, hasRo"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/addApiRoute.ts",
"chars": 1490,
"preview": "import { Application } from 'express';\nimport { warning } from '../../../../lib/log/logger.js';\nimport { Handler } from "
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/addComponent.ts",
"chars": 258,
"preview": "import { Application } from 'express';\nimport { warning } from '../../../../lib/log/logger.js';\nimport { Event } from '."
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/addFrontStoreRoute.ts",
"chars": 736,
"preview": "import { Application } from 'express';\nimport { warning } from '../../../../lib/log/logger.js';\nimport { addRoute, hasRo"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/addMiddleware.ts",
"chars": 503,
"preview": "import { Application } from 'express';\nimport { warning } from '../../../../lib/log/logger.js';\nimport { Handler } from "
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/deleteARoute.ts",
"chars": 676,
"preview": "import { basename, dirname } from 'path';\nimport { Application } from 'express';\nimport { warning } from '../../../../li"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/index.ts",
"chars": 1713,
"preview": "import { Application } from 'express';\nimport { Effect } from '../effect.js';\nimport { addAdminRoute } from './addAdminR"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/removeMiddleware.ts",
"chars": 501,
"preview": "import { Application } from 'express';\nimport { warning } from '../../../../lib/log/logger.js';\nimport { Handler } from "
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/restart.ts",
"chars": 58,
"preview": "export function restartProcess() {\n process.exit(100);\n}\n"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/restartCronJob.ts",
"chars": 97,
"preview": "export function restartCronJob() {\n (process as NodeJS.EventEmitter).emit('RESTART_CRONJOB');\n}\n"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/restartSubscriber.ts",
"chars": 103,
"preview": "export function restartSubscriber() {\n (process as NodeJS.EventEmitter).emit('RESTART_SUBSCRIBER');\n}\n"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/touch.js",
"chars": 379,
"preview": "import { resolve } from 'path';\nimport touch from 'touch';\nimport { CONSTANTS } from '../../../../lib/helpers.js';\n\nexpo"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/updateAdminRoute.ts",
"chars": 658,
"preview": "import { dirname, join } from 'path';\nimport { Application } from 'express';\nimport { warning } from '../../../../lib/lo"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/updateApiRoute.ts",
"chars": 656,
"preview": "import { dirname, join } from 'path';\nimport { Application } from 'express';\nimport { warning } from '../../../../lib/lo"
},
{
"path": "packages/evershop/src/bin/lib/watch/processors/updateFrontStoreRoute.ts",
"chars": 664,
"preview": "import { dirname, join } from 'path';\nimport { Application } from 'express';\nimport { warning } from '../../../../lib/lo"
},
{
"path": "packages/evershop/src/bin/lib/watch/watchHandler.ts",
"chars": 2778,
"preview": "import { PathLike, readdirSync, rmSync, statSync } from 'fs';\nimport path from 'path';\nimport { Application } from 'expr"
},
{
"path": "packages/evershop/src/bin/seed/data/attributes.json",
"chars": 982,
"preview": "[\n {\n \"attribute_code\": \"color\",\n \"attribute_name\": \"Color\",\n \"type\": \"select\",\n \"is_required\": 1,\n \"dis"
},
{
"path": "packages/evershop/src/bin/seed/data/categories.json",
"chars": 925,
"preview": "[\n {\n \"name\": \"Accessories\",\n \"url_key\": \"accessories\",\n \"description\": [\n {\n \"id\": \"r__accessorie"
},
{
"path": "packages/evershop/src/bin/seed/data/collections.json",
"chars": 2738,
"preview": "[\n {\n \"name\": \"Featured Products\",\n \"code\": \"homepage\",\n \"description\": [\n {\n \"id\": \"r__featured\","
},
{
"path": "packages/evershop/src/bin/seed/data/pages.json",
"chars": 4236,
"preview": "[\n {\n \"status\": true,\n \"url_key\": \"about-us\",\n \"name\": \"About Us\",\n \"content\": [\n {\n \"id\": \"r__"
},
{
"path": "packages/evershop/src/bin/seed/data/products.json",
"chars": 26695,
"preview": "[\n {\n \"type\": \"simple\",\n \"visibility\": true,\n \"status\": true,\n \"sku\": \"CUP-001-WHT\",\n \"name\": \"Ceramic C"
},
{
"path": "packages/evershop/src/bin/seed/data/widgets.json",
"chars": 2446,
"preview": "[\n {\n \"name\": \"Main menu\",\n \"type\": \"basic_menu\",\n \"route\": [\"all\"],\n \"area\": [\"headerMiddleLeft\"],\n \"so"
},
{
"path": "packages/evershop/src/bin/seed/imageDownloader.ts",
"chars": 3129,
"preview": "import { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport http from 'http';\nimport https from 'https';\nimpor"
},
{
"path": "packages/evershop/src/bin/seed/index.ts",
"chars": 3500,
"preview": "/* eslint-disable no-console */\nimport './initEnvDev.js';\nimport 'dotenv/config';\nimport yargs from 'yargs';\nimport { hi"
},
{
"path": "packages/evershop/src/bin/seed/initEnvDev.ts",
"chars": 62,
"preview": "import 'dotenv/config';\nprocess.env.NODE_ENV = 'development';\n"
},
{
"path": "packages/evershop/src/bin/seed/seedAttributes.ts",
"chars": 4136,
"preview": "import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { insert, select } from '@ever"
},
{
"path": "packages/evershop/src/bin/seed/seedCategories.ts",
"chars": 1330,
"preview": "import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { select } from '@evershop/pos"
},
{
"path": "packages/evershop/src/bin/seed/seedCollections.ts",
"chars": 1352,
"preview": "import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { select } from '@evershop/pos"
},
{
"path": "packages/evershop/src/bin/seed/seedImages.ts",
"chars": 2700,
"preview": "import { existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { insert, select } from '@evershop/postg"
},
{
"path": "packages/evershop/src/bin/seed/seedPages.ts",
"chars": 2324,
"preview": "import { readFileSync } from 'fs';\nimport { join } from 'path';\nimport { dirname } from 'path';\nimport { fileURLToPath }"
},
{
"path": "packages/evershop/src/bin/seed/seedProducts.ts",
"chars": 5261,
"preview": "import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { insert, select } from '@ever"
},
{
"path": "packages/evershop/src/bin/seed/seedWidgets.ts",
"chars": 4401,
"preview": "import { readFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, resolve, dirname } from 'path';\nimport { fileUR"
},
{
"path": "packages/evershop/src/bin/seed/variantGroupHelpers.ts",
"chars": 3063,
"preview": "import { insert, select } from '@evershop/postgres-query-builder';\nimport { v4 as uuidv4 } from 'uuid';\nimport { info, s"
},
{
"path": "packages/evershop/src/bin/start/index.ts",
"chars": 468,
"preview": "import './initEnvStart.js';\nimport { start } from '../lib/startUp.js';\n\nstart({\n command: 'start',\n env: 'production',"
},
{
"path": "packages/evershop/src/bin/start/initEnvStart.ts",
"chars": 106,
"preview": "import 'dotenv/config';\nprocess.env.NODE_ENV = 'production';\nprocess.env.ALLOW_CONFIG_MUTATIONS = 'true';\n"
},
{
"path": "packages/evershop/src/bin/theme/active.ts",
"chars": 3224,
"preview": "#!/usr/bin/env node\n/* eslint-disable no-console */\n\nimport { exec } from 'child_process';\nimport fs from 'fs/promises';"
},
{
"path": "packages/evershop/src/bin/theme/create.ts",
"chars": 4485,
"preview": "#!/usr/bin/env node\n/* eslint-disable no-console */\n\nimport fs from 'fs/promises';\nimport path from 'path';\nimport enqui"
},
{
"path": "packages/evershop/src/bin/theme/twizz.ts",
"chars": 12010,
"preview": "#!/usr/bin/env node\n/* eslint-disable no-console */\n\nimport fs from 'fs/promises';\nimport path from 'path';\nimport boxen"
},
{
"path": "packages/evershop/src/bin/user/changePassword.js",
"chars": 1551,
"preview": "import 'dotenv/config';\nimport { select, update } from '@evershop/postgres-query-builder';\nimport yargs from 'yargs';\nim"
},
{
"path": "packages/evershop/src/bin/user/create.js",
"chars": 1838,
"preview": "import 'dotenv/config';\nimport { insertOnUpdate } from '@evershop/postgres-query-builder';\nimport yargs from 'yargs';\nim"
},
{
"path": "packages/evershop/src/components/admin/AttributeGroupSelector.tsx",
"chars": 7355,
"preview": "import { SimplePagination } from '@components/common/SimplePagination.js';\nimport { Button } from '@components/common/ui"
},
{
"path": "packages/evershop/src/components/admin/CategorySelector.tsx",
"chars": 7280,
"preview": "import { SimplePagination } from '@components/common/SimplePagination.js';\nimport { Button } from '@components/common/ui"
},
{
"path": "packages/evershop/src/components/admin/CategoryTree.scss",
"chars": 718,
"preview": ".category-tree-container {\n background-color: #fff;\n z-index: 100;\n border-color: #c9cccf;\n padding: 10px;\n box-siz"
},
{
"path": "packages/evershop/src/components/admin/CategoryTree.tsx",
"chars": 4758,
"preview": "import React from 'react';\nimport { useQuery } from 'urql';\nimport './CategoryTree.scss';\nimport RenderIfTrue from '@com"
},
{
"path": "packages/evershop/src/components/admin/CollectionSelector.tsx",
"chars": 7016,
"preview": "import { SimplePagination } from '@components/common/SimplePagination.js';\nimport { Button } from '@components/common/ui"
},
{
"path": "packages/evershop/src/components/admin/FileBrowser.scss",
"chars": 649,
"preview": "/* FILE BROWSER */\n.file-browser {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: #fff;\n"
},
{
"path": "packages/evershop/src/components/admin/FileBrowser.tsx",
"chars": 13759,
"preview": "import { Button } from '@components/common/ui/Button.js';\nimport React from 'react';\nimport './FileBrowser.scss';\nimport"
},
{
"path": "packages/evershop/src/components/admin/FormButtons.tsx",
"chars": 899,
"preview": "import { Button } from '@components/common/ui/Button.js';\nimport React from 'react';\nimport { useFormContext } from 'rea"
},
{
"path": "packages/evershop/src/components/admin/ImageUploader.scss",
"chars": 4286,
"preview": ".image-uploader-manager img {\n max-width: 100%;\n}\n.image-uploader-manager .image-list {\n grid-template-columns: repeat"
},
{
"path": "packages/evershop/src/components/admin/ImageUploader.tsx",
"chars": 11858,
"preview": "import React from 'react';\nimport { toast } from 'react-toastify';\nimport uniqid from 'uniqid';\nimport { useQuery } from"
},
{
"path": "packages/evershop/src/components/admin/ImageUploaderSkeleton.tsx",
"chars": 3781,
"preview": "import React from 'react';\n\ninterface ImageUploaderSkeletonProps {\n itemCount?: number;\n}\n\nexport const ImageUploaderSk"
},
{
"path": "packages/evershop/src/components/admin/NavigationItem.scss",
"chars": 137,
"preview": ".nav-item {\n .menu-icon {\n padding-right: 10px;\n align-self: center;\n svg {\n width: 15px;\n height: 1"
},
{
"path": "packages/evershop/src/components/admin/NavigationItem.tsx",
"chars": 1437,
"preview": "import React from 'react';\nimport './NavigationItem.scss';\n\nexport interface NavigationItemProps {\n Icon: React.Element"
},
{
"path": "packages/evershop/src/components/admin/NavigationItemGroup.scss",
"chars": 503,
"preview": ".nav-item {\n // Open, close transition\n &.closed {\n // Close transition\n // Hide the children\n .item-group {\n"
},
{
"path": "packages/evershop/src/components/admin/NavigationItemGroup.tsx",
"chars": 1393,
"preview": "import {\n NavigationItem,\n NavigationItemProps\n} from '@components/admin/NavigationItem.js';\nimport Area from '@compon"
},
{
"path": "packages/evershop/src/components/admin/PageHeading.scss",
"chars": 267,
"preview": ".page-heading {\n margin: 1rem auto 2rem;\n h1 {\n font-size: 1.25rem;\n font-weight: 600;\n }\n}\n.breadcrum-icon {\n "
},
{
"path": "packages/evershop/src/components/admin/PageHeading.tsx",
"chars": 2046,
"preview": "import Area from '@components/common/Area.js';\nimport React from 'react';\nimport './PageHeading.scss';\n\nfunction BackIco"
},
{
"path": "packages/evershop/src/components/admin/ProductListSkeleton.tsx",
"chars": 752,
"preview": "import { Skeleton } from '@components/common/ui/Skeleton.js';\nimport React from 'react';\n\nexport const ProductListSkelet"
},
{
"path": "packages/evershop/src/components/admin/ProductSelector.tsx",
"chars": 7452,
"preview": "import { SimplePagination } from '@components/common/SimplePagination.js';\nimport { Button } from '@components/common/ui"
},
{
"path": "packages/evershop/src/components/admin/SettingMenu.tsx",
"chars": 250,
"preview": "import Area from '@components/common/Area.js';\nimport React from 'react';\n\nexport function SettingMenu() {\n return (\n "
},
{
"path": "packages/evershop/src/components/admin/Spinner.jsx",
"chars": 923,
"preview": "import PropTypes from 'prop-types';\nimport React from 'react';\n\nfunction Spinner({ width, height }) {\n return (\n <sv"
},
{
"path": "packages/evershop/src/components/admin/Status.tsx",
"chars": 459,
"preview": "import { Badge } from '@components/common/ui/Badge.js';\nimport { TableCell } from '@components/common/ui/Table.js';\nimpo"
},
{
"path": "packages/evershop/src/components/admin/grid/GridPagination.tsx",
"chars": 5056,
"preview": "import { Button } from '@components/common/ui/Button.js';\nimport { ButtonGroup } from '@components/common/ui/ButtonGroup"
},
{
"path": "packages/evershop/src/components/admin/grid/Thumbnail.tsx",
"chars": 1279,
"preview": "import { Image } from '@components/common/Image.js';\nimport { TableCell } from '@components/common/ui/Table.js';\nimport "
},
{
"path": "packages/evershop/src/components/admin/grid/header/Dummy.tsx",
"chars": 301,
"preview": "import { TableCell } from '@components/common/ui/Table.js';\nimport React from 'react';\n\nexport function DummyColumnHeade"
},
{
"path": "packages/evershop/src/components/admin/grid/header/Sortable.tsx",
"chars": 3250,
"preview": "import { TableCell } from '@components/common/ui/Table.js';\nimport React from 'react';\n\nfunction Up() {\n return (\n <"
},
{
"path": "packages/evershop/src/components/common/Area.tsx",
"chars": 9672,
"preview": "import { useAppState } from '@components/common/context/app.js';\nimport { generateComponentKey } from '@evershop/eversho"
},
{
"path": "packages/evershop/src/components/common/Editor.scss",
"chars": 59,
"preview": ".prose-base {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n"
},
{
"path": "packages/evershop/src/components/common/Editor.tsx",
"chars": 5494,
"preview": "import { getColumnClasses } from '@components/common/form/editor/GetColumnClasses.js';\nimport { getRowClasses } from '@c"
},
{
"path": "packages/evershop/src/components/common/ExtendableTable.tsx",
"chars": 7313,
"preview": "import Area from '@components/common/Area.js';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n "
},
{
"path": "packages/evershop/src/components/common/Image.tsx",
"chars": 2755,
"preview": "import { parseImageSizes } from '@evershop/evershop/lib/util/parseImageSizes';\nimport React from 'react';\n\nexport type I"
},
{
"path": "packages/evershop/src/components/common/Link.tsx",
"chars": 7948,
"preview": "/* eslint-disable no-console */\nimport React from 'react';\n\n/**\n * Valid values for the crossorigin attribute based on M"
},
{
"path": "packages/evershop/src/components/common/LoadingBar.scss",
"chars": 263,
"preview": ".loading-bar {\n background: #058c8c;\n height: 4px;\n display: block;\n position: fixed;\n top: 0;\n left: 0;\n -webkit"
},
{
"path": "packages/evershop/src/components/common/LoadingBar.tsx",
"chars": 1075,
"preview": "import { useAppState } from '@components/common/context/app.js';\nimport React from 'react';\nimport './LoadingBar.scss';\n"
},
{
"path": "packages/evershop/src/components/common/Meta.tsx",
"chars": 8188,
"preview": "/* eslint-disable no-console */\nimport React from 'react';\n\ninterface BaseMetaProps {\n charset?: string;\n content?: st"
},
{
"path": "packages/evershop/src/components/common/Notification.scss",
"chars": 10171,
"preview": ".Toastify__toast-container {\n z-index: 9999;\n -webkit-transform: translate3d(0, 0, 9999px);\n position: fixed;\n paddi"
},
{
"path": "packages/evershop/src/components/common/Notification.tsx",
"chars": 899,
"preview": "import { useAppState } from '@components/common/context/app.js';\nimport { get } from '@evershop/evershop/lib/util/get';\n"
},
{
"path": "packages/evershop/src/components/common/ProductNoThumbnail.tsx",
"chars": 2161,
"preview": "import React from 'react';\n\nconst ProductNoThumbnail: React.FC<{\n width?: number;\n height?: number;\n className?: stri"
},
{
"path": "packages/evershop/src/components/common/RenderIfTrue.tsx",
"chars": 248,
"preview": "import React from 'react';\n\ninterface RenderIfTrueProps {\n condition: boolean;\n children: React.ReactNode;\n}\n\nexport d"
},
{
"path": "packages/evershop/src/components/common/Script.tsx",
"chars": 7620,
"preview": "/* eslint-disable no-console */\nimport React from 'react';\n\ninterface BaseScriptProps {\n src?: string;\n async?: boolea"
},
{
"path": "packages/evershop/src/components/common/SimplePagination.tsx",
"chars": 1615,
"preview": "import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport React from 'react';\n\ninterface SimplePaginationProps {\n"
},
{
"path": "packages/evershop/src/components/common/StaticImage.tsx",
"chars": 820,
"preview": "import { useAppState } from '@components/common/context/app.js';\nimport { Image, ImageProps } from '@components/common/I"
},
{
"path": "packages/evershop/src/components/common/Title.tsx",
"chars": 7557,
"preview": "/* eslint-disable no-console */\nimport React from 'react';\n\n/**\n * Props for the Title component\n */\nexport interface Ti"
},
{
"path": "packages/evershop/src/components/common/context/app.tsx",
"chars": 2199,
"preview": "import { produce } from 'immer';\nimport React, { useMemo } from 'react';\nimport {\n AppContextDispatchValue,\n AppStateC"
},
{
"path": "packages/evershop/src/components/common/customer/address/AddressSummary.jsx",
"chars": 1831,
"preview": "/* eslint-disable react/prop-types */\nimport Area from '@components/common/Area';\nimport React from 'react';\n\nexport fun"
},
{
"path": "packages/evershop/src/components/common/form/CheckboxField.tsx",
"chars": 6064,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/DateField.tsx",
"chars": 3080,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/DateTimeLocalField.tsx",
"chars": 3131,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/Editor.scss",
"chars": 1101,
"preview": "body .codex-editor {\n z-index: 99;\n}\n\n#rows {\n .row {\n background-color: #fff;\n }\n\n .row__container {\n &:hover"
},
{
"path": "packages/evershop/src/components/common/form/Editor.tsx",
"chars": 9940,
"preview": "import { FileBrowser } from '@components/admin/FileBrowser.js';\nimport { getColumnClasses } from '@components/common/for"
},
{
"path": "packages/evershop/src/components/common/form/EmailField.tsx",
"chars": 2989,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/FileField.tsx",
"chars": 3984,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/Form.tsx",
"chars": 4126,
"preview": "import { Button } from '@components/common/ui/Button.js';\nimport { _ } from '@evershop/evershop/lib/locale/translate/_';"
},
{
"path": "packages/evershop/src/components/common/form/InputField.tsx",
"chars": 3044,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/NumberField.tsx",
"chars": 5697,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/PasswordField.tsx",
"chars": 3722,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/RadioGroupField.tsx",
"chars": 3655,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/RangeField.tsx",
"chars": 2502,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/ReactSelectCreatableField.tsx",
"chars": 6072,
"preview": "import { getNestedError } from '@components/common/form/utils/getNestedError.js';\nimport { Field, FieldLabel } from '@co"
},
{
"path": "packages/evershop/src/components/common/form/ReactSelectField.tsx",
"chars": 4417,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/SelectField.tsx",
"chars": 4357,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/TelField.tsx",
"chars": 3028,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/TextareaField.tsx",
"chars": 2494,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/TimeField.tsx",
"chars": 3068,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/ToggleField.tsx",
"chars": 3153,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/Tooltip.tsx",
"chars": 2561,
"preview": "import React, { useState } from 'react';\n\ninterface TooltipProps {\n content: string;\n position?: 'top' | 'bottom' | 'l"
},
{
"path": "packages/evershop/src/components/common/form/UrlField.tsx",
"chars": 3235,
"preview": "import { Tooltip } from '@components/common/form/Tooltip.js';\nimport { getNestedError } from '@components/common/form/ut"
},
{
"path": "packages/evershop/src/components/common/form/editor/GetColumnClasses.tsx",
"chars": 277,
"preview": "const getColumnClasses = (size: number): string => {\n switch (size) {\n case 1:\n return 'md:col-span-1';\n cas"
},
{
"path": "packages/evershop/src/components/common/form/editor/GetRowClasses.tsx",
"chars": 361,
"preview": "const getRowClasses = (size: number): string => {\n switch (size) {\n case 1:\n return 'md:grid-cols-1';\n case "
},
{
"path": "packages/evershop/src/components/common/form/editor/RawToolWrapper.ts",
"chars": 2152,
"preview": "/**\n * Wrapper for @editorjs/raw that fixes keyboard event handling issues\n * This ensures backspace and other keys work"
},
{
"path": "packages/evershop/src/components/common/form/editor/RowTemplates.tsx",
"chars": 4794,
"preview": "import React from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getColumnClasses } from './GetColumnClasses.js'"
},
{
"path": "packages/evershop/src/components/common/form/utils/getNestedError.ts",
"chars": 937,
"preview": "/**\n * Helper function to get nested error from react-hook-form errors object\n * Handles both simple field names and nes"
},
{
"path": "packages/evershop/src/components/common/index.tsx",
"chars": 341,
"preview": "import Area from './Area.jsx';\nimport { HydrateAdmin } from './react/client/HydrateAdmin.jsx';\nimport { HydrateFrontStor"
},
{
"path": "packages/evershop/src/components/common/locale/CountryOption.jsx",
"chars": 10733,
"preview": "import PropTypes from 'prop-types';\nimport React from 'react';\n\n\nfunction CountryOptions(props) {\n const { countries, c"
},
{
"path": "packages/evershop/src/components/common/locale/CurrencyOption.jsx",
"chars": 8613,
"preview": "import PropTypes from 'prop-types';\nimport React from 'react';\n\n\nfunction CurrencyOptions(props) {\n const { currencies,"
},
{
"path": "packages/evershop/src/components/common/locale/LanguageOption.jsx",
"chars": 8224,
"preview": "import PropTypes from 'prop-types';\nimport React from 'react';\n\n\nfunction LanguageOptions(props) {\n const { languages, "
},
{
"path": "packages/evershop/src/components/common/locale/ProvinceOption.jsx",
"chars": 225672,
"preview": "import PropTypes from 'prop-types';\nimport React from 'react';\n\n\nfunction ProvinceOptions(props) {\n const { country, ch"
},
{
"path": "packages/evershop/src/components/common/locale/TimezoneOption.jsx",
"chars": 41437,
"preview": "import PropTypes from 'prop-types';\nimport React from 'react';\n\n\nfunction TimezoneOptions(props) {\n const { timezones, "
},
{
"path": "packages/evershop/src/components/common/modal/Alert.jsx",
"chars": 4122,
"preview": "import { Button } from '@components/common/ui/Button.js';\nimport { assign } from '@evershop/evershop/lib/util/assign';\ni"
},
{
"path": "packages/evershop/src/components/common/modal/Alert.scss",
"chars": 1292,
"preview": ".modal-overlay {\n position: fixed;\n top: 100%;\n left: 0;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content:"
},
{
"path": "packages/evershop/src/components/common/react/Head.jsx",
"chars": 255,
"preview": "import Area from '@components/common/Area';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport default"
},
{
"path": "packages/evershop/src/components/common/react/client/Client.tsx",
"chars": 849,
"preview": "import Area from '@components/common/Area.js';\nimport { AppProvider } from '@components/common/context/app.js';\nimport {"
}
]
// ... and 1581 more files (download for full content)
About this extraction
This page contains the full source code of the evershopcommerce/evershop GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1781 files (3.7 MB), approximately 1.1M tokens, and a symbol index with 2116 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.