├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── images │ ├── banner.png │ ├── discord_banner_github.svg │ ├── evershop-admin-demo1.png │ ├── evershop-backend-demo.png │ ├── evershop-demo-back.png │ ├── evershop-demo-front.png │ ├── evershop-logo.svg │ ├── evershop-product-detail.png │ ├── evershop-store-front-demo1.png │ ├── logo-green.png │ ├── showcase.gif │ └── sponsors │ │ └── bountyhub.png ├── pull_request_template.md └── workflows │ ├── build.yml │ └── build_test.yml ├── .gitignore ├── .husky └── pre-commit ├── .prettierignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── changelog.md ├── docker-compose.yml ├── eslint.config.js ├── jest.config.js ├── nodemon.json ├── package-lock.json ├── package.json ├── packages ├── agegate │ ├── .swcrc │ ├── package.json │ ├── src │ │ ├── api │ │ │ └── verifyAge │ │ │ │ ├── [bodyParser]verifyAge.ts │ │ │ │ ├── [context]bodyParser[auth].ts │ │ │ │ ├── payloadSchema.json │ │ │ │ └── route.json │ │ ├── graphql │ │ │ └── types │ │ │ │ └── AgeSetting │ │ │ │ ├── AgeSetting.graphql │ │ │ │ └── AgeSetting.resolvers.js │ │ └── pages │ │ │ ├── admin │ │ │ ├── ageSetting │ │ │ │ ├── AgeSetting.jsx │ │ │ │ ├── index.js │ │ │ │ └── route.json │ │ │ └── all │ │ │ │ └── AgeSettingMenu.jsx │ │ │ └── frontStore │ │ │ ├── ageGate │ │ │ ├── AgeForm.jsx │ │ │ ├── index.ts │ │ │ └── route.json │ │ │ ├── ageVerifyFailure │ │ │ ├── Content.jsx │ │ │ ├── index.ts │ │ │ └── route.json │ │ │ └── all │ │ │ └── checkAge.ts │ └── tsconfig.json ├── azure_file_storage │ ├── README.md │ ├── bootstrap.js │ ├── package.json │ ├── services │ │ ├── azureFileBrowser.js │ │ ├── azureFileDeleter.js │ │ ├── azureFileUploader.js │ │ └── azureFolderCreator.js │ └── subscribers │ │ └── product_image_added │ │ └── azureGenerateProductImageVariant.js ├── create-evershop-app │ ├── README.md │ ├── createEverShopApp.js │ ├── index.js │ └── package.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 │ │ │ │ ├── index.ts │ │ │ │ └── initEnvDev.ts │ │ │ ├── evershop.js │ │ │ ├── extension │ │ │ │ └── index.js │ │ │ ├── install │ │ │ │ ├── createMigrationTable.js │ │ │ │ ├── index.js │ │ │ │ └── templates │ │ │ │ │ └── config.json │ │ │ ├── lib │ │ │ │ ├── addDefaultMiddlewareFuncs.js │ │ │ │ ├── app.js │ │ │ │ ├── bootstrap │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ └── migrate.js │ │ │ │ ├── buildEntry.js │ │ │ │ ├── createComponents.js │ │ │ │ ├── cronjob.js │ │ │ │ ├── loadModules.js │ │ │ │ ├── normalizePort.js │ │ │ │ ├── onError.js │ │ │ │ ├── onListening.js │ │ │ │ ├── prepare.js │ │ │ │ ├── startUp.js │ │ │ │ └── watch │ │ │ │ │ ├── broadcash.js │ │ │ │ │ ├── refreshable.js │ │ │ │ │ ├── watch.js │ │ │ │ │ ├── watchComponents.js │ │ │ │ │ ├── watchMF.js │ │ │ │ │ ├── watchMR.js │ │ │ │ │ ├── watchPage.js │ │ │ │ │ └── watchSchema.js │ │ │ ├── start │ │ │ │ ├── index.ts │ │ │ │ └── initEnvStart.ts │ │ │ └── user │ │ │ │ ├── changePassword.js │ │ │ │ └── create.js │ │ ├── components │ │ │ ├── admin │ │ │ │ ├── auth │ │ │ │ │ └── AuthContext.jsx │ │ │ │ ├── catalog │ │ │ │ │ ├── attributeGrid │ │ │ │ │ │ ├── headers │ │ │ │ │ │ │ └── GroupHeader.jsx │ │ │ │ │ │ └── rows │ │ │ │ │ │ │ ├── AttributeName.jsx │ │ │ │ │ │ │ └── GroupRow.jsx │ │ │ │ │ ├── categoryGrid │ │ │ │ │ │ └── rows │ │ │ │ │ │ │ └── CategoryName.jsx │ │ │ │ │ ├── collection │ │ │ │ │ │ └── collectionEdit │ │ │ │ │ │ │ └── AddProducts.jsx │ │ │ │ │ ├── collectionGrid │ │ │ │ │ │ └── rows │ │ │ │ │ │ │ └── CollectionNameRow.jsx │ │ │ │ │ ├── productEdit │ │ │ │ │ │ ├── category │ │ │ │ │ │ │ ├── CategoryItem.jsx │ │ │ │ │ │ │ ├── CategoryTree.jsx │ │ │ │ │ │ │ └── CategoryTree.scss │ │ │ │ │ │ ├── media │ │ │ │ │ │ │ ├── ProductMediaManager.jsx │ │ │ │ │ │ │ └── ProductMediaManager.scss │ │ │ │ │ │ └── variants │ │ │ │ │ │ │ ├── CreateVariant.jsx │ │ │ │ │ │ │ ├── CreateVariantGroup.jsx │ │ │ │ │ │ │ ├── EditVariant.jsx │ │ │ │ │ │ │ ├── New.jsx │ │ │ │ │ │ │ ├── Search.jsx │ │ │ │ │ │ │ ├── SearchModal.jsx │ │ │ │ │ │ │ ├── SubmitButton.jsx │ │ │ │ │ │ │ ├── Variant.jsx │ │ │ │ │ │ │ ├── VariantModal.jsx │ │ │ │ │ │ │ ├── VariantType.jsx │ │ │ │ │ │ │ ├── Variants.jsx │ │ │ │ │ │ │ └── Variants.scss │ │ │ │ │ └── productGrid │ │ │ │ │ │ └── rows │ │ │ │ │ │ ├── PriceRow.jsx │ │ │ │ │ │ ├── ProductName.jsx │ │ │ │ │ │ ├── QtyRow.jsx │ │ │ │ │ │ └── ThumbnailRow.jsx │ │ │ │ ├── checkout │ │ │ │ │ └── shippingSetting │ │ │ │ │ │ ├── Method.jsx │ │ │ │ │ │ ├── MethodForm.jsx │ │ │ │ │ │ ├── Methods.jsx │ │ │ │ │ │ ├── PriceBasedPrice.jsx │ │ │ │ │ │ ├── WeightBasedPrice.jsx │ │ │ │ │ │ ├── Zone.jsx │ │ │ │ │ │ ├── ZoneForm.jsx │ │ │ │ │ │ └── Zones.jsx │ │ │ │ ├── cms │ │ │ │ │ ├── Card.jsx │ │ │ │ │ ├── Card.scss │ │ │ │ │ ├── NavigationItem.scss │ │ │ │ │ ├── NavigationItem.tsx │ │ │ │ │ ├── NavigationItemGroup.scss │ │ │ │ │ ├── NavigationItemGroup.tsx │ │ │ │ │ ├── PageHeading.jsx │ │ │ │ │ ├── PageHeading.scss │ │ │ │ │ ├── Title.jsx │ │ │ │ │ ├── cmsPageGrid │ │ │ │ │ │ └── rows │ │ │ │ │ │ │ ├── NameRow.jsx │ │ │ │ │ │ │ └── PageName.jsx │ │ │ │ │ ├── navigation │ │ │ │ │ │ ├── DashboardMenuItem.jsx │ │ │ │ │ │ └── PagesMenuItem.jsx │ │ │ │ │ └── widget │ │ │ │ │ │ ├── WidgetTypes.jsx │ │ │ │ │ │ └── grid │ │ │ │ │ │ └── WidgetTypeRow.jsx │ │ │ │ ├── customer │ │ │ │ │ └── customerGrid │ │ │ │ │ │ └── rows │ │ │ │ │ │ ├── CreateAt.jsx │ │ │ │ │ │ └── CustomerName.jsx │ │ │ │ ├── index.ts │ │ │ │ ├── oms │ │ │ │ │ ├── orderEdit │ │ │ │ │ │ ├── Shipment.jsx │ │ │ │ │ │ ├── items │ │ │ │ │ │ │ ├── ItemOptions.jsx │ │ │ │ │ │ │ ├── ItemVariantOptions.jsx │ │ │ │ │ │ │ ├── Name.jsx │ │ │ │ │ │ │ ├── Price.jsx │ │ │ │ │ │ │ └── Thumbnail.jsx │ │ │ │ │ │ └── payment │ │ │ │ │ │ │ ├── Discount.jsx │ │ │ │ │ │ │ ├── Shipping.jsx │ │ │ │ │ │ │ ├── SubTotal.jsx │ │ │ │ │ │ │ ├── Tax.jsx │ │ │ │ │ │ │ └── Total.jsx │ │ │ │ │ └── orderGrid │ │ │ │ │ │ ├── headers │ │ │ │ │ │ ├── OrderDateColumnHeader.jsx │ │ │ │ │ │ ├── PaymentStatusColumnHeader.jsx │ │ │ │ │ │ └── ShipmentStatusColumnHeader.jsx │ │ │ │ │ │ └── rows │ │ │ │ │ │ ├── OrderNumberRow.jsx │ │ │ │ │ │ ├── PaymentStatus.jsx │ │ │ │ │ │ ├── ShipmentStatus.jsx │ │ │ │ │ │ └── TotalRow.jsx │ │ │ │ ├── promotion │ │ │ │ │ ├── couponEdit │ │ │ │ │ │ ├── AttributeGroupConditionSelector.jsx │ │ │ │ │ │ ├── AttributeGroupSelector.jsx │ │ │ │ │ │ ├── BuyXGetY.jsx │ │ │ │ │ │ ├── CategoryConditionSelector.jsx │ │ │ │ │ │ ├── CategorySelector.jsx │ │ │ │ │ │ ├── CollectionConditionSelector.jsx │ │ │ │ │ │ ├── CollectionSelector.jsx │ │ │ │ │ │ ├── CompareKeyList.jsx │ │ │ │ │ │ ├── CompareOperatorList.jsx │ │ │ │ │ │ ├── PriceConditionSelector.jsx │ │ │ │ │ │ ├── ProductSkuSelector.jsx │ │ │ │ │ │ ├── RequireProducts.jsx │ │ │ │ │ │ ├── Setting.jsx │ │ │ │ │ │ ├── SkuConditionSelector.jsx │ │ │ │ │ │ └── TargetProducts.jsx │ │ │ │ │ └── couponGrid │ │ │ │ │ │ └── rows │ │ │ │ │ │ └── CouponName.jsx │ │ │ │ ├── setting │ │ │ │ │ ├── SettingMenu.jsx │ │ │ │ │ └── SettingMenu.scss │ │ │ │ ├── tax │ │ │ │ │ └── taxSetting │ │ │ │ │ │ ├── Rate.jsx │ │ │ │ │ │ ├── RateForm.jsx │ │ │ │ │ │ ├── Rates.jsx │ │ │ │ │ │ ├── TaxClass.jsx │ │ │ │ │ │ ├── TaxClassForm.jsx │ │ │ │ │ │ └── TaxClasses.jsx │ │ │ │ └── widgets │ │ │ │ │ ├── BasicMenuSetting.jsx │ │ │ │ │ ├── BasicMenuSetting.scss │ │ │ │ │ ├── CollectionProductsSetting.jsx │ │ │ │ │ ├── TextBlockSetting.jsx │ │ │ │ │ └── index.tsx │ │ │ ├── common │ │ │ │ ├── Area.tsx │ │ │ │ ├── Badge.jsx │ │ │ │ ├── Badge.scss │ │ │ │ ├── Body.jsx │ │ │ │ ├── BundleCss.jsx │ │ │ │ ├── BundleJs.jsx │ │ │ │ ├── CKEditor.jsx │ │ │ │ ├── CKEditor.scss │ │ │ │ ├── Circle.scss │ │ │ │ ├── Circle.tsx │ │ │ │ ├── Dot.jsx │ │ │ │ ├── Dot.scss │ │ │ │ ├── Editor.jsx │ │ │ │ ├── Link.jsx │ │ │ │ ├── LoadingBar.jsx │ │ │ │ ├── LoadingBar.scss │ │ │ │ ├── Meta.jsx │ │ │ │ ├── Notification.jsx │ │ │ │ ├── Notification.scss │ │ │ │ ├── Off.jsx │ │ │ │ ├── Off.scss │ │ │ │ ├── On.jsx │ │ │ │ ├── On.scss │ │ │ │ ├── ProductNoThumbnail.jsx │ │ │ │ ├── RenderIfTrue.jsx │ │ │ │ ├── Script.jsx │ │ │ │ ├── SimplePagination.jsx │ │ │ │ ├── Spinner.jsx │ │ │ │ ├── Title.jsx │ │ │ │ ├── context │ │ │ │ │ ├── app.jsx │ │ │ │ │ ├── checkout.jsx │ │ │ │ │ └── checkoutSteps.jsx │ │ │ │ ├── customer │ │ │ │ │ └── address │ │ │ │ │ │ └── AddressSummary.jsx │ │ │ │ ├── form │ │ │ │ │ ├── Button.jsx │ │ │ │ │ ├── Button.scss │ │ │ │ │ ├── Field.jsx │ │ │ │ │ ├── Field.scss │ │ │ │ │ ├── Form.jsx │ │ │ │ │ ├── fields │ │ │ │ │ │ ├── Checkbox.jsx │ │ │ │ │ │ ├── Checkbox.scss │ │ │ │ │ │ ├── Ckeditor.jsx │ │ │ │ │ │ ├── Ckeditor.scss │ │ │ │ │ │ ├── Date.jsx │ │ │ │ │ │ ├── Date.scss │ │ │ │ │ │ ├── DateTime.jsx │ │ │ │ │ │ ├── DateTime.scss │ │ │ │ │ │ ├── Editor.jsx │ │ │ │ │ │ ├── Editor.scss │ │ │ │ │ │ ├── Error.jsx │ │ │ │ │ │ ├── Flatpickr.jsx │ │ │ │ │ │ ├── Flatpickr.scss │ │ │ │ │ │ ├── Hidden.jsx │ │ │ │ │ │ ├── Input.jsx │ │ │ │ │ │ ├── Input.scss │ │ │ │ │ │ ├── MultiSelect.jsx │ │ │ │ │ │ ├── MultiSelect.scss │ │ │ │ │ │ ├── Password.jsx │ │ │ │ │ │ ├── Radio.jsx │ │ │ │ │ │ ├── Radio.scss │ │ │ │ │ │ ├── Select.jsx │ │ │ │ │ │ ├── Select.scss │ │ │ │ │ │ ├── Textarea.jsx │ │ │ │ │ │ ├── Textarea.scss │ │ │ │ │ │ ├── Toggle.jsx │ │ │ │ │ │ ├── Toggle.scss │ │ │ │ │ │ └── editor │ │ │ │ │ │ │ ├── FileBrowser.jsx │ │ │ │ │ │ │ ├── FileBrowser.scss │ │ │ │ │ │ │ ├── GetColumnClasses.jsx │ │ │ │ │ │ │ ├── GetRowClasses.jsx │ │ │ │ │ │ │ └── RowTemplates.jsx │ │ │ │ │ └── validator.js │ │ │ │ ├── grid │ │ │ │ │ ├── Pagination.jsx │ │ │ │ │ ├── Pagination.scss │ │ │ │ │ ├── headers │ │ │ │ │ │ ├── Action.jsx │ │ │ │ │ │ ├── Dropdown.jsx │ │ │ │ │ │ ├── Dummy.jsx │ │ │ │ │ │ ├── FromTo.jsx │ │ │ │ │ │ ├── Sortable.jsx │ │ │ │ │ │ └── Status.jsx │ │ │ │ │ └── rows │ │ │ │ │ │ ├── ActionRow.jsx │ │ │ │ │ │ ├── BasicRow.jsx │ │ │ │ │ │ ├── DateRow.jsx │ │ │ │ │ │ ├── PriceRow.jsx │ │ │ │ │ │ ├── StatusRow.jsx │ │ │ │ │ │ ├── TextRow.jsx │ │ │ │ │ │ ├── ThumbnailRow.jsx │ │ │ │ │ │ └── YesNoRow.jsx │ │ │ │ ├── index.tsx │ │ │ │ ├── list │ │ │ │ │ ├── Filter.jsx │ │ │ │ │ └── Filter.scss │ │ │ │ ├── locale │ │ │ │ │ ├── CountryOption.jsx │ │ │ │ │ ├── CurrencyOption.jsx │ │ │ │ │ ├── LanguageOption.jsx │ │ │ │ │ ├── ProvinceOption.jsx │ │ │ │ │ └── TimezoneOption.jsx │ │ │ │ ├── modal │ │ │ │ │ ├── Alert.jsx │ │ │ │ │ ├── Alert.scss │ │ │ │ │ ├── Modal.jsx │ │ │ │ │ └── useModal.js │ │ │ │ └── react │ │ │ │ │ ├── Head.jsx │ │ │ │ │ ├── client │ │ │ │ │ ├── Client.jsx │ │ │ │ │ ├── HotReload.jsx │ │ │ │ │ ├── Hydrate.jsx │ │ │ │ │ ├── HydrateAdmin.jsx │ │ │ │ │ ├── HydrateFrontStore.jsx │ │ │ │ │ └── Index.jsx │ │ │ │ │ ├── getComponents.js │ │ │ │ │ └── server │ │ │ │ │ ├── Server.jsx │ │ │ │ │ └── render.jsx │ │ │ └── frontStore │ │ │ │ ├── catalog │ │ │ │ ├── categoryView │ │ │ │ │ └── filter │ │ │ │ │ │ ├── AttributeFilter.jsx │ │ │ │ │ │ ├── CategoryFilter.jsx │ │ │ │ │ │ ├── CategoryFilter.scss │ │ │ │ │ │ ├── PriceFilter.jsx │ │ │ │ │ │ └── PriceFilter.scss │ │ │ │ └── product │ │ │ │ │ ├── list │ │ │ │ │ ├── List.jsx │ │ │ │ │ ├── Pagination.jsx │ │ │ │ │ ├── Pagination.scss │ │ │ │ │ ├── SortOptions.jsx │ │ │ │ │ ├── Sorting.jsx │ │ │ │ │ └── item │ │ │ │ │ │ ├── Name.jsx │ │ │ │ │ │ ├── Name.scss │ │ │ │ │ │ ├── Price.jsx │ │ │ │ │ │ ├── Thumbnail.jsx │ │ │ │ │ │ └── Thumbnail.scss │ │ │ │ │ └── single │ │ │ │ │ ├── Name.tsx │ │ │ │ │ ├── NoThumbnail.jsx │ │ │ │ │ ├── Price.jsx │ │ │ │ │ └── Sku.jsx │ │ │ │ ├── checkout │ │ │ │ ├── cart │ │ │ │ │ ├── Empty.jsx │ │ │ │ │ └── items │ │ │ │ │ │ ├── ItemOptions.jsx │ │ │ │ │ │ ├── ItemVariantOptions.jsx │ │ │ │ │ │ ├── Items.jsx │ │ │ │ │ │ ├── Items.scss │ │ │ │ │ │ └── Quantity.jsx │ │ │ │ ├── checkout │ │ │ │ │ ├── CheckoutButton.jsx │ │ │ │ │ ├── StepTitle.jsx │ │ │ │ │ ├── payment │ │ │ │ │ │ ├── paymentMethods │ │ │ │ │ │ │ └── Methods.jsx │ │ │ │ │ │ └── paymentStep │ │ │ │ │ │ │ ├── BillingAddress.jsx │ │ │ │ │ │ │ └── StepContent.jsx │ │ │ │ │ ├── shipment │ │ │ │ │ │ └── StepContent.jsx │ │ │ │ │ └── summary │ │ │ │ │ │ ├── Cart.jsx │ │ │ │ │ │ ├── Items.jsx │ │ │ │ │ │ ├── Items.scss │ │ │ │ │ │ └── cart │ │ │ │ │ │ ├── Discount.jsx │ │ │ │ │ │ ├── Shipping.jsx │ │ │ │ │ │ ├── Subtotal.jsx │ │ │ │ │ │ ├── Tax.jsx │ │ │ │ │ │ └── Total.jsx │ │ │ │ └── success │ │ │ │ │ └── summary │ │ │ │ │ ├── items │ │ │ │ │ ├── ItemOptions.jsx │ │ │ │ │ ├── Items.jsx │ │ │ │ │ └── Items.scss │ │ │ │ │ └── order │ │ │ │ │ ├── Discount.jsx │ │ │ │ │ ├── OrderSummary.jsx │ │ │ │ │ ├── Shipping.jsx │ │ │ │ │ ├── Subtotal.jsx │ │ │ │ │ ├── Tax.jsx │ │ │ │ │ └── Total.jsx │ │ │ │ ├── cms │ │ │ │ ├── Button.jsx │ │ │ │ ├── Button.scss │ │ │ │ ├── MetaDescription.jsx │ │ │ │ └── MetaTitle.jsx │ │ │ │ ├── cod │ │ │ │ └── CODLogo.jsx │ │ │ │ ├── customer │ │ │ │ ├── address │ │ │ │ │ └── addressForm │ │ │ │ │ │ ├── AddressForm.jsx │ │ │ │ │ │ ├── AddressFormLoadingSkeleton.jsx │ │ │ │ │ │ ├── AddressFormLoadingSkeleton.scss │ │ │ │ │ │ ├── Country.jsx │ │ │ │ │ │ ├── Index.jsx │ │ │ │ │ │ ├── NameAndTelephone.jsx │ │ │ │ │ │ ├── Province.jsx │ │ │ │ │ │ └── ProvinceAndPostcode.jsx │ │ │ │ ├── checkout │ │ │ │ │ └── Edit.jsx │ │ │ │ └── detail │ │ │ │ │ └── Order.jsx │ │ │ │ ├── index.ts │ │ │ │ ├── paypal │ │ │ │ └── PaypalLogo.jsx │ │ │ │ ├── stripe │ │ │ │ ├── StripeLogo.jsx │ │ │ │ └── checkout │ │ │ │ │ ├── CheckoutForm.jsx │ │ │ │ │ ├── CheckoutForm.scss │ │ │ │ │ └── TestCards.jsx │ │ │ │ └── widgets │ │ │ │ ├── BasicMenu.jsx │ │ │ │ ├── CollectionProducts.jsx │ │ │ │ ├── TextBlock.jsx │ │ │ │ └── index.tsx │ │ ├── lib │ │ │ ├── babel │ │ │ │ ├── config.js │ │ │ │ └── index.js │ │ │ ├── bundlee.js │ │ │ ├── componee │ │ │ │ ├── getComponentsByRoute.js │ │ │ │ ├── scanForComponents.js │ │ │ │ └── tests │ │ │ │ │ └── unit │ │ │ │ │ ├── __mocks__ │ │ │ │ │ ├── extensions │ │ │ │ │ │ ├── firstExtension │ │ │ │ │ │ │ └── pages │ │ │ │ │ │ │ │ └── frontStore │ │ │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ │ ├── Banner.js │ │ │ │ │ │ │ │ └── CommentList.js │ │ │ │ │ │ │ │ └── productView │ │ │ │ │ │ │ │ ├── Attribute.js │ │ │ │ │ │ │ │ ├── Comment.js │ │ │ │ │ │ │ │ ├── Name.js │ │ │ │ │ │ │ │ └── Price.js │ │ │ │ │ │ └── secondExtension │ │ │ │ │ │ │ └── pages │ │ │ │ │ │ │ └── frontStore │ │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ └── CommentList.jsx │ │ │ │ │ │ │ └── productView │ │ │ │ │ │ │ ├── Comment.jsx │ │ │ │ │ │ │ ├── Name.jsx │ │ │ │ │ │ │ └── Review.jsx │ │ │ │ │ ├── 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 │ │ │ ├── event │ │ │ │ ├── callSubscibers.js │ │ │ │ ├── emitter.ts │ │ │ │ ├── event-manager.js │ │ │ │ └── loadSubscribers.js │ │ │ ├── helpers.js │ │ │ ├── index.ts │ │ │ ├── locale │ │ │ │ ├── countries.ts │ │ │ │ ├── currencies.ts │ │ │ │ ├── index.ts │ │ │ │ ├── provinces.ts │ │ │ │ ├── timezones.ts │ │ │ │ └── translate │ │ │ │ │ ├── index.ts │ │ │ │ │ └── translate.ts │ │ │ ├── log │ │ │ │ ├── CustomColorize.js │ │ │ │ └── logger.js │ │ │ ├── middleware │ │ │ │ ├── Handler.js │ │ │ │ ├── addMiddleware.js │ │ │ │ ├── buildMiddlewareFunction.js │ │ │ │ ├── delegate.js │ │ │ │ ├── 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 │ │ │ │ │ │ │ ├── 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 │ │ │ │ │ │ ├── loadProduct.js │ │ │ │ │ │ └── route.json │ │ │ │ │ └── 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.js │ │ │ │ ├── multerNone.js │ │ │ │ ├── publicStatic.js │ │ │ │ ├── static.js │ │ │ │ └── themePublicStatic.js │ │ │ ├── pathToRegexp.js │ │ │ ├── postgres │ │ │ │ └── connection.ts │ │ │ ├── response │ │ │ │ └── render.js │ │ │ ├── router │ │ │ │ ├── Router.js │ │ │ │ ├── buildAbsoluteUrl.js │ │ │ │ ├── buildUrl.ts │ │ │ │ ├── index.ts │ │ │ │ ├── loadModuleRoutes.js │ │ │ │ ├── registerAdminRoute.js │ │ │ │ ├── registerFrontStoreRoute.js │ │ │ │ ├── scanForRoutes.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.js │ │ │ │ ├── camelCase.ts │ │ │ │ ├── defaultPaginationFilters.js │ │ │ │ ├── events.ts │ │ │ │ ├── filterOperationMapp.ts │ │ │ │ ├── formToJson.js │ │ │ │ ├── get.ts │ │ │ │ ├── getConfig.ts │ │ │ │ ├── getEnabledWidgets.js │ │ │ │ ├── getEnv.ts │ │ │ │ ├── hookable.ts │ │ │ │ ├── httpStatus.ts │ │ │ │ ├── index.ts │ │ │ │ ├── isAjax.ts │ │ │ │ ├── isDevelopmentMode.ts │ │ │ │ ├── isProductionMode.ts │ │ │ │ ├── isResolvable.ts │ │ │ │ ├── merge.js │ │ │ │ ├── passwordHelper.js │ │ │ │ ├── readCsvFile.js │ │ │ │ ├── registry.ts │ │ │ │ ├── tests │ │ │ │ │ └── unit │ │ │ │ │ │ ├── util.assign.test.js │ │ │ │ │ │ ├── util.get.test.js │ │ │ │ │ │ ├── util.getConfig.test.js │ │ │ │ │ │ ├── util.hookable.test.js │ │ │ │ │ │ ├── util.merge.test.js │ │ │ │ │ │ └── util.registry.test.js │ │ │ │ └── validateConfiguration.js │ │ │ └── webpack │ │ │ │ ├── createBaseConfig.js │ │ │ │ ├── dev │ │ │ │ └── createConfigClient.js │ │ │ │ ├── getRouteBuildPath.js │ │ │ │ ├── getRouteBuildSubPath.js │ │ │ │ ├── isBuildRequired.js │ │ │ │ ├── loaders │ │ │ │ ├── AreaLoader.js │ │ │ │ ├── GraphQLAPILoader.js │ │ │ │ ├── GraphqlLoader.js │ │ │ │ ├── LayoutLoader.js │ │ │ │ ├── StyleLoader.js │ │ │ │ ├── TailwindLoader.js │ │ │ │ ├── TranslationLoader.js │ │ │ │ └── loadTranslationFromCsv.ts │ │ │ │ ├── plugins │ │ │ │ ├── FileListPlugin.js │ │ │ │ ├── GraphqlPlugin.js │ │ │ │ └── Tailwindcss.js │ │ │ │ ├── prod │ │ │ │ ├── createConfigClient.js │ │ │ │ └── createConfigServer.js │ │ │ │ ├── resolveAlias.js │ │ │ │ ├── tests │ │ │ │ └── unit │ │ │ │ │ ├── extensions │ │ │ │ │ ├── extensionA │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── a │ │ │ │ │ │ │ ├── A.jsx │ │ │ │ │ │ │ └── a.scss │ │ │ │ │ │ │ ├── b │ │ │ │ │ │ │ ├── B.jsx │ │ │ │ │ │ │ ├── B.scss │ │ │ │ │ │ │ └── bb │ │ │ │ │ │ │ │ └── BB.jsx │ │ │ │ │ │ │ └── d │ │ │ │ │ │ │ ├── D.jsx │ │ │ │ │ │ │ ├── D.scss │ │ │ │ │ │ │ └── dd │ │ │ │ │ │ │ └── DD.jsx │ │ │ │ │ └── extensionB │ │ │ │ │ │ └── components │ │ │ │ │ │ ├── a │ │ │ │ │ │ ├── A.jsx │ │ │ │ │ │ └── a.scss │ │ │ │ │ │ ├── d │ │ │ │ │ │ ├── D.jsx │ │ │ │ │ │ ├── D.scss │ │ │ │ │ │ └── dd │ │ │ │ │ │ │ └── DD.jsx │ │ │ │ │ │ └── e │ │ │ │ │ │ ├── E.jsx │ │ │ │ │ │ ├── E.scss │ │ │ │ │ │ └── ee │ │ │ │ │ │ └── EE.jsx │ │ │ │ │ ├── resolveAlias.test.js │ │ │ │ │ └── theme │ │ │ │ │ └── components │ │ │ │ │ ├── a │ │ │ │ │ ├── A.jsx │ │ │ │ │ └── a.scss │ │ │ │ │ └── b │ │ │ │ │ ├── B.jsx │ │ │ │ │ ├── B.scss │ │ │ │ │ └── bb │ │ │ │ │ └── BB.jsx │ │ │ │ └── util │ │ │ │ ├── getTailwindConfig.js │ │ │ │ ├── keyGenerator.js │ │ │ │ ├── parseGraphql.js │ │ │ │ └── parseGraphqlByFile.js │ │ ├── modules │ │ │ ├── auth │ │ │ │ ├── api │ │ │ │ │ └── global │ │ │ │ │ │ ├── [context]getCurrentUser.js │ │ │ │ │ │ ├── [getCurrentUser]auth.js │ │ │ │ │ │ └── [getCurrentUser]demoAccountBlocking[auth].js │ │ │ │ ├── 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.jsx │ │ │ │ │ │ ├── LoginForm.scss │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── adminLoginJson │ │ │ │ │ │ ├── [bodyParser]logIn.js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── adminLogoutJson │ │ │ │ │ │ ├── logout.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── all │ │ │ │ │ │ ├── AdminUser.jsx │ │ │ │ │ │ ├── AdminUser.scss │ │ │ │ │ │ └── [context]auth.js │ │ │ │ └── services │ │ │ │ │ ├── getAdminSessionCookieName.js │ │ │ │ │ ├── getCookieSecret.js │ │ │ │ │ ├── getFrontStoreSessionCookieName.js │ │ │ │ │ ├── getSessionConfig.js │ │ │ │ │ ├── loginUserWithEmail.js │ │ │ │ │ └── logoutUser.js │ │ │ ├── base │ │ │ │ ├── api │ │ │ │ │ └── global │ │ │ │ │ │ ├── [apiResponse]apiErrorHandler.js │ │ │ │ │ │ ├── [auth]apiResponse[apiErrorHandler].js │ │ │ │ │ │ ├── [auth]payloadValidate.js │ │ │ │ │ │ ├── [payloadValidate]escapeHtml.js │ │ │ │ │ │ └── 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 │ │ │ │ │ │ │ └── [context]isAdmin[auth].js │ │ │ │ │ └── global │ │ │ │ │ │ ├── [auth]notFound[response].js │ │ │ │ │ │ ├── [response]errorHandler.js │ │ │ │ │ │ ├── context.js │ │ │ │ │ │ └── response[errorHandler].js │ │ │ │ └── services │ │ │ │ │ ├── escapePayload.js │ │ │ │ │ ├── getAjv.js │ │ │ │ │ ├── markSkipEscape.js │ │ │ │ │ ├── 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].js │ │ │ │ │ │ ├── createCategory[finish].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── createCollection │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── createCollection[finish].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── createProduct │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── createProduct[finish].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── 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].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateAttribute[finish].js │ │ │ │ │ ├── updateAttributeGroup │ │ │ │ │ │ ├── [bodyParser]saveGroup.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── updateCategory │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateCategory[finish].js │ │ │ │ │ ├── updateCollection │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateCollection[finish].js │ │ │ │ │ ├── updateProduct │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateProduct[finish].js │ │ │ │ │ └── variantSearch │ │ │ │ │ │ ├── loadVariants.js │ │ │ │ │ │ └── route.json │ │ │ │ ├── bootstrap.js │ │ │ │ ├── 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.js │ │ │ │ │ │ ├── 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.js │ │ │ │ │ │ ├── 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.js │ │ │ │ │ │ ├── Product.graphql │ │ │ │ │ │ ├── Product.resolvers.js │ │ │ │ │ │ └── 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 │ │ │ │ ├── pages │ │ │ │ │ ├── admin │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ ├── CatalogMenuGroup.jsx │ │ │ │ │ │ │ └── NewProductQuickLink.jsx │ │ │ │ │ │ ├── attributeEdit+attributeNew │ │ │ │ │ │ │ ├── Avaibility.jsx │ │ │ │ │ │ │ ├── FormContent.jsx │ │ │ │ │ │ │ ├── FormContent.scss │ │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ │ └── PageHeading.jsx │ │ │ │ │ │ ├── attributeEdit │ │ │ │ │ │ │ ├── AttributeEditForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── attributeGrid │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.jsx │ │ │ │ │ │ │ ├── NewAttributeButton.jsx │ │ │ │ │ │ │ ├── TypeRow.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── attributeNew │ │ │ │ │ │ │ ├── AttributeNewForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── categoryEdit+categoryNew │ │ │ │ │ │ │ ├── FormContent.jsx │ │ │ │ │ │ │ ├── FormContent.scss │ │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ │ ├── Image.jsx │ │ │ │ │ │ │ ├── Image.scss │ │ │ │ │ │ │ ├── PageHeading.jsx │ │ │ │ │ │ │ ├── Seo.jsx │ │ │ │ │ │ │ └── Status.jsx │ │ │ │ │ │ ├── categoryEdit │ │ │ │ │ │ │ ├── CategoryEditForm.jsx │ │ │ │ │ │ │ ├── Products.jsx │ │ │ │ │ │ │ ├── Products.scss │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── categoryGrid │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.jsx │ │ │ │ │ │ │ ├── NameRow.jsx │ │ │ │ │ │ │ ├── NewCategoryButton.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── categoryNew │ │ │ │ │ │ │ ├── CategoryNewForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── collectionEdit+collectionNew │ │ │ │ │ │ │ ├── FormContent.jsx │ │ │ │ │ │ │ ├── FormContent.scss │ │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ │ └── PageHeading.jsx │ │ │ │ │ │ ├── collectionEdit │ │ │ │ │ │ │ ├── CollectionEditForm.jsx │ │ │ │ │ │ │ ├── Products.jsx │ │ │ │ │ │ │ ├── Products.scss │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── collectionGrid │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.jsx │ │ │ │ │ │ │ ├── NameRow.jsx │ │ │ │ │ │ │ ├── NewCollectionButton.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── collectionNew │ │ │ │ │ │ │ ├── CollectionNewForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── productEdit+productNew │ │ │ │ │ │ │ ├── Attributes.jsx │ │ │ │ │ │ │ ├── CustomOptions.jsss │ │ │ │ │ │ │ ├── FormContent.jsx │ │ │ │ │ │ │ ├── FormContent.scss │ │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ │ ├── Inventory.jsx │ │ │ │ │ │ │ ├── Media.jsx │ │ │ │ │ │ │ ├── PageHeading.jsx │ │ │ │ │ │ │ ├── Seo.jsx │ │ │ │ │ │ │ └── Status.jsx │ │ │ │ │ │ ├── productEdit │ │ │ │ │ │ │ ├── Collection.jsx │ │ │ │ │ │ │ ├── ProductEditForm.jsx │ │ │ │ │ │ │ ├── VariantGroup.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── productGrid │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.jsx │ │ │ │ │ │ │ ├── NewProductButton.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── productNew │ │ │ │ │ │ │ ├── ProductNewForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ └── frontStore │ │ │ │ │ │ ├── all │ │ │ │ │ │ ├── SearchBox.jsx │ │ │ │ │ │ └── SearchBox.scss │ │ │ │ │ │ ├── catalogSearch │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ ├── General.scss │ │ │ │ │ │ ├── Pagination.jsx │ │ │ │ │ │ ├── Products.jsx │ │ │ │ │ │ ├── SearchPage.jsx │ │ │ │ │ │ ├── Sorting.jsx │ │ │ │ │ │ ├── [index]filters.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── categoryView │ │ │ │ │ │ ├── CategoryView.jsx │ │ │ │ │ │ ├── Filter.jsx │ │ │ │ │ │ ├── Filter.scss │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ ├── General.scss │ │ │ │ │ │ ├── Pagination.jsx │ │ │ │ │ │ ├── Products.jsx │ │ │ │ │ │ ├── Sorting.jsx │ │ │ │ │ │ ├── [index]filters.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── productView │ │ │ │ │ │ ├── Attributes.jsx │ │ │ │ │ │ ├── Description.jsx │ │ │ │ │ │ ├── Form.jsx │ │ │ │ │ │ ├── Form.scss │ │ │ │ │ │ ├── GeneralInfo.jsx │ │ │ │ │ │ ├── GeneralInfo.scss │ │ │ │ │ │ ├── Images.jsx │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ ├── Options.jsx │ │ │ │ │ │ ├── Variants.jsx │ │ │ │ │ │ ├── Variants.scss │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── 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 │ │ │ │ │ │ ├── collectionDataSchema.json │ │ │ │ │ │ ├── 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.js │ │ │ │ │ ├── category_deleted │ │ │ │ │ │ └── deleteUrlRewrite.js │ │ │ │ │ ├── category_updated │ │ │ │ │ │ └── builUrlRewrite.js │ │ │ │ │ ├── product_created │ │ │ │ │ │ └── builUrlRewrite.js │ │ │ │ │ ├── product_deleted │ │ │ │ │ │ └── deleteUrlRewrite.js │ │ │ │ │ ├── product_image_added │ │ │ │ │ │ └── localGenerateProductImageVariant.js │ │ │ │ │ └── product_updated │ │ │ │ │ │ └── buildUrlRewrite.js │ │ │ │ └── tests │ │ │ │ │ └── intergration │ │ │ │ │ └── productView.test.js │ │ │ ├── checkout │ │ │ │ ├── api │ │ │ │ │ ├── addCartAddress │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── saveAddress.js │ │ │ │ │ ├── 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 │ │ │ │ │ │ ├── [detectCurrentCart]addItemToCart.js │ │ │ │ │ │ ├── [getCurrentCustomer]detectCurrentCart.js │ │ │ │ │ │ ├── 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 │ │ │ │ │ ├── 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 │ │ │ │ │ ├── getPaymentMethods │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── sendMethods.js │ │ │ │ │ ├── getShippingMethods │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── sendMethods.js │ │ │ │ │ ├── removeCartItem │ │ │ │ │ │ ├── removeItem.js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── removeMineCartItem │ │ │ │ │ │ ├── [detectCurrentCart]removeItem.js │ │ │ │ │ │ ├── [getCurrentCustomer]detectCurrentCart.js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── updateCartItemQty │ │ │ │ │ │ ├── [bodyParser]updateQty.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── updateMineCartItemQty │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── [detectCurrentCart]updateQty.js │ │ │ │ │ │ ├── [getCurrentCustomer]detectCurrentCart.js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── 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.js │ │ │ │ ├── graphql │ │ │ │ │ └── types │ │ │ │ │ │ ├── Cart │ │ │ │ │ │ ├── Cart.graphql │ │ │ │ │ │ └── Cart.resolvers.js │ │ │ │ │ │ ├── Checkout │ │ │ │ │ │ ├── Checkout.graphql │ │ │ │ │ │ └── Checkout.resolvers.js │ │ │ │ │ │ ├── CheckoutSetting │ │ │ │ │ │ ├── CheckoutSetting.graphql │ │ │ │ │ │ └── CheckoutSetting.resolvers.js │ │ │ │ │ │ ├── Date │ │ │ │ │ │ ├── Date.graphql │ │ │ │ │ │ └── Date.resolvers.js │ │ │ │ │ │ ├── Price │ │ │ │ │ │ ├── Price.graphql │ │ │ │ │ │ └── Price.resolvers.js │ │ │ │ │ │ ├── ShippingMethod │ │ │ │ │ │ ├── ShippingMethod.graphql │ │ │ │ │ │ └── ShippingMethod.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 │ │ │ │ ├── pages │ │ │ │ │ ├── admin │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ └── ShippingSettingMenu.jsx │ │ │ │ │ │ └── shippingSetting │ │ │ │ │ │ │ ├── ShippingSetting.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ └── frontStore │ │ │ │ │ │ ├── all │ │ │ │ │ │ ├── MiniCart.jsx │ │ │ │ │ │ ├── MiniCart.scss │ │ │ │ │ │ ├── [auth]addCustomerToCart.js │ │ │ │ │ │ └── [context]detectCurrentCart[auth].js │ │ │ │ │ │ ├── cart │ │ │ │ │ │ ├── ShoppingCart.jsx │ │ │ │ │ │ ├── Summary.jsx │ │ │ │ │ │ ├── Summary.scss │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── checkout │ │ │ │ │ │ ├── Checkout.jsx │ │ │ │ │ │ ├── Checkout.scss │ │ │ │ │ │ ├── PaymentMethods.jsx │ │ │ │ │ │ ├── PaymentStep.jsx │ │ │ │ │ │ ├── ShipmentStep.jsx │ │ │ │ │ │ ├── ShippingMethods.jsx │ │ │ │ │ │ ├── ShippingNote.jsx │ │ │ │ │ │ ├── Summary.jsx │ │ │ │ │ │ ├── Summary.scss │ │ │ │ │ │ ├── SummaryMobile.jsx │ │ │ │ │ │ ├── SummaryMobile.scss │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── checkoutSuccess │ │ │ │ │ │ ├── CheckoutSuccess.jsx │ │ │ │ │ │ ├── CheckoutSuccess.scss │ │ │ │ │ │ ├── CustomerInfo.jsx │ │ │ │ │ │ ├── ShippingNote.jsx │ │ │ │ │ │ ├── Summary.jsx │ │ │ │ │ │ ├── Summary.scss │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ ├── services │ │ │ │ │ ├── addCartItem.js │ │ │ │ │ ├── cart │ │ │ │ │ │ ├── Cart.js │ │ │ │ │ │ ├── DataObject.js │ │ │ │ │ │ ├── registerCartBaseFields.js │ │ │ │ │ │ ├── registerCartItemBaseFields.js │ │ │ │ │ │ └── sortFields.js │ │ │ │ │ ├── createNewCart.js │ │ │ │ │ ├── getCartById.js │ │ │ │ │ ├── getCartByUUID.js │ │ │ │ │ ├── getCurrentCart.js │ │ │ │ │ ├── orderCreator.js │ │ │ │ │ ├── removeCartItem.js │ │ │ │ │ ├── saveCart.js │ │ │ │ │ ├── toPrice.js │ │ │ │ │ └── updateCartItemQty.js │ │ │ │ └── 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].js │ │ │ │ │ │ ├── createPage[finish].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── 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 │ │ │ │ │ │ ├── [context]multerFile[auth].js │ │ │ │ │ │ ├── [context]validatePath[multerFile].js │ │ │ │ │ │ ├── [multerFile]upload.js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── folderCreate │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── [context]validatePath[auth].js │ │ │ │ │ │ ├── createFolder.js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── imageUpload │ │ │ │ │ │ ├── [context]multerFile[auth].js │ │ │ │ │ │ ├── [context]validatePath[multerFile].js │ │ │ │ │ │ ├── [multerFile]upload.js │ │ │ │ │ │ ├── [multerFile]verifyImages[upload].js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── updateCmsPage │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updatePage[finish].js │ │ │ │ │ └── updateWidget │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── finish[apiResponse].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateWidget[finish].js │ │ │ │ ├── bootstrap.js │ │ │ │ ├── graphql │ │ │ │ │ └── types │ │ │ │ │ │ ├── CmsPage │ │ │ │ │ │ ├── CmsPage.graphql │ │ │ │ │ │ └── CmsPage.resolvers.js │ │ │ │ │ │ ├── Menu │ │ │ │ │ │ ├── Menu.graphql │ │ │ │ │ │ └── Menu.resolvers.js │ │ │ │ │ │ ├── PageInfo │ │ │ │ │ │ ├── PageInfo.graphql │ │ │ │ │ │ └── PageInfo.resolvers.js │ │ │ │ │ │ ├── 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.jsx │ │ │ │ │ │ │ ├── NotFound.jsx │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── adminStaticAsset │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── staticAssets.js │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ ├── CmsMenuGroup.jsx │ │ │ │ │ │ │ ├── CopyRight.jsx │ │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ │ ├── Layout.scss │ │ │ │ │ │ │ ├── Logo.jsx │ │ │ │ │ │ │ ├── Logo.scss │ │ │ │ │ │ │ ├── Meta.jsx │ │ │ │ │ │ │ ├── Navigation.jsx │ │ │ │ │ │ │ ├── Navigation.scss │ │ │ │ │ │ │ ├── Notification.jsx │ │ │ │ │ │ │ ├── Notification.scss │ │ │ │ │ │ │ ├── QuickLinks.jsx │ │ │ │ │ │ │ ├── SearchBox.jsx │ │ │ │ │ │ │ ├── SearchBox.scss │ │ │ │ │ │ │ ├── Version.jsx │ │ │ │ │ │ │ ├── search │ │ │ │ │ │ │ │ ├── NoResult.jsx │ │ │ │ │ │ │ │ └── Results.jsx │ │ │ │ │ │ │ └── tailwind.scss │ │ │ │ │ │ ├── cmsPageEdit+cmsPageNew │ │ │ │ │ │ │ ├── FormContent.jsx │ │ │ │ │ │ │ ├── FormContent.scss │ │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ │ ├── PageHeading.jsx │ │ │ │ │ │ │ ├── Seo.jsx │ │ │ │ │ │ │ └── Status.jsx │ │ │ │ │ │ ├── cmsPageEdit │ │ │ │ │ │ │ ├── PageEditForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── cmsPageGrid │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.jsx │ │ │ │ │ │ │ ├── NewPageButton.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── cmsPageNew │ │ │ │ │ │ │ ├── PageNewForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── dashboard │ │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ │ ├── Layout.scss │ │ │ │ │ │ │ ├── PageHeading.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── widgetEdit+widgetNew │ │ │ │ │ │ │ ├── FormContent.jsx │ │ │ │ │ │ │ ├── FormContent.scss │ │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ │ ├── PageHeading.jsx │ │ │ │ │ │ │ └── Setting.jsx │ │ │ │ │ │ ├── widgetEdit │ │ │ │ │ │ │ ├── WidgetForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── widgetGrid │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.jsx │ │ │ │ │ │ │ ├── NewWidgetButton.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── widgetNew │ │ │ │ │ │ │ ├── WidgetNewForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ │ └── typeValidate.js │ │ │ │ │ └── frontStore │ │ │ │ │ │ ├── all │ │ │ │ │ │ ├── Breadcrumb.jsx │ │ │ │ │ │ ├── Footer.jsx │ │ │ │ │ │ ├── HeadTags.jsx │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ ├── Layout.scss │ │ │ │ │ │ ├── Logo.jsx │ │ │ │ │ │ ├── Logo.scss │ │ │ │ │ │ ├── Notification.jsx │ │ │ │ │ │ ├── Notification.scss │ │ │ │ │ │ └── tailwind.scss │ │ │ │ │ │ ├── cmsPageView │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ ├── Layout.scss │ │ │ │ │ │ ├── View.jsx │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── homepage │ │ │ │ │ │ ├── meta.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── notFound │ │ │ │ │ │ ├── Meta.jsx │ │ │ │ │ │ ├── NotFound.jsx │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── staticAsset │ │ │ │ │ │ ├── [context]staticAssets[auth].js │ │ │ │ │ │ └── route.json │ │ │ │ └── services │ │ │ │ │ ├── CMSPageCollection.js │ │ │ │ │ ├── CustomMemoryStorage.js │ │ │ │ │ ├── WidgetCollection.js │ │ │ │ │ ├── browFiles.js │ │ │ │ │ ├── createFolder.js │ │ │ │ │ ├── deleteFile.js │ │ │ │ │ ├── generateFileName.js │ │ │ │ │ ├── getCmsPagesBaseQuery.js │ │ │ │ │ ├── getMulter.js │ │ │ │ │ ├── getWidgetsBaseQuery.js │ │ │ │ │ ├── page │ │ │ │ │ ├── createPage.js │ │ │ │ │ ├── deletePage.js │ │ │ │ │ ├── pageDataSchema.json │ │ │ │ │ └── updatePage.js │ │ │ │ │ ├── registerDefaultPageCollectionFilters.js │ │ │ │ │ ├── registerDefaultWidgetCollectionFilters.js │ │ │ │ │ ├── tailwind.admin.config.js │ │ │ │ │ ├── tailwind.frontStore.config.js │ │ │ │ │ ├── tests │ │ │ │ │ └── unit │ │ │ │ │ │ └── validatePath.test.js │ │ │ │ │ ├── uploadFile.js │ │ │ │ │ ├── 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 │ │ │ │ │ ├── createOrder │ │ │ │ │ │ └── [placeOrder]addOrderPlacedEvent.js │ │ │ │ │ └── getPaymentMethods │ │ │ │ │ │ └── registerCod[sendMethods].js │ │ │ │ ├── bootstrap.js │ │ │ │ ├── graphql │ │ │ │ │ └── types │ │ │ │ │ │ └── CODSetting │ │ │ │ │ │ ├── CODSetting.graphql │ │ │ │ │ │ └── CODSetting.resolvers.js │ │ │ │ └── pages │ │ │ │ │ ├── admin │ │ │ │ │ ├── orderEdit │ │ │ │ │ │ └── CaptureButton.jsx │ │ │ │ │ └── paymentSetting │ │ │ │ │ │ └── CODSetting.jsx │ │ │ │ │ └── frontStore │ │ │ │ │ └── checkout │ │ │ │ │ └── CashOnDelivery.jsx │ │ │ ├── customer │ │ │ │ ├── api │ │ │ │ │ ├── createCustomer │ │ │ │ │ │ ├── [bodyParser]createCustomer.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── createCustomerAddress │ │ │ │ │ │ ├── [bodyParser]createCustomerAddress.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── deleteCustomer │ │ │ │ │ │ ├── deleteCustomer.js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── deleteCustomerAddress │ │ │ │ │ │ ├── deleteCustomerAddress.js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── global │ │ │ │ │ │ └── [context]getCurrentCustomer[auth].js │ │ │ │ │ ├── resetPassword │ │ │ │ │ │ ├── [bodyParser]resetPassword.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── 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.js │ │ │ │ │ │ ├── CustomerSetting.graphql │ │ │ │ │ │ └── CustomerSetting.resolvers.js │ │ │ │ │ │ └── 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+customerNew │ │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ │ ├── OrderHistory.jsx │ │ │ │ │ │ │ └── PageHeading.jsx │ │ │ │ │ │ ├── customerEdit │ │ │ │ │ │ │ ├── CustomerEditForm.jsx │ │ │ │ │ │ │ ├── CustomerEditForm.scss │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── customerGrid │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ └── frontStore │ │ │ │ │ │ ├── account │ │ │ │ │ │ ├── AccountDetails.jsx │ │ │ │ │ │ ├── Addresses.jsx │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ ├── OrderHistory.jsx │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── accountEdit │ │ │ │ │ │ ├── EditForm.jsx │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── all │ │ │ │ │ │ ├── UserIcon.jsx │ │ │ │ │ │ └── [context]auth.js │ │ │ │ │ │ ├── checkout │ │ │ │ │ │ └── CustomerInfoStep.jsx │ │ │ │ │ │ ├── customerLoginJson │ │ │ │ │ │ ├── [bodyParser]login.js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── customerLogoutJson │ │ │ │ │ │ ├── logout.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── login │ │ │ │ │ │ ├── LoginForm.jsx │ │ │ │ │ │ ├── LoginForm.scss │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── register │ │ │ │ │ │ ├── RegisterForm.jsx │ │ │ │ │ │ ├── RegisterForm.scss │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── resetPasswordPage │ │ │ │ │ │ ├── ResetPasswordForm.jsx │ │ │ │ │ │ ├── ResetPasswordForm.scss │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── updatePasswordPage │ │ │ │ │ │ ├── UpdatePasswordForm.jsx │ │ │ │ │ │ ├── UpdatePasswordForm.scss │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ └── services │ │ │ │ │ ├── CustomerCollection.js │ │ │ │ │ ├── CustomerGroupCollection.js │ │ │ │ │ ├── customer │ │ │ │ │ ├── address │ │ │ │ │ │ ├── addressValidator.js │ │ │ │ │ │ ├── createCustomerAddress.js │ │ │ │ │ │ ├── deleteCustomerAddress.js │ │ │ │ │ │ └── updateCustomerAddress.js │ │ │ │ │ ├── createCustomer.js │ │ │ │ │ ├── customerDataSchema.json │ │ │ │ │ ├── deleteCustomer.js │ │ │ │ │ ├── loginCustomerWithEmail.js │ │ │ │ │ ├── logoutCustomer.js │ │ │ │ │ ├── updateCustomer.js │ │ │ │ │ └── updatePassword.js │ │ │ │ │ ├── getCustomerGroupsBaseQuery.js │ │ │ │ │ ├── getCustomersBaseQuery.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── registerDefaultCustomerCollectionFilters.js │ │ │ │ │ └── registerDefaultCustomerGroupCollectionFilters.js │ │ │ ├── graphql │ │ │ │ ├── api │ │ │ │ │ ├── adminGraphql │ │ │ │ │ │ ├── [bodyParser]graphql.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ └── route.json │ │ │ │ │ └── graphql │ │ │ │ │ │ ├── [auth]removeUser[graphql].js │ │ │ │ │ │ ├── [bodyParser]graphql.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ └── route.json │ │ │ │ ├── bootstrap.js │ │ │ │ ├── graphql │ │ │ │ │ └── types │ │ │ │ │ │ └── Query │ │ │ │ │ │ ├── Query.graphql │ │ │ │ │ │ └── Query.resolvers.js │ │ │ │ ├── pages │ │ │ │ │ └── global │ │ │ │ │ │ ├── [bodyParser]buildQuery[graphql].js │ │ │ │ │ │ ├── [buildQuery]graphql[notFound].js │ │ │ │ │ │ └── bodyParser[buildQuery].js │ │ │ │ └── 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].js │ │ │ │ │ │ ├── createShipment.js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── lifetimesales │ │ │ │ │ │ ├── loadData.js │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── markDelivered │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── markDelivered.js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── salestatistic │ │ │ │ │ │ ├── loadData.js │ │ │ │ │ │ └── route.json │ │ │ │ │ └── updateShipment │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── updateShipment.js │ │ │ │ ├── bootstrap.js │ │ │ │ ├── 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 │ │ │ │ ├── pages │ │ │ │ │ └── admin │ │ │ │ │ │ ├── all │ │ │ │ │ │ └── OmsMenuGroup.jsx │ │ │ │ │ │ ├── dashboard │ │ │ │ │ │ ├── Bestcustomers.jsx │ │ │ │ │ │ ├── Bestsellers.jsx │ │ │ │ │ │ ├── Bestsellers.scss │ │ │ │ │ │ ├── Lifetimesales.jsx │ │ │ │ │ │ ├── Lifetimesales.scss │ │ │ │ │ │ ├── Statistic.jsx │ │ │ │ │ │ └── Statistic.scss │ │ │ │ │ │ ├── orderEdit │ │ │ │ │ │ ├── Activities.jsx │ │ │ │ │ │ ├── Activities.scss │ │ │ │ │ │ ├── AddTrackingButton.jsx │ │ │ │ │ │ ├── CancelButton.jsx │ │ │ │ │ │ ├── Customer.jsx │ │ │ │ │ │ ├── CustomerNotes.jsx │ │ │ │ │ │ ├── Items.jsx │ │ │ │ │ │ ├── Items.scss │ │ │ │ │ │ ├── Layout.jsx │ │ │ │ │ │ ├── Layout.scss │ │ │ │ │ │ ├── MarkDeliveredButton.jsx │ │ │ │ │ │ ├── PageHeading.jsx │ │ │ │ │ │ ├── Payment.jsx │ │ │ │ │ │ ├── Payment.scss │ │ │ │ │ │ ├── ShipButton.jsx │ │ │ │ │ │ ├── Status.jsx │ │ │ │ │ │ ├── TrackingButton.jsx │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── orderGrid │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ ├── Heading.jsx │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ └── services │ │ │ │ │ ├── OrderCollection.js │ │ │ │ │ ├── cancelOrder.js │ │ │ │ │ ├── getOrdersBaseQuery.js │ │ │ │ │ ├── registerDefaultOrderCollectionFilters.js │ │ │ │ │ ├── updateOrderStatus.js │ │ │ │ │ ├── updatePaymentStatus.js │ │ │ │ │ └── updateShipmentStatus.js │ │ │ ├── paypal │ │ │ │ ├── api │ │ │ │ │ ├── getPaymentMethods │ │ │ │ │ │ └── registerPaypal[sendMethods].js │ │ │ │ │ ├── paypalAuthorizePayment │ │ │ │ │ │ ├── [bodyParser]authorize.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── paypalCaptureAuthorizedPayment │ │ │ │ │ │ ├── [bodyParser]capture.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ ├── paypalCapturePayment │ │ │ │ │ │ ├── [bodyParser]capture.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ └── route.json │ │ │ │ │ └── paypalCreateOrder │ │ │ │ │ │ ├── [bodyParser]createOrder.js │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── 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.jsx │ │ │ │ │ │ │ └── StripeRefundButton.jsx │ │ │ │ │ │ └── paymentSetting │ │ │ │ │ │ │ └── PaypalSetting.jsx │ │ │ │ │ └── frontStore │ │ │ │ │ │ ├── checkout │ │ │ │ │ │ └── Paypal.jsx │ │ │ │ │ │ ├── paypalCancel │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── paypalReturn │ │ │ │ │ │ ├── Error.jsx │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ └── services │ │ │ │ │ ├── getApiBaseUrl.js │ │ │ │ │ ├── requester.js │ │ │ │ │ └── voidPaymentTransaction.js │ │ │ ├── promotion │ │ │ │ ├── api │ │ │ │ │ ├── couponApply │ │ │ │ │ │ ├── [context]bodyParser[auth].js │ │ │ │ │ │ ├── [validateCouponCode]applyCoupon.js │ │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ │ ├── route.json │ │ │ │ │ │ └── validateCouponCode.js │ │ │ │ │ ├── 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.jsx │ │ │ │ │ │ │ └── NewCouponQuickLink.jsx │ │ │ │ │ │ ├── couponEdit+couponNew │ │ │ │ │ │ │ ├── CustomerCondition.jsx │ │ │ │ │ │ │ ├── DiscountType.jsx │ │ │ │ │ │ │ ├── FormContent.jsx │ │ │ │ │ │ │ ├── FormContent.scss │ │ │ │ │ │ │ ├── General.jsx │ │ │ │ │ │ │ ├── OrderCondition.jsx │ │ │ │ │ │ │ └── PageHeading.jsx │ │ │ │ │ │ ├── couponEdit │ │ │ │ │ │ │ ├── CouponEditForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── couponGrid │ │ │ │ │ │ │ ├── Grid.jsx │ │ │ │ │ │ │ ├── Heading.jsx │ │ │ │ │ │ │ ├── NewCouponButton.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ ├── couponNew │ │ │ │ │ │ │ ├── CouponNewForm.jsx │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── navigation │ │ │ │ │ │ │ ├── CouponNewMenuItem.jsx │ │ │ │ │ │ │ └── CouponsMenuItem.jsx │ │ │ │ │ └── frontStore │ │ │ │ │ │ └── cart │ │ │ │ │ │ └── Coupon.jsx │ │ │ │ └── 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].js │ │ │ │ │ │ ├── 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.jsx │ │ │ │ │ │ ├── SettingMenuGroup.jsx │ │ │ │ │ │ └── StoreSettingMenu.jsx │ │ │ │ │ │ ├── paymentSetting │ │ │ │ │ │ ├── PaymentSetting.jsx │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ │ │ └── storeSetting │ │ │ │ │ │ ├── StoreSetting.jsx │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── 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 │ │ │ │ │ ├── getPaymentMethods │ │ │ │ │ │ └── registerStripe[sendMethods].js │ │ │ │ │ ├── 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.jsx │ │ │ │ │ │ └── paymentSetting │ │ │ │ │ │ │ └── StripePayment.jsx │ │ │ │ │ └── frontStore │ │ │ │ │ │ ├── checkout │ │ │ │ │ │ └── Stripe.jsx │ │ │ │ │ │ └── stripeReturn │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── route.json │ │ │ │ └── services │ │ │ │ │ └── cancelPayment.js │ │ │ └── tax │ │ │ │ ├── api │ │ │ │ ├── createTaxClass │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ ├── createTaxClass.js │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ └── route.json │ │ │ │ ├── createTaxRate │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ ├── createTaxRate.js │ │ │ │ │ ├── payloadSchema.json │ │ │ │ │ └── route.json │ │ │ │ ├── deleteTaxRate │ │ │ │ │ ├── [context]borderParser[auth].js │ │ │ │ │ ├── deleteTaxRate.js │ │ │ │ │ └── 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.jsx │ │ │ │ │ └── taxSetting │ │ │ │ │ ├── TaxSetting.jsx │ │ │ │ │ ├── index.js │ │ │ │ │ └── route.json │ │ │ │ └── services │ │ │ │ ├── TaxClassCollection.js │ │ │ │ ├── calculateTaxAmount.js │ │ │ │ ├── getTaxPercent.js │ │ │ │ ├── getTaxRates.js │ │ │ │ ├── registerCartItemTaxPercentField.js │ │ │ │ └── registerDefaultTaxClassCollectionFilters.js │ │ └── types │ │ │ ├── index.ts │ │ │ ├── middleware.ts │ │ │ ├── request.d.ts │ │ │ ├── request.ts │ │ │ ├── response.ts │ │ │ ├── route.d.ts │ │ │ ├── route.ts │ │ │ └── widget.ts │ └── tsconfig.json ├── google_login │ ├── README.md │ ├── bootstrap.js │ ├── migration │ │ └── Version-1.0.0.js │ ├── package.json │ ├── pages │ │ └── frontStore │ │ │ ├── gauth │ │ │ ├── [auth]gAuth.js │ │ │ └── route.json │ │ │ ├── gcallback │ │ │ ├── gCallback.js │ │ │ └── route.json │ │ │ └── login │ │ │ ├── GoogleLogin.jsx │ │ │ └── GoogleLogin.scss │ └── services │ │ ├── getGoogleAuthToken.js │ │ ├── getGoogleAuthUrl.js │ │ └── getGoogleUserInfo.js ├── postgres-query-builder │ ├── LICENSE │ ├── README.md │ ├── fieldResolve.js │ ├── index.ts │ ├── isValueASQL.js │ ├── package.json │ ├── toString.js │ └── tsconfig.json ├── product_review │ ├── README.md │ ├── api │ │ ├── addReview │ │ │ ├── [context]bodyParser[auth].js │ │ │ ├── addReview.js │ │ │ ├── payloadSchema.json │ │ │ └── route.json │ │ ├── approveReview │ │ │ ├── approveReview.js │ │ │ └── route.json │ │ ├── deleteReview │ │ │ ├── deleteReview.js │ │ │ └── route.json │ │ └── unApproveReview │ │ │ ├── route.json │ │ │ └── unApproveReview.js │ ├── bootstrap.js │ ├── components │ │ ├── Rating.jsx │ │ └── Rating.scss │ ├── graphql │ │ └── types │ │ │ └── Review │ │ │ ├── Review.graphql │ │ │ └── Review.resolvers.js │ ├── migration │ │ └── Version-1.0.0.js │ ├── package.json │ ├── pages │ │ ├── admin │ │ │ ├── all │ │ │ │ └── ReviewMenuGroup.jsx │ │ │ └── reviewGrid │ │ │ │ ├── Grid.jsx │ │ │ │ ├── Heading.jsx │ │ │ │ ├── index.js │ │ │ │ ├── route.json │ │ │ │ └── row │ │ │ │ ├── CommentRow.jsx │ │ │ │ ├── IsApprovedRow.jsx │ │ │ │ ├── ProductRow.jsx │ │ │ │ ├── Rating.scss │ │ │ │ └── RatingRow.jsx │ │ └── frontStore │ │ │ └── productView │ │ │ ├── ReviewForm.jsx │ │ │ ├── Reviews.jsx │ │ │ └── Reviews.scss │ └── services │ │ ├── ReviewCollection.js │ │ ├── getReviewsBaseQuery.js │ │ └── registerDefaultReviewCollectionFilters.js ├── resend │ ├── README.md │ ├── api │ │ └── resetPassword │ │ │ └── [resetPassword]sendMail.js │ ├── bootstrap.js │ ├── email_template_examples │ │ ├── order_confirmation.html │ │ ├── reset_password.html │ │ └── welcome.html │ ├── package.json │ └── subscribers │ │ ├── customer_registered │ │ └── sendWelcomeEmail.js │ │ └── order_placed │ │ └── sendOrderConfirmationEmail.js ├── s3_file_storage │ ├── README.md │ ├── bootstrap.js │ ├── package.json │ ├── services │ │ ├── awsFileBrowser.js │ │ ├── awsFileDeleter.js │ │ ├── awsFileUploader.js │ │ └── awsFolderCreator.js │ └── subscribers │ │ └── product_image_added │ │ └── awsGenerateProductImageVariant.js └── sendgrid │ ├── README.md │ ├── api │ └── resetPassword │ │ └── [resetPassword]sendMail.js │ ├── bootstrap.js │ ├── package.json │ ├── services │ └── sendMail.js │ └── subscribers │ ├── customer_registered │ └── sendWelcomeEmail.js │ └── order_placed │ └── sendOrderConfirmationEmail.js ├── translations ├── de │ ├── account.csv │ ├── catalog.csv │ ├── checkout.csv │ ├── general.csv │ └── paypal.csv ├── es │ ├── 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 ├── 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 └── zh │ ├── account.csv │ ├── catalog.csv │ ├── checkout.csv │ ├── general.csv │ └── paypal.csv ├── tsconfig.json └── turbo.json /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | open_collective: evershopcommerce 4 | -------------------------------------------------------------------------------- /.github/images/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/banner.png -------------------------------------------------------------------------------- /.github/images/evershop-admin-demo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/evershop-admin-demo1.png -------------------------------------------------------------------------------- /.github/images/evershop-backend-demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/evershop-backend-demo.png -------------------------------------------------------------------------------- /.github/images/evershop-demo-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/evershop-demo-back.png -------------------------------------------------------------------------------- /.github/images/evershop-demo-front.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/evershop-demo-front.png -------------------------------------------------------------------------------- /.github/images/evershop-product-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/evershop-product-detail.png -------------------------------------------------------------------------------- /.github/images/evershop-store-front-demo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/evershop-store-front-demo1.png -------------------------------------------------------------------------------- /.github/images/logo-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/logo-green.png -------------------------------------------------------------------------------- /.github/images/showcase.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/showcase.gif -------------------------------------------------------------------------------- /.github/images/sponsors/bountyhub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/.github/images/sponsors/bountyhub.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | dist 4 | /extensions/* 5 | /themes 6 | .idea/* 7 | .evershop 8 | .vscode 9 | npm-debug.log 10 | /package-log.json 11 | /media 12 | /public 13 | .DS_Store 14 | .log 15 | coverage 16 | cypress 17 | .turbo 18 | /config 19 | /packages/evershop/config 20 | .prettierignore 21 | .prettierrc 22 | mysqlToPostgres.js -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | #FORCE_COLOR=1 npm run lint -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Ignore everything: 2 | /* 3 | 4 | # Except packages: 5 | !/packages -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": true, 4 | "trailingComma" : "none" 5 | } -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/changelog.md -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "ext": "js, json, graphql" 3 | } -------------------------------------------------------------------------------- /packages/agegate/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "agegate", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "compile": "swc ./src/ -d dist/ --config-file .swcrc --copy-files --strip-leading-paths" 7 | }, 8 | "keywords": [], 9 | "author": "", 10 | "license": "ISC", 11 | "description": "" 12 | } 13 | -------------------------------------------------------------------------------- /packages/agegate/src/api/verifyAge/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "age": { 5 | "type": ["integer", "string"], 6 | "pattern": "^[0-9]+$" 7 | } 8 | }, 9 | "required": ["age"], 10 | "additionalProperties": true 11 | } 12 | -------------------------------------------------------------------------------- /packages/agegate/src/api/verifyAge/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/age-verify", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/agegate/src/graphql/types/AgeSetting/AgeSetting.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | minAge: Int! 3 | } -------------------------------------------------------------------------------- /packages/agegate/src/graphql/types/AgeSetting/AgeSetting.resolvers.js: -------------------------------------------------------------------------------- 1 | export default { 2 | Setting: { 3 | minAge: (setting) => { 4 | const minAge = setting.find((s) => s.name === 'minAge'); 5 | if (minAge) { 6 | return minAge.value; 7 | } else { 8 | return 18; 9 | } 10 | } 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /packages/agegate/src/pages/admin/ageSetting/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '@evershop/evershop/graphql/services'; 2 | 3 | export default (request) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Age Setting', 6 | description: 'Age Setting' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/agegate/src/pages/admin/ageSetting/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/setting/agegate" 4 | } 5 | -------------------------------------------------------------------------------- /packages/agegate/src/pages/frontStore/ageGate/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/age-gate" 4 | } 5 | -------------------------------------------------------------------------------- /packages/agegate/src/pages/frontStore/ageVerifyFailure/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/age-verify-failed" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/scripts/prepublish.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | 4 | fs.copyFile( 5 | path.resolve(__dirname, '../../README.md'), 6 | path.resolve(__dirname, './README.md'), 7 | (err) => { 8 | if (err) throw err; 9 | } 10 | ); 11 | -------------------------------------------------------------------------------- /packages/evershop/src/bin/build/initEnvBuild.ts: -------------------------------------------------------------------------------- 1 | import 'dotenv/config'; 2 | process.env.NODE_ENV = 'production'; 3 | process.env.ALLOW_CONFIG_MUTATIONS = 'true'; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/bin/dev/initEnvDev.ts: -------------------------------------------------------------------------------- 1 | import 'dotenv/config'; 2 | process.env.NODE_ENV = 'development'; 3 | process.env.ALLOW_CONFIG_MUTATIONS = 'true'; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/bin/start/initEnvStart.ts: -------------------------------------------------------------------------------- 1 | import 'dotenv/config'; 2 | process.env.NODE_ENV = 'production'; 3 | process.env.ALLOW_CONFIG_MUTATIONS = 'true'; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/components/admin/cms/NavigationItem.scss: -------------------------------------------------------------------------------- 1 | .nav-item { 2 | .menu-icon { 3 | padding-right: 10px; 4 | align-self: center; 5 | svg { 6 | width: 15px; 7 | height: 15px; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/components/admin/cms/Title.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import React from 'react'; 3 | 4 | 5 | export default function Title({ title }) { 6 | return

{title}

; 7 | } 8 | 9 | Title.propTypes = { 10 | title: PropTypes.string.isRequired 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/components/admin/index.ts: -------------------------------------------------------------------------------- 1 | import { Card } from './cms/Card.jsx'; 2 | import { NavigationItem } from './cms/NavigationItem.jsx'; 3 | import { NavigationItemGroup } from './cms/NavigationItemGroup.jsx'; 4 | 5 | export { Card, NavigationItem, NavigationItemGroup }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/components/admin/oms/orderGrid/rows/TotalRow.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import React from 'react'; 3 | 4 | 5 | export default function TotalRow({ total }) { 6 | return {total}; 7 | } 8 | 9 | TotalRow.propTypes = { 10 | total: PropTypes.string.isRequired 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/components/admin/setting/SettingMenu.scss: -------------------------------------------------------------------------------- 1 | .setting-page-menu { 2 | .card-section-header { 3 | a:hover { 4 | color: var(--interactive); 5 | text-decoration: underline; 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/evershop/src/components/admin/widgets/index.tsx: -------------------------------------------------------------------------------- 1 | import BasicMenuSetting from './BasicMenuSetting.jsx'; 2 | import CollectionProductsSetting from './CollectionProductsSetting.jsx'; 3 | import TextBlockSetting from './TextBlockSetting.jsx'; 4 | 5 | export { BasicMenuSetting, CollectionProductsSetting, TextBlockSetting }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/Body.jsx: -------------------------------------------------------------------------------- 1 | import Area from '@components/common/Area'; 2 | import React from 'react'; 3 | 4 | export function Body() { 5 | return ( 6 |
7 | 8 |
9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/Off.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './Off.scss'; 3 | 4 | export default function Off() { 5 | return ( 6 | 7 | 8 | 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/On.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './On.scss'; 3 | 4 | export default function On() { 5 | return ( 6 | 7 | 8 | 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/RenderIfTrue.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | RenderIfTrue.propTypes = { 4 | condition: PropTypes.bool.isRequired, 5 | children: PropTypes.node.isRequired 6 | }; 7 | 8 | export default function RenderIfTrue({ condition, children }) { 9 | return condition ? children : null; 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/Title.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import React from 'react'; 3 | 4 | 5 | export default function Title({ title }) { 6 | return {title}; 7 | } 8 | 9 | Title.propTypes = { 10 | title: PropTypes.string.isRequired 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/form/fields/Checkbox.scss: -------------------------------------------------------------------------------- 1 | @import '../Field.scss'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/form/fields/Date.scss: -------------------------------------------------------------------------------- 1 | @import '../Field.scss'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/form/fields/DateTime.scss: -------------------------------------------------------------------------------- 1 | @import '../Field.scss'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/form/fields/Flatpickr.jsx: -------------------------------------------------------------------------------- 1 | import flatpickr from 'flatpickr'; 2 | import './Flatpickr.scss'; 3 | 4 | export default flatpickr; 5 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/form/fields/Input.scss: -------------------------------------------------------------------------------- 1 | @import '../Field.scss'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/form/fields/MultiSelect.scss: -------------------------------------------------------------------------------- 1 | @import '../Field.scss'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/form/fields/Radio.scss: -------------------------------------------------------------------------------- 1 | @import '../Field.scss'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/form/fields/Select.scss: -------------------------------------------------------------------------------- 1 | @import '../Field.scss'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/form/fields/Textarea.scss: -------------------------------------------------------------------------------- 1 | @import '../Field.scss'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/grid/rows/TextRow.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import React from 'react'; 3 | 4 | 5 | export default function TextRow({ text }) { 6 | return {text}; 7 | } 8 | 9 | TextRow.propTypes = { 10 | text: PropTypes.string.isRequired 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/react/Head.jsx: -------------------------------------------------------------------------------- 1 | import Area from '@components/common/Area'; 2 | import React from 'react'; 3 | import ReactDOM from 'react-dom'; 4 | 5 | export default function Head() { 6 | return ReactDOM.createPortal( 7 | , 8 | document.getElementsByTagName('head')[0] 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/react/client/HydrateAdmin.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { createClient } from 'urql'; 3 | import Hydrate from './Hydrate'; 4 | 5 | const client = createClient({ 6 | url: '/api/admin/graphql' 7 | }); 8 | 9 | export function HydrateAdmin() { 10 | return ; 11 | } 12 | -------------------------------------------------------------------------------- /packages/evershop/src/components/common/react/client/HydrateFrontStore.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { createClient } from 'urql'; 3 | import Hydrate from './Hydrate'; 4 | 5 | const client = createClient({ 6 | url: '/api/graphql' 7 | }); 8 | 9 | export function HydrateFrontStore() { 10 | return ; 11 | } 12 | -------------------------------------------------------------------------------- /packages/evershop/src/components/frontStore/catalog/categoryView/filter/CategoryFilter.scss: -------------------------------------------------------------------------------- 1 | @media (max-width: 639px) { 2 | .category-filter { 3 | padding-bottom: 2.5rem; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/components/frontStore/catalog/product/list/SortOptions.jsx: -------------------------------------------------------------------------------- 1 | import { _ } from '../../../../../lib/locale/translate/index.js'; 2 | 3 | const options = [ 4 | { code: 'price', name: _('Price') }, 5 | { code: 'name', name: _('Name') } 6 | ]; 7 | 8 | export default options; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/components/frontStore/catalog/product/list/item/Name.scss: -------------------------------------------------------------------------------- 1 | .product-name { 2 | text-transform: capitalize; 3 | } 4 | -------------------------------------------------------------------------------- /packages/evershop/src/components/frontStore/catalog/product/list/item/Thumbnail.scss: -------------------------------------------------------------------------------- 1 | .product-thumbnail-listing { 2 | background-color: #f6f6f6; 3 | color: #3131; 4 | min-height: 250px; 5 | display: flex; 6 | justify-content: center; 7 | flex-direction: column; 8 | align-items: center; 9 | } 10 | -------------------------------------------------------------------------------- /packages/evershop/src/components/frontStore/catalog/product/single/Name.tsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import React from 'react'; 3 | 4 | 5 | export function Name({ name }) { 6 | return

{name}

; 7 | } 8 | 9 | Name.propTypes = { 10 | name: PropTypes.string.isRequired 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/components/frontStore/cms/Button.jsx: -------------------------------------------------------------------------------- 1 | import Button from '@components/common/form/Button'; 2 | import '@components/frontStore/cms/Button.scss'; 3 | 4 | export default Button; 5 | export { Button }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/components/frontStore/index.ts: -------------------------------------------------------------------------------- 1 | import Button from './cms/Button.jsx'; 2 | 3 | export { Button }; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/components/frontStore/widgets/index.tsx: -------------------------------------------------------------------------------- 1 | import BasicMenu from './BasicMenu.jsx'; 2 | import CollectionProducts from './CollectionProducts.jsx'; 3 | import TextBlock from './TextBlock.jsx'; 4 | 5 | export { CollectionProducts, BasicMenu, TextBlock }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/babel/index.js: -------------------------------------------------------------------------------- 1 | import config from './config.js'; 2 | import '@babel/register'; 3 | 4 | config(); 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/all/Banner.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/all/Banner.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/all/CommentList.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/all/CommentList.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/productView/Attribute.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/productView/Attribute.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/productView/Comment.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/productView/Comment.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/productView/Name.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/productView/Name.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/productView/Price.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/firstExtension/pages/frontStore/productView/Price.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/secondExtension/pages/frontStore/all/CommentList.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/secondExtension/pages/frontStore/all/CommentList.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/secondExtension/pages/frontStore/productView/Comment.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/secondExtension/pages/frontStore/productView/Comment.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/secondExtension/pages/frontStore/productView/Name.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/secondExtension/pages/frontStore/productView/Name.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/secondExtension/pages/frontStore/productView/Review.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/extensions/secondExtension/pages/frontStore/productView/Review.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/firstModule/pages/frontStore/all/Menu.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/firstModule/pages/frontStore/all/Menu.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/firstModule/pages/frontStore/productView/Name.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/firstModule/pages/frontStore/productView/Name.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/firstModule/pages/frontStore/productView/Price.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/firstModule/pages/frontStore/productView/Price.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/secondModule/pages/frontStore/all/Banner.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/secondModule/pages/frontStore/all/Banner.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/secondModule/pages/frontStore/productView/Description.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/secondModule/pages/frontStore/productView/Description.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/secondModule/pages/frontStore/productView/Inventory.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/secondModule/pages/frontStore/productView/Inventory.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/secondModule/pages/frontStore/productView/Name.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/modules/secondModule/pages/frontStore/productView/Name.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/all/CommentList.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/all/CommentList.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/all/Shipping.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/all/Shipping.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/productView/Name.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/productView/Name.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/productView/OutOfStock.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/productView/OutOfStock.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/productView/Price.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/componee/tests/unit/__mocks__/themes/justatheme/pages/productView/Price.js -------------------------------------------------------------------------------- /packages/evershop/src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export * from './util/index.js'; 2 | export * from './locale/index.js'; 3 | export * from './log/logger.js'; 4 | export * from './postgres/connection.js'; 5 | export * from './router/index.js'; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/locale/index.ts: -------------------------------------------------------------------------------- 1 | export * from './countries.js'; 2 | export * from './currencies.js'; 3 | export * from './provinces.js'; 4 | export * from './timezones.js'; 5 | export { _ } from './translate/index.js'; 6 | export { translate } from './translate/translate.js'; 7 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/isErrorHandlerTriggered.js: -------------------------------------------------------------------------------- 1 | export default (response) => { 2 | if (!response.locals) { 3 | return false; 4 | } else { 5 | return response.locals.errorHandlerTriggered === true; 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/isNextRequired.js: -------------------------------------------------------------------------------- 1 | import { readFileSync } from 'fs'; 2 | 3 | export default function isNextRequired(path) { 4 | const code = readFileSync(path, 'utf8'); 5 | return code.includes('next'); 6 | } 7 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/404page/pages/frontStore/product/[loadProduct]loadCategory.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => {}); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/404page/pages/frontStore/product/[loadProduct]loadProductImage.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn(async (request, response, delegates, next) => { 4 | next(); 5 | }); 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/404page/pages/frontStore/product/loadProduct.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn(async (request, response, delegates, next) => { 4 | try { 5 | response.status(404); 6 | next(); 7 | } catch (e) { 8 | next(e); 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/404page/pages/frontStore/product/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/product/:id", 4 | "name": "Product single page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/api/api/createA/index.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegate) => {}); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/api/api/createA/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/as" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/api/api/global/apiGlobal.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegate) => {}); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/authcopy/api/createA/[index]afterIndex.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegate) => {}); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/authcopy/api/global/[context]auth.js: -------------------------------------------------------------------------------- 1 | export default (request, response) => { 2 | // Do nothing 3 | }; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/authcopy/api/global/apiAuthGlobal.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegate) => {}); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/authcopy/pages/global/[context]auth.js: -------------------------------------------------------------------------------- 1 | export default (request, response) => {}; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/api/global/[apiResponse]apiErrorHandler.js: -------------------------------------------------------------------------------- 1 | import apiErrorHandler from '../../../../../../../../modules/base/api/global/[apiResponse]apiErrorHandler.js'; 2 | 3 | export default apiErrorHandler; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/api/global/[auth]apiResponse[apiErrorHandler].js: -------------------------------------------------------------------------------- 1 | import apiResponse from '../../../../../../../../modules/base/api/global/[auth]apiResponse[apiErrorHandler].js'; 2 | 3 | export default apiResponse; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/api/global/[auth]payloadValidate.js: -------------------------------------------------------------------------------- 1 | import payloadValidate from '../../../../../../../../modules/base/api/global/[auth]payloadValidate.js'; 2 | 3 | export default payloadValidate; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/api/global/[payloadValidate]escapeHtml.js: -------------------------------------------------------------------------------- 1 | import escapeHtml from '../../../../../../../../modules/base/api/global/[payloadValidate]escapeHtml.js'; 2 | 3 | export default escapeHtml; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/admin/adminStaticAsset/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/assets/*" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/admin/adminStaticAsset/staticAssets.js: -------------------------------------------------------------------------------- 1 | import staticMiddleware from '../../../../../../../../../modules/cms/pages/admin/adminStaticAsset/staticAssets.js'; 2 | 3 | export default staticMiddleware; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/admin/all/adminTitle.js: -------------------------------------------------------------------------------- 1 | export default (request, response, next) => {}; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/frontStore/all/title.js: -------------------------------------------------------------------------------- 1 | export default (request, response, next) => {}; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/frontStore/notFound/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/notFound" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/frontStore/staticAsset/[context]staticAssets[auth].js: -------------------------------------------------------------------------------- 1 | import staticMiddleware from '../../../../../../../../../modules/cms/pages/frontStore/staticAsset/[context]staticAssets[auth].js'; 2 | 3 | export default staticMiddleware; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/frontStore/staticAsset/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/assets/*" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/global/[auth]notFound[response].js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | import notFound from '../../../../../../../../modules/base/pages/global/[auth]notFound[response].js'; 3 | 4 | export default jest.fn(notFound); 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/global/[notFound]dummy[response].js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => {}); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/global/[response]errorHandler.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | import errorHandler from '../../../../../../../../modules/base/pages/global/[response]errorHandler.js'; 3 | 4 | export default jest.fn(errorHandler); 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/basecopy/pages/global/response[errorHandler].js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | import response from '../../../../../../../../modules/base/pages/global/response[errorHandler].js'; 3 | 4 | export default jest.fn(response); 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/asyncWithNext[collection].js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | export default async (request, response, delegates, next) => { 4 | const content = await axios.get( 5 | 'https://jsonplaceholder.typicode.com/todos/1' 6 | ); 7 | next(); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/async[collection].js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | export default async (request, response, delegates) => { 4 | const content = await axios.get( 5 | 'https://jsonplaceholder.typicode.com/todos/1' 6 | ); 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/collection.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | const test = jest.fn((delegates) => delegates); 4 | function collection(request, response, delegates) { 5 | test(delegates); 6 | } 7 | export default collection; 8 | 9 | export { test }; 10 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/returnOne[returnTwo].js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => 1); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/returnThree[collection].js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => 3); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/returnTwo[returnThree].js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates, next) => { 4 | next(); 5 | }); 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/delegateTest" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/syncWithNext[collection].js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates, next) => { 4 | next(); 5 | }); 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/delegate/pages/frontStore/delegateTest/sync[collection].js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => { 4 | const a = 1; 5 | }); 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/error/pages/frontStore/errorHandlerTest/errorInAsync.js: -------------------------------------------------------------------------------- 1 | export default async (request, response, delegates) => { 2 | const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); 3 | await delay(3000); 4 | undefined.b = 1; 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/error/pages/frontStore/errorHandlerTest/errorInSync.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => { 4 | throw new Error('Error in sync'); 5 | }); 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/error/pages/frontStore/errorHandlerTest/errorInSyncWithNext.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates, next) => { 4 | next(new Error('Error in sync with next')); 5 | }); 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/error/pages/frontStore/errorHandlerTest/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/errorHandlerTest" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/graphqlcopy/pages/global/[bodyParser]buildQuery[graphql].js: -------------------------------------------------------------------------------- 1 | export default (request, response) => {}; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/graphqlcopy/pages/global/[buildQuery]graphql[notFound].js: -------------------------------------------------------------------------------- 1 | export default (request, response) => {}; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/graphqlcopy/pages/global/bodyParser[buildQuery].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, stack, next) => { 4 | bodyParser.json({ inflate: false })(request, response, () => { 5 | bodyParser.urlencoded({ extended: true })(request, response, next); 6 | }); 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/admin/productEdit/[loadProduct]loadCategory.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => {}); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/admin/productEdit/[loadProduct]loadProductImage.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn(async (request, response, delegates, next) => { 4 | next(); 5 | }); 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/admin/productEdit/loadProduct.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn(async (request, response, delegates, next) => { 4 | try { 5 | response.status(404); 6 | next(); 7 | } catch (e) { 8 | next(e); 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/admin/productEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/product/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/frontStore/middleware/[loadAttribute]loadOptions.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => { 4 | console.log('loadOptions'); 5 | }); 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/frontStore/middleware/[loadProductImage]loadAttribute.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => { 4 | console.log('loadAttribute'); 5 | throw new Error('this is an error'); 6 | }); 7 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/frontStore/middleware/[loadProduct]loadCategory.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn((request, response, delegates) => { 4 | console.log('loadCategory'); 5 | }); 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/frontStore/middleware/[loadProduct]loadProductImage.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn(async (request, response, delegates, next) => { 4 | console.log('loadProductImage'); 5 | next(); 6 | }); 7 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/frontStore/middleware/loadProduct.js: -------------------------------------------------------------------------------- 1 | import jest from 'jest-mock'; 2 | 3 | export default jest.fn(async (request, response, delegates, next) => { 4 | console.log('loadProduct'); 5 | next(); 6 | }); 7 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middleware/tests/app/modules/handler/pages/frontStore/middleware/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/middleware" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middlewares/bodyJson.js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, stack, next) => { 4 | bodyParser.json()(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/middlewares/multerNone.js: -------------------------------------------------------------------------------- 1 | import multer from 'multer'; 2 | 3 | const upload = multer(); 4 | 5 | export default (request, response, stack, next) => { 6 | upload.none()(request, response, next); 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/router/index.ts: -------------------------------------------------------------------------------- 1 | export { buildUrl } from './buildUrl.js'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/router/tests/unit/a/invalidMethod/routeOne/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET", "INVALID"], 3 | "path": "/a/:url_key" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/router/tests/unit/a/invalidPath/routeTwo/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET", "POST"], 3 | "path": "invalidPath" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/router/tests/unit/b/routeOne/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET", "POST"], 3 | "path": "/a/:url_key" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/router/tests/unit/b/routeThree/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET", "PUT"], 3 | "path": "/b/:url_key" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/router/tests/unit/b/routeTwo/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/a/:url_key" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/util/events.ts: -------------------------------------------------------------------------------- 1 | export const FORM_VALIDATED = 'FORM_VALIDATED'; 2 | export const FORM_SUBMIT = 'FORM_SUBMIT'; 3 | export const FORM_FIELD_UPDATED = 'FORM_FIELD_UPDATED'; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/util/getConfig.ts: -------------------------------------------------------------------------------- 1 | import config from 'config'; 2 | 3 | /** 4 | * Get the configuration value base on path. Return the default value if the path is not found. 5 | */ 6 | export function getConfig(path: string, defaultValue?: T): T { 7 | return config.has(path) ? config.get(path) : (defaultValue as T); 8 | } 9 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/util/isAjax.ts: -------------------------------------------------------------------------------- 1 | import type { EvershopRequest } from '../../types/request.js'; 2 | 3 | export function isAjax(request: EvershopRequest) { 4 | return request.get('X-Requested-With') === 'XMLHttpRequest'; 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/util/isDevelopmentMode.ts: -------------------------------------------------------------------------------- 1 | export default (): boolean => process.env.NODE_ENV === 'development'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/util/isProductionMode.ts: -------------------------------------------------------------------------------- 1 | export default (): boolean => process.env.NODE_ENV === 'production'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/util/tests/unit/util.getConfig.test.js: -------------------------------------------------------------------------------- 1 | import { getConfig } from '../../getConfig.js'; 2 | 3 | describe('Test until getConfig', () => { 4 | it('It should return the default value if path is invalid', () => { 5 | expect(getConfig('a.b', 1)).toEqual(1); 6 | expect(getConfig('a.b')).toEqual(undefined); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/getRouteBuildPath.js: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { CONSTANTS } from '../helpers.js'; 3 | import { getRouteBuildSubPath } from './getRouteBuildSubPath.js'; 4 | 5 | export function getRouteBuildPath(route) { 6 | const subPath = getRouteBuildSubPath(route); 7 | return path.resolve(CONSTANTS.BUILDPATH, subPath); 8 | } 9 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/getRouteBuildSubPath.js: -------------------------------------------------------------------------------- 1 | export function getRouteBuildSubPath(route) { 2 | const { id, isAdmin } = route; 3 | return isAdmin === true ? `admin/${id}` : `frontStore/${id}`; 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/isBuildRequired.js: -------------------------------------------------------------------------------- 1 | export const isBuildRequired = (route) => { 2 | if (route.isApi || ['staticAsset', 'adminStaticAsset'].includes(route.id)) { 3 | return false; 4 | } else { 5 | return true; 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/loaders/LayoutLoader.js: -------------------------------------------------------------------------------- 1 | export default function LayoutLoader(content) { 2 | // Regex matching 'export const layout = { ... }' 3 | const layoutRegex = 4 | /export\s+var\s+layout\s*=\s*{\s*areaId\s*:\s*['"]([^'"]+)['"],\s*sortOrder\s*:\s*(\d+)\s*,*\s*}/; 5 | 6 | return content.replace(layoutRegex, ''); 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/loaders/StyleLoader.js: -------------------------------------------------------------------------------- 1 | export default function StyleLoader() { 2 | return ''; 3 | } 4 | -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/a/A.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/a/A.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/a/a.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/a/a.scss -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/b/B.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/b/B.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/b/B.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/b/B.scss -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/b/bb/BB.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/b/bb/BB.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/d/D.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/d/D.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/d/D.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/d/D.scss -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/d/dd/DD.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionA/components/d/dd/DD.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/a/A.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/a/A.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/a/a.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/a/a.scss -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/d/D.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/d/D.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/d/D.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/d/D.scss -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/d/dd/DD.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/d/dd/DD.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/e/E.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/e/E.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/e/E.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/e/E.scss -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/e/ee/EE.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/extensions/extensionB/components/e/ee/EE.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/theme/components/a/A.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/theme/components/a/A.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/theme/components/a/a.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/theme/components/a/a.scss -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/theme/components/b/B.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/theme/components/b/B.jsx -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/theme/components/b/B.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/theme/components/b/B.scss -------------------------------------------------------------------------------- /packages/evershop/src/lib/webpack/tests/unit/theme/components/b/bb/BB.jsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evershopcommerce/evershop/980318d5c7970ed3eb08883d18c1e54bd76715f4/packages/evershop/src/lib/webpack/tests/unit/theme/components/b/bb/BB.jsx -------------------------------------------------------------------------------- /packages/evershop/src/modules/auth/pages/admin/adminLogin/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/login" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/auth/pages/admin/adminLoginJson/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Admin User Login", 3 | "description": "Admin User Login", 4 | "methods": ["POST"], 5 | "path": "/user/login" 6 | } 7 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/auth/pages/admin/adminLogoutJson/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET", "POST"], 3 | "path": "/user/logout" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/auth/services/getAdminSessionCookieName.js: -------------------------------------------------------------------------------- 1 | import { getConfig } from '../../../lib/util/getConfig.js'; 2 | 3 | export const getAdminSessionCookieName = () => 4 | getConfig('system.session.adminCookieName', 'asid'); 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/auth/services/getCookieSecret.js: -------------------------------------------------------------------------------- 1 | import { getConfig } from '../../../lib/util/getConfig.js'; 2 | 3 | export const getCookieSecret = () => 4 | getConfig('system.session.cookieSecret', 'keyboard cat'); 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/auth/services/getFrontStoreSessionCookieName.js: -------------------------------------------------------------------------------- 1 | import { getConfig } from '../../../lib/util/getConfig.js'; 2 | 3 | export const getFrontStoreSessionCookieName = () => 4 | getConfig('system.session.cookieName', 'sid'); 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/auth/services/logoutUser.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Logout a current user. This function must be accessed from the request object (request.logoutUser(callback)) 3 | */ 4 | export default function logoutUser() { 5 | this.session.userID = undefined; 6 | this.locals.user = undefined; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Country/Country.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | The `Country` type represents a country. 3 | """ 4 | type Country { 5 | name: String! 6 | code: String! 7 | provinces: [Province] 8 | } 9 | 10 | extend type Query { 11 | countries(countries: [String]): [Country] 12 | allowedCountries: [Country] 13 | } 14 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Currency/Currency.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | A currency 3 | """ 4 | type Currency { 5 | name: String! 6 | code: String! 7 | } 8 | 9 | extend type Query { 10 | currencies: [Currency]! 11 | } 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Currency/Currency.resolvers.js: -------------------------------------------------------------------------------- 1 | import { currencies } from '../../../../../lib/locale/currencies.js'; 2 | 3 | export default { 4 | Query: { 5 | currencies: () => currencies 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/DateTime/DateTime.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | A DateTime is a string with a timezone. 3 | """ 4 | type DateTime { 5 | value: String 6 | timezone: String 7 | text(format: String): String 8 | } 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Province/Province.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | The `Province` type represents a province/state. 3 | """ 4 | type Province { 5 | name: String! 6 | code: String! 7 | countryCode: String! 8 | } 9 | 10 | extend type Query { 11 | provinces(countries: [String]): [Province] 12 | } 13 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Route/Route.admin.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Represents a route in the system 3 | """ 4 | type Route { 5 | id: String! 6 | isApi: Boolean! 7 | isAdmin: Boolean! 8 | name: String! 9 | path: String! 10 | method: [String!]! 11 | } 12 | 13 | extend type Query { 14 | routes: [Route!]! 15 | } 16 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Route/Route.admin.resolvers.js: -------------------------------------------------------------------------------- 1 | import { getRoutes } from '../../../../../lib/router/Router.js'; 2 | 3 | export default { 4 | Query: { 5 | routes: () => { 6 | const routes = getRoutes(); 7 | return routes.filter((route) => route.name); 8 | } 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Timezone/Timezone.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | A timezone 3 | """ 4 | type Timezone { 5 | name: String! 6 | code: String! 7 | } 8 | 9 | extend type Query { 10 | timezones: [Timezone]! 11 | } 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Timezone/Timezone.resolvers.js: -------------------------------------------------------------------------------- 1 | import { timezones } from '../../../../../lib/locale/timezones.js'; 2 | 3 | export default { 4 | Query: { 5 | timezones: () => timezones 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Url/Url.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | A query parameter for a URL 3 | """ 4 | input UrlParam { 5 | key: String! 6 | value: String! 7 | } 8 | 9 | extend type Query { 10 | url(routeId: String!, params: [UrlParam]): String! 11 | } 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/graphql/types/Version/Version.graphql: -------------------------------------------------------------------------------- 1 | extend type Query { 2 | version: String! 3 | } 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/pages/admin/all/[context]isAdmin[auth].js: -------------------------------------------------------------------------------- 1 | export default (request, response) => { 2 | request.isAdmin = true; 3 | response.context.isAdmin = true; 4 | }; 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/base/services/secret.js: -------------------------------------------------------------------------------- 1 | import { v4 as uuidv4 } from 'uuid'; 2 | 3 | const secret = uuidv4(); 4 | export default secret; 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/addProductToCategory/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/addProductToCategory/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "product_id": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["product_id"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/addProductToCategory/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/categories/:category_id/products", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/addProductToCollection/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/addProductToCollection/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "product_id": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["product_id"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/addProductToCollection/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/collections/:collection_id/products", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/addVariantItem/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/addVariantItem/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "product_id": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["product_id"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/addVariantItem/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/variantGroups/:id/items", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createAttribute/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createAttribute/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/attributes", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createAttributeGroup/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createAttributeGroup/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "group_name": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["group_name"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createAttributeGroup/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/attributeGroups", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createCategory/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createCategory/createCategory[finish].js: -------------------------------------------------------------------------------- 1 | import createCategory from '../../services/category/createCategory.js'; 2 | 3 | export default async (request, response, delegate) => { 4 | const result = await createCategory(request.body, { 5 | routeId: request.currentRoute.id 6 | }); 7 | return result; 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createCategory/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "description": { 5 | "type": "string", 6 | "skipEscape": true 7 | } 8 | }, 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createCategory/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/categories", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createCollection/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createCollection/createCollection[finish].js: -------------------------------------------------------------------------------- 1 | import createCollection from '../../services/collection/createCollection.js'; 2 | 3 | export default async (request, response, delegate) => { 4 | const collection = await createCollection(request.body, { 5 | routeId: request.currentRoute.id 6 | }); 7 | return collection; 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createCollection/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "description": { 5 | "type": "string", 6 | "skipEscape": true 7 | } 8 | }, 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createCollection/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/collections", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createProduct/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createProduct/createProduct[finish].js: -------------------------------------------------------------------------------- 1 | import createProduct from '../../services/product/createProduct.js'; 2 | 3 | export default async (request, response, delegate) => { 4 | const result = await createProduct(request.body, { 5 | routeId: request.currentRoute.id 6 | }); 7 | return result; 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createProduct/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "description": { 5 | "type": "string", 6 | "skipEscape": true 7 | } 8 | }, 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createProduct/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/products", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createVariantGroup/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/createVariantGroup/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/variantGroups", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/deleteAttribute/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/attributes/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/deleteAttributeGroup/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/attributeGroups/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/deleteCategory/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/categories/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/deleteCollection/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/collections/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/deleteProduct/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/products/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/removeProductFromCategory/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/removeProductFromCategory/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/categories/:category_id/products/:product_id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/removeProductFromCollection/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/removeProductFromCollection/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/collections/:collection_id/products/:product_id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/unlinkVariant/[context]multerNone[auth].js: -------------------------------------------------------------------------------- 1 | import multer from 'multer'; 2 | 3 | const upload = multer(); 4 | 5 | export default (request, response, stack, next) => { 6 | upload.none()(request, response, next); 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/unlinkVariant/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/variants/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateAttribute/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateAttribute/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/attributes/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateAttribute/updateAttribute[finish].js: -------------------------------------------------------------------------------- 1 | import updateProductAttribute from '../../services/attribute/updateProductAttribute.js'; 2 | 3 | export default async (request, response, delegate) => { 4 | const result = await updateProductAttribute(request.params.id, request.body); 5 | return result; 6 | }; 7 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateAttributeGroup/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateAttributeGroup/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "group_name": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["group_name"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateAttributeGroup/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/attributeGroups/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateCategory/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateCategory/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "description": { 5 | "type": "string", 6 | "skipEscape": true 7 | } 8 | }, 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateCategory/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/categories/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateCategory/updateCategory[finish].js: -------------------------------------------------------------------------------- 1 | import updateCategory from '../../services/category/updateCategory.js'; 2 | 3 | export default async (request, response, delegate) => { 4 | const category = await updateCategory(request.params.id, request.body, { 5 | routeId: request.currentRoute.id 6 | }); 7 | return category; 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateCollection/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateCollection/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "description": { 5 | "type": "string", 6 | "skipEscape": true 7 | } 8 | }, 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateCollection/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/collections/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateProduct/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateProduct/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "description": { 5 | "type": "string", 6 | "skipEscape": true 7 | } 8 | }, 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateProduct/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/products/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/updateProduct/updateProduct[finish].js: -------------------------------------------------------------------------------- 1 | import updateProduct from '../../services/product/updateProduct.js'; 2 | 3 | export default async (request, response, delegate) => { 4 | const product = await updateProduct(request.params.id, request.body, { 5 | routeId: request.currentRoute.id 6 | }); 7 | return product; 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/api/variantSearch/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/variants", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Category/Category.admin.graphql: -------------------------------------------------------------------------------- 1 | extend type Category { 2 | editUrl: String 3 | updateApi: String! 4 | deleteApi: String! 5 | addProductUrl: String 6 | } 7 | 8 | extend type Product { 9 | removeFromCategoryUrl: String 10 | } -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Collection/Collection.admin.graphql: -------------------------------------------------------------------------------- 1 | extend type Collection { 2 | editUrl: String 3 | addProductUrl: String 4 | updateApi: String! 5 | deleteApi: String! 6 | } 7 | 8 | extend type Product { 9 | removeFromCollectionUrl: String 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/FeaturedProduct/FeaturedProduct.graphql: -------------------------------------------------------------------------------- 1 | extend type Query { 2 | featuredProducts(limit: Int): [Product] 3 | } 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Product/CustomOption/CustomOption.resolvers.js: -------------------------------------------------------------------------------- 1 | export default { 2 | Product: { 3 | options: async () => [] // TODO: To be implemented 4 | } 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Product/Inventory/Inventory.admin.graphql: -------------------------------------------------------------------------------- 1 | extend type Inventory { 2 | qty: Int! 3 | } 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Product/Inventory/Inventory.admin.resolvers.js: -------------------------------------------------------------------------------- 1 | export default { 2 | Inventory: { 3 | qty: (inventory) => inventory.qty || 0 4 | } 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Product/Inventory/Inventory.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | The `Inventory` type represents a product's inventory information. 3 | """ 4 | type Inventory { 5 | isInStock: Boolean! 6 | stockAvailability: Int! 7 | manageStock: Int! 8 | } 9 | 10 | extend type Product { 11 | inventory: Inventory! 12 | } 13 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Product/Price/ProductPrice.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Represents a price for a product. 3 | """ 4 | type ProductPrice { 5 | regular: Price! 6 | special: Price! 7 | } 8 | 9 | extend type Product { 10 | price: ProductPrice! 11 | } 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Product/Price/ProductPrice.resolvers.js: -------------------------------------------------------------------------------- 1 | export default { 2 | Product: { 3 | price: (product) => { 4 | const price = parseFloat(product.price); 5 | return { 6 | regular: price, 7 | special: price // TODO: implement special price 8 | }; 9 | } 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Product/Product.admin.graphql: -------------------------------------------------------------------------------- 1 | extend type Product { 2 | editUrl: String 3 | updateApi: String! 4 | deleteApi: String! 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Widget/CollectionProductsWidget/CollectionProductsWidget.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Return a collection products Widget 3 | """ 4 | type CollectionProductsWidget { 5 | collection: String 6 | count: Int 7 | } 8 | 9 | extend type Query { 10 | collectionProductsWidget(collection: String, count: Int): CollectionProductsWidget 11 | } -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/graphql/types/Widget/CollectionProductsWidget/CollectionProductsWidget.resolvers.js: -------------------------------------------------------------------------------- 1 | export default { 2 | Query: { 3 | collectionProductsWidget: async (root, { collection, count }) => ({ 4 | collection, 5 | count: count ? parseInt(count, 10) : 5 6 | }) 7 | } 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/attributeEdit+attributeNew/FormContent.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 0 auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/attributeEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/attributes/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/attributeGrid/Heading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function Heading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 10 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/attributeGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/attributes" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/attributeNew/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request, response) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Create a new attribute', 6 | description: 'Create a new attribute' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/attributeNew/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/attributes/new" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/categoryEdit+categoryNew/FormContent.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 0 auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/categoryEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/categories/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/categoryGrid/Heading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function Heading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 10 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/categoryGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/categories" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/categoryNew/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request, response) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Create a new category', 6 | description: 'Create a new category' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/categoryNew/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/categories/new" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/collectionEdit+collectionNew/FormContent.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 0 auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/collectionEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/collections/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/collectionGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/collections" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/collectionNew/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request, response) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Create a new collection', 6 | description: 'Create a new collection' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/collectionNew/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/collections/new" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/productEdit+productNew/FormContent.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 0 auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/productEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/products/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/productGrid/Heading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function Heading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 10 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/productGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/products" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/productNew/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request, response) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Create a new product', 6 | description: 'Create a new product' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/admin/productNew/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/products/new" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/frontStore/catalogSearch/General.scss: -------------------------------------------------------------------------------- 1 | .category-name { 2 | font-size: 4rem; 3 | text-transform: uppercase; 4 | font-weight: 700; 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/frontStore/catalogSearch/Sorting.jsx: -------------------------------------------------------------------------------- 1 | import Sorting from '@components/frontStore/catalog/product/list/Sorting'; 2 | import React from 'react'; 3 | 4 | export default function SortingWrapper() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'oneColumn', 10 | sortOrder: 15 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/frontStore/catalogSearch/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/search", 4 | "name": "Catalog search page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/frontStore/categoryView/Sorting.jsx: -------------------------------------------------------------------------------- 1 | import Sorting from '@components/frontStore/catalog/product/list/Sorting'; 2 | import React from 'react'; 3 | 4 | export default function SortingWrapper() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'rightColumn', 10 | sortOrder: 15 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/frontStore/categoryView/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/category/:uuid", 4 | "name": "Category page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/frontStore/productView/GeneralInfo.scss: -------------------------------------------------------------------------------- 1 | .product-single-name { 2 | text-transform: capitalize; 3 | } 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/pages/frontStore/productView/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/product/:uuid", 4 | "name": "Product single page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/services/getAttributeGroupsBaseQuery.js: -------------------------------------------------------------------------------- 1 | import { select } from '@evershop/postgres-query-builder'; 2 | 3 | export const getAttributeGroupsBaseQuery = () => 4 | select().from('attribute_group'); 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/services/getAttributesBaseQuery.js: -------------------------------------------------------------------------------- 1 | import { select } from '@evershop/postgres-query-builder'; 2 | 3 | export const getAttributesBaseQuery = () => select().from('attribute'); 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/catalog/services/getCollectionsBaseQuery.ts: -------------------------------------------------------------------------------- 1 | import { select } from '@evershop/postgres-query-builder'; 2 | import type { SelectQuery } from '@evershop/postgres-query-builder'; 3 | 4 | export const getCollectionsBaseQuery = (): SelectQuery => { 5 | const query = select().from('collection'); 6 | return query; 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartAddress/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartAddress/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/carts/:cart_id/addresses", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartContactInfo/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartContactInfo/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/carts/:cart_id/contacts", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartItem/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartItem/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/cart/:cart_id/items", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartPaymentMethod/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartPaymentMethod/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/carts/:cart_id/paymentMethods", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartShippingMethod/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addCartShippingMethod/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/carts/:cart_id/shippingMethods", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addMineCartItem/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addMineCartItem/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/cart/mine/items", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addShippingNote/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addShippingNote/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "note": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["note"], 9 | "additionalProperties": false, 10 | "errorMessage": { 11 | "properties": { 12 | "note": "Note is required" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addShippingNote/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/carts/:cart_id/shippingNotes", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addShippingZoneMethod/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/addShippingZoneMethod/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/shippingZones/:id/methods", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/createCart/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/createCart/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/carts", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/createOrder/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/createOrder/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/orders", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/createShippingMethod/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/createShippingMethod/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "name": { 5 | "type": "string" 6 | } 7 | }, 8 | "additionalProperties": true, 9 | "required": ["name"] 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/createShippingMethod/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/shippingMethods", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/createShippingZone/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/createShippingZone/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/shippingZones", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/deleteShippingZone/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/shippingZones/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/deleteShippingZoneMethod/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/shippingZones/:zone_id/methods/:method_id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/getPaymentMethods/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/paymentMethods", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/getShippingMethods/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/shippingMethods/:cart_id", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/removeCartItem/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/cart/:cart_id/items/:item_id", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/removeMineCartItem/[getCurrentCustomer]detectCurrentCart.js: -------------------------------------------------------------------------------- 1 | import detectCurrentCartMiddleware from '../addMineCartItem/[getCurrentCustomer]detectCurrentCart.js'; 2 | 3 | export default detectCurrentCartMiddleware; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/removeMineCartItem/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/cart/mine/items/:item_id", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateCartItemQty/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateCartItemQty/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/cart/:cart_id/items/:item_id", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateMineCartItemQty/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateMineCartItemQty/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/cart/mine/items/:item_id", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateShippingMethod/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateShippingMethod/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "name": { 5 | "type": "string" 6 | } 7 | }, 8 | "additionalProperties": true, 9 | "required": ["name"] 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateShippingMethod/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/shippingMethods/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateShippingZone/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateShippingZone/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/shippingZones/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateShippingZoneMethod/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateShippingZoneMethod/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/shippingZones/:zone_id/methods/:method_id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/api/updateShippingZoneMethod/validateMethod.js: -------------------------------------------------------------------------------- 1 | import validate from '../addShippingZoneMethod/validateMethod.js'; 2 | 3 | export default async (request, response, delegate, next) => 4 | validate(request, response, delegate, next); 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/graphql/types/Checkout/Checkout.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Represents a checkout object in the store. 3 | """ 4 | type Checkout { 5 | cartId: String! 6 | } 7 | 8 | extend type Query { 9 | checkout: Checkout! 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/graphql/types/Checkout/Checkout.resolvers.js: -------------------------------------------------------------------------------- 1 | export default { 2 | Query: { 3 | checkout: async (r, c, { cartId }) => ({ 4 | cartId 5 | }) 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/graphql/types/CheckoutSetting/CheckoutSetting.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | showShippingNote: Boolean 3 | } 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/graphql/types/CheckoutSetting/CheckoutSetting.resolvers.js: -------------------------------------------------------------------------------- 1 | import { getConfig } from '../../../../../lib/util/getConfig.js'; 2 | 3 | export default { 4 | Setting: { 5 | showShippingNote: () => getConfig('checkout.showShippingNote', true) 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/graphql/types/Date/Date.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | A date field. 3 | """ 4 | type Date { 5 | value: String 6 | text: String 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/graphql/types/Date/Date.resolvers.js: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs'; 2 | 3 | export default { 4 | Date: { 5 | value: (raw) => raw, 6 | text: (raw) => dayjs(raw).format('MMM D, YYYY') 7 | } 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/graphql/types/Price/Price.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Represents a price value. 3 | """ 4 | type Price { 5 | value: Float! 6 | currency(currency: String): String! 7 | text(currency: String): String! 8 | } 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/graphql/types/ShippingMethod/ShippingMethod.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Represents a shipping method. 3 | """ 4 | type ShippingMethod { 5 | shippingMethodId: Int! 6 | uuid: String! 7 | name: String! 8 | updateApi: String! 9 | } 10 | 11 | extend type Query { 12 | shippingMethods: [ShippingMethod] 13 | } -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/graphql/types/Weight/Weight.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Represents a weight value. 3 | """ 4 | type Weight { 5 | value: Float! 6 | unit: String! 7 | text: String! 8 | } 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/pages/admin/shippingSetting/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Shipping Setting', 6 | description: 'Shipping Setting' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/pages/admin/shippingSetting/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/setting/shipping" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/pages/frontStore/cart/Summary.scss: -------------------------------------------------------------------------------- 1 | .shopping-cart-checkout-btn { 2 | .button { 3 | font-size: 13px; 4 | letter-spacing: 0.05em; 5 | width: 100%; 6 | text-align: center; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/pages/frontStore/cart/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/cart", 4 | "name": "Cart page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/pages/frontStore/checkout/SummaryMobile.scss: -------------------------------------------------------------------------------- 1 | .checkout-summary.checkout__summary__mobile { 2 | min-height: auto; 3 | &::after { 4 | display: none; 5 | background-color: none; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/pages/frontStore/checkout/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/checkout", 4 | "name": "Checkout page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/pages/frontStore/checkoutSuccess/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/checkout/success/:orderId?", 4 | "name": "Checkout success page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/checkout/tests/taxRates.js: -------------------------------------------------------------------------------- 1 | export const taxRates = [0, 10, 15, 7.25, 5.37]; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/createCmsPage/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/createCmsPage/createPage[finish].js: -------------------------------------------------------------------------------- 1 | import createPage from '../../services/page/createPage.js'; 2 | 3 | export default async (request, response, delegate) => { 4 | const data = request.body; 5 | const result = await createPage(data, { 6 | routeId: request.currentRoute.id 7 | }); 8 | 9 | return result; 10 | }; 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/createCmsPage/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "content": { 5 | "type": "string", 6 | "skipEscape": true 7 | } 8 | }, 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/createCmsPage/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/pages", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/createWidget/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/createWidget/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/widgets", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/deleteCmsPage/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/pages/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/deleteWidget/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/widgets/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/fileBrowser/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/files/*", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/fileDelete/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/files/*", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/fileUpload/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/files/*", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/folderCreate/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/folderCreate/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "path": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["path"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/folderCreate/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/folders", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/imageUpload/[context]multerFile[auth].js: -------------------------------------------------------------------------------- 1 | import multerFileMiddleware from '../fileUpload/[context]multerFile[auth].js'; 2 | 3 | export default multerFileMiddleware; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/imageUpload/[context]validatePath[multerFile].js: -------------------------------------------------------------------------------- 1 | import validatePathMiddelware from '../fileUpload/[context]validatePath[multerFile].js'; 2 | 3 | export default validatePathMiddelware; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/imageUpload/[multerFile]upload.js: -------------------------------------------------------------------------------- 1 | import uploadMiddleware from '../fileUpload/[multerFile]upload.js'; 2 | 3 | export default uploadMiddleware; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/imageUpload/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/images/*", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/updateCmsPage/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/updateCmsPage/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "content": { 5 | "type": "string", 6 | "skipEscape": true 7 | } 8 | }, 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/updateCmsPage/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/pages/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/updateWidget/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/api/updateWidget/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/widgets/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/graphql/types/Menu/Menu.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Represents a menu item 3 | """ 4 | type MenuItem { 5 | name: String! 6 | url: String! 7 | children: [MenuItem] 8 | } 9 | 10 | """ 11 | Represents a menu 12 | """ 13 | type Menu { 14 | items: [MenuItem] 15 | } 16 | 17 | extend type Query { 18 | menu: Menu 19 | } 20 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/graphql/types/ThemeConfig/ThemeConfig.resolvers.js: -------------------------------------------------------------------------------- 1 | import { getConfig } from '../../../../../lib/util/getConfig.js'; 2 | 3 | export default { 4 | Query: { 5 | themeConfig: () => getConfig('themeConfig') 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/adminNotFound/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/notfound" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/adminStaticAsset/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/assets/*" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/adminStaticAsset/staticAssets.js: -------------------------------------------------------------------------------- 1 | import staticMiddleware from '../../../../../lib/middlewares/static.js'; 2 | 3 | export default (request, response, stack, next) => { 4 | staticMiddleware(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/all/Logo.scss: -------------------------------------------------------------------------------- 1 | .logo { 2 | display: flex; 3 | a { 4 | align-self: center; 5 | color: var(--primary); 6 | padding: 3px; 7 | svg { 8 | width: 4rem; 9 | height: 3rem; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/all/tailwind.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/FormContent.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 0 auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/cmsPageEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/pages/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/cmsPageGrid/Heading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function Heading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 10 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/cmsPageGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/pages" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/cmsPageNew/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request, response) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Create a new cms page', 6 | description: 'Create a new cms page' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/cmsPageNew/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/pages/new" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/dashboard/Layout.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 3rem auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/dashboard/PageHeading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function PageEditPageHeading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 5 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/dashboard/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request, response) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Dashboard', 6 | description: 'dashboard' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/dashboard/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/widgetEdit+widgetNew/FormContent.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 0 auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/widgetEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/widgets/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/widgetGrid/Heading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function Heading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 10 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/widgetGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/widgets" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/widgetNew/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request, response) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Create a new widget', 6 | description: 'Create a new widget' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/admin/widgetNew/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/widgets/new/:type" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/frontStore/all/Logo.scss: -------------------------------------------------------------------------------- 1 | .logo { 2 | a.logo-icon { 3 | svg { 4 | width: 4rem; 5 | height: 4rem; 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/frontStore/all/tailwind.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/frontStore/cmsPageView/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/page/:url_key", 4 | "name": "Static Page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/frontStore/homepage/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/", 4 | "name": "Home Page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/frontStore/notFound/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/notfound", 4 | "name": "Not Found" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/frontStore/staticAsset/[context]staticAssets[auth].js: -------------------------------------------------------------------------------- 1 | import staticMiddleware from '../../../../../lib/middlewares/static.js'; 2 | 3 | export default (request, response, delegate, next) => { 4 | staticMiddleware(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/pages/frontStore/staticAsset/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/assets/*" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cms/services/getWidgetsBaseQuery.js: -------------------------------------------------------------------------------- 1 | import { select } from '@evershop/postgres-query-builder'; 2 | 3 | export const getWidgetsBaseQuery = () => { 4 | const query = select().from('widget'); 5 | 6 | return query; 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cod/api/codCapturePayment/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cod/api/codCapturePayment/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "order_id": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["order_id"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cod/api/codCapturePayment/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/cod/captures", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/cod/graphql/types/CODSetting/CODSetting.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | codPaymentStatus: Int 3 | codDislayName: String 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/createCustomer/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/createCustomer/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/customers", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/createCustomerAddress/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/createCustomerAddress/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/customers/:customer_id/addresses", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/deleteCustomer/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/customers/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/deleteCustomerAddress/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/customers/:customer_id/addresses/:address_id", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/resetPassword/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/resetPassword/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "email": { 5 | "type": "string", 6 | "format": "email" 7 | } 8 | }, 9 | "required": ["email"], 10 | "additionalProperties": true 11 | } 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/resetPassword/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/customers/reset-password", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/updateCustomer/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/updateCustomer/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/customers/:id", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/updateCustomerAddress/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/updateCustomerAddress/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/customers/:customer_id/addresses/:address_id", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/updatePassword/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/updatePassword/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "password": { 5 | "type": "string" 6 | }, 7 | "token": { 8 | "type": "string" 9 | } 10 | }, 11 | "required": ["password", "token"], 12 | "additionalProperties": true 13 | } 14 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/api/updatePassword/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/customers/password", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/graphql/types/Customer/CustomerSetting.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | customerAddressSchema: JSON 3 | } 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/graphql/types/Customer/CustomerSetting.resolvers.js: -------------------------------------------------------------------------------- 1 | import { getConfig } from '../../../../../lib/util/getConfig.js'; 2 | 3 | export default { 4 | Setting: { 5 | customerAddressSchema: () => getConfig('customer.addressSchema', undefined) 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/graphql/types/CustomerGroup/CustomerGroup.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Represents a customer group. 3 | """ 4 | type CustomerGroup { 5 | customerGroupId: Int! 6 | groupName: String! 7 | } 8 | 9 | extend type Customer { 10 | group: CustomerGroup 11 | } -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/admin/customerEdit/CustomerEditForm.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 0 auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/admin/customerEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/customers/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/admin/customerGrid/Heading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function Heading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 10 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/admin/customerGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/customers" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/frontStore/account/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/account", 4 | "name": "Account page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/frontStore/accountEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/account/edit", 4 | "name": "Account edit page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/frontStore/customerLoginJson/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "email": { 5 | "type": "string", 6 | "format": "email" 7 | }, 8 | "password": { 9 | "type": "string" 10 | } 11 | }, 12 | "required": ["email", "password"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/frontStore/customerLoginJson/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/customer/login" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/frontStore/customerLogoutJson/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET", "POST"], 3 | "path": "/customer/logout" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/frontStore/login/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/account/login", 4 | "name": "Login page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/frontStore/register/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/account/register", 4 | "name": "Register page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/frontStore/resetPasswordPage/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/account/reset-password", 4 | "name": "Reset password page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/pages/frontStore/updatePasswordPage/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/account/update-password", 4 | "name": "Update password page" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/services/customer/logoutCustomer.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Logout the current customer. This function must be accessed from the request object (request.logoutCustomer(callback)) 3 | */ 4 | function logoutCustomer() { 5 | this.session.customerID = undefined; 6 | this.locals.customer = undefined; 7 | } 8 | 9 | export default logoutCustomer; 10 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/services/getCustomerGroupsBaseQuery.js: -------------------------------------------------------------------------------- 1 | import { select } from '@evershop/postgres-query-builder'; 2 | 3 | export const getCustomerGroupsBaseQuery = () => { 4 | const query = select().from('customer_group'); 5 | 6 | return query; 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/services/getCustomersBaseQuery.ts: -------------------------------------------------------------------------------- 1 | import { select, SelectQuery } from '@evershop/postgres-query-builder'; 2 | 3 | export const getCustomersBaseQuery = (): SelectQuery => { 4 | const query = select().from('customer'); 5 | 6 | return query; 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/customer/services/index.ts: -------------------------------------------------------------------------------- 1 | import { getCustomersBaseQuery } from './getCustomersBaseQuery.js'; 2 | 3 | export { getCustomersBaseQuery }; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/api/adminGraphql/[bodyParser]graphql.js: -------------------------------------------------------------------------------- 1 | import schema from '../../services/buildSchema.js'; 2 | import { graphqlMiddleware } from '../../services/graphqlMiddleware.js'; 3 | 4 | const middleware = graphqlMiddleware(schema); 5 | export default middleware; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/api/adminGraphql/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/api/adminGraphql/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET", "POST"], 3 | "path": "/admin/graphql", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/api/graphql/[bodyParser]graphql.js: -------------------------------------------------------------------------------- 1 | import schema from '../../services/buildStoreFrontSchema.js'; 2 | import { graphqlMiddleware } from '../../services/graphqlMiddleware.js'; 3 | 4 | const middleware = graphqlMiddleware(schema); 5 | export default middleware; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/api/graphql/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/api/graphql/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET", "POST"], 3 | "path": "/graphql", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/bootstrap.js: -------------------------------------------------------------------------------- 1 | import '../../modules/graphql/services/buildSchema.js'; 2 | 3 | export default () => {}; 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/graphql/types/Query/Query.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | The root query type, represents all of the entry points into our object graph. 3 | """ 4 | type Query { 5 | hello: String! 6 | } 7 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/graphql/types/Query/Query.resolvers.js: -------------------------------------------------------------------------------- 1 | export default { 2 | Query: { 3 | hello: () => 'Hello EverShop!' 4 | } 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/pages/global/bodyParser[buildQuery].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, () => { 5 | bodyParser.urlencoded({ extended: true })(request, response, next); 6 | }); 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/graphql/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './contextHelper.js'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/cancelOrder/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/cancelOrder/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "reason": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["reason"], 9 | "additionalProperties": true, 10 | "errorMessage": { 11 | "properties": { 12 | "reason": "Reason is mandatory" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/cancelOrder/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/orders/:id/cancel", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/createShipment/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/createShipment/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "carrier": { 5 | "type": "string" 6 | }, 7 | "tracking_number": { 8 | "type": "string" 9 | } 10 | }, 11 | "additionalProperties": true 12 | } 13 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/createShipment/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/orders/:id/shipments", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/lifetimesales/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/lifetimesales", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/markDelivered/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/markDelivered/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "order_id": { 5 | "type": "string" 6 | } 7 | }, 8 | "additionalProperties": true 9 | } 10 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/markDelivered/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/deliveries", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/salestatistic/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/salestatistic", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/updateShipment/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/updateShipment/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "carrier": { 5 | "type": "string" 6 | }, 7 | "tracking_number": { 8 | "type": "string" 9 | } 10 | }, 11 | "additionalProperties": true 12 | } 13 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/api/updateShipment/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/orders/:order_id/shipments/:shipment_id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/graphql/types/BestSeller/BestSeller.admin.graphql: -------------------------------------------------------------------------------- 1 | extend type Product { 2 | soldQty: Int 3 | } 4 | 5 | extend type Query { 6 | bestSellers: [Product] 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/graphql/types/Carrier/Carrier.admin.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | The `Carrier` type defines the shipping carrier. 3 | """ 4 | type Carrier { 5 | name: String! 6 | code: String! 7 | trackingUrl: String 8 | } 9 | 10 | extend type Query { 11 | carriers: [Carrier] 12 | } 13 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/pages/admin/orderEdit/Layout.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 0 auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/pages/admin/orderEdit/Payment.scss: -------------------------------------------------------------------------------- 1 | .summary-row { 2 | display: grid; 3 | grid-gap: 0.85rem; 4 | grid-template-columns: 14rem auto; 5 | > div { 6 | display: grid; 7 | grid-gap: 0.85rem; 8 | grid-template-columns: 1fr auto; 9 | } 10 | } 11 | .summary-wrapper { 12 | display: grid; 13 | grid-row-gap: 0.85rem; 14 | } 15 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/pages/admin/orderEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/order/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/pages/admin/orderGrid/Heading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function Heading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 10 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/pages/admin/orderGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/orders" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/oms/services/getOrdersBaseQuery.js: -------------------------------------------------------------------------------- 1 | import { select } from '@evershop/postgres-query-builder'; 2 | 3 | export const getOrdersBaseQuery = () => { 4 | const query = select().from('order'); 5 | 6 | return query; 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalAuthorizePayment/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalAuthorizePayment/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "order_id": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["order_id"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalAuthorizePayment/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/paypal/authorizedTransactions", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalCaptureAuthorizedPayment/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalCaptureAuthorizedPayment/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "order_id": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["order_id"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalCaptureAuthorizedPayment/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/paypal/authorizations/capture", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalCapturePayment/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalCapturePayment/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "order_id": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["order_id"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalCapturePayment/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/paypal/captureTransactions", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalCreateOrder/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalCreateOrder/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "order_id": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["order_id"], 9 | "additionalProperties": true 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/api/paypalCreateOrder/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/paypal/orders", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/graphql/types/PaypalSetting/PaypalSetting.admin.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | paypalPaymentStatus: Int 3 | paypalClientId: String 4 | paypalClientSecret: String 5 | paypalWebhookSecret: String 6 | paypalPaymentIntent: String 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/graphql/types/PaypalSetting/PaypalSetting.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | paypalDislayName: String 3 | paypalEnvironment: String 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/pages/frontStore/paypalCancel/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/paypal/cancelling/:order_id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/pages/frontStore/paypalReturn/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/paypal/proccessing/:order_id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/paypal/services/getApiBaseUrl.js: -------------------------------------------------------------------------------- 1 | import { getSetting } from '../../setting/services/setting.js'; 2 | 3 | export async function getApiBaseUrl() { 4 | const url = await getSetting( 5 | 'paypalEnvironment', 6 | 'https://api-m.sandbox.paypal.com' 7 | ); 8 | return url; 9 | } 10 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/couponApply/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/couponApply/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "coupon": { 5 | "type": "string" 6 | } 7 | }, 8 | "required": ["coupon"], 9 | "additionalProperties": true, 10 | "errorMessage": { 11 | "properties": { 12 | "coupon": "Coupon is invalid" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/couponApply/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/carts/:cart_id/coupons", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/createCoupon/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/createCoupon/createCoupon[finish].js: -------------------------------------------------------------------------------- 1 | import createCoupon from '../../services/coupon/createCoupon.js'; 2 | 3 | export default async (request, response, delegate) => { 4 | const coupon = await createCoupon(request.body, { 5 | routeId: request.currentRoute.id 6 | }); 7 | 8 | return coupon; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/createCoupon/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/coupons", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/deleteCoupon/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/coupons/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/updateCoupon/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/updateCoupon/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/coupons/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/api/updateCoupon/updateCoupon[finish].js: -------------------------------------------------------------------------------- 1 | import updateCoupon from '../../services/coupon/updateCoupon.js'; 2 | 3 | export default async (request, response, delegate) => { 4 | const coupon = await updateCoupon(request.params.id, request.body, { 5 | routeId: request.currentRoute.id 6 | }); 7 | 8 | return coupon; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/graphql/types/Coupon/Coupon.graphql: -------------------------------------------------------------------------------- 1 | scalar JSON 2 | 3 | extend type Cart { 4 | applyCouponApi: String! 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/graphql/types/Coupon/Coupon.resolvers.js: -------------------------------------------------------------------------------- 1 | import { buildUrl } from '../../../../../lib/router/buildUrl.js'; 2 | 3 | export default { 4 | Cart: { 5 | applyCouponApi: (cart) => buildUrl('couponApply', { cart_id: cart.uuid }) 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/pages/admin/couponEdit+couponNew/FormContent.scss: -------------------------------------------------------------------------------- 1 | .page-heading { 2 | max-width: 100rem; 3 | } 4 | .main-content-inner { 5 | max-width: 100rem; 6 | margin: 0 auto; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/pages/admin/couponEdit/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/coupon/edit/:id" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/pages/admin/couponGrid/Heading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function Heading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 10 11 | }; 12 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/pages/admin/couponGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/coupons" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/pages/admin/couponNew/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Create a new coupon', 6 | description: 'Create a new coupon' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/pages/admin/couponNew/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/coupon/new" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/promotion/services/getCouponsBaseQuery.js: -------------------------------------------------------------------------------- 1 | import { select } from '@evershop/postgres-query-builder'; 2 | 3 | export const getCouponsBaseQuery = () => { 4 | const query = select().from('coupon'); 5 | 6 | return query; 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/setting/api/saveSetting/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/setting/api/saveSetting/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/settings", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/setting/graphql/types/Setting/Setting.graphql: -------------------------------------------------------------------------------- 1 | """ 2 | Single store setting 3 | """ 4 | type Setting { 5 | storeName: String 6 | } 7 | 8 | extend type Query { 9 | setting: Setting 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/setting/graphql/types/ShippingSetting/ShippingSetting.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | allowedCountries: [String] 3 | weightUnit: String 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/setting/pages/admin/paymentSetting/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Payment Setting', 6 | description: 'Payment Setting' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/setting/pages/admin/paymentSetting/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/setting/payments" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/setting/pages/admin/storeSetting/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Store Setting', 6 | description: 'Store Setting' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/setting/pages/admin/storeSetting/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/setting/store" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/setting/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './setting.js'; 2 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/api/capturePaymentIntent/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/api/capturePaymentIntent/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/stripe/paymentIntents/capture", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/api/createPaymentIntent/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/api/createPaymentIntent/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/stripe/paymentIntents", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/api/refundPaymentIntent/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/api/refundPaymentIntent/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/stripe/paymentIntents/refund", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/api/stripeWebHook/bodyJson.js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.raw({ type: '*/*' })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/api/stripeWebHook/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/stripe/webhook", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/graphql/types/StripeSetting/StripeSetting.admin.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | stripeSecretKey: String 3 | stripeEndpointSecret: String 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/graphql/types/StripeSetting/StripeSetting.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | stripePaymentStatus: Int 3 | stripeDislayName: String 4 | stripePublishableKey: String 5 | stripePaymentMode: String 6 | } 7 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/stripe/pages/frontStore/stripeReturn/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/stripe/return" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/createTaxClass/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/createTaxClass/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "name": { 5 | "type": "string" 6 | } 7 | }, 8 | "additionalProperties": true, 9 | "required": ["name"] 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/createTaxClass/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/tax/classes", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/createTaxRate/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/createTaxRate/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/tax/classes/:class_id/rates", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/deleteTaxRate/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/deleteTaxRate/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/tax/rates/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/updateTaxClass/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/updateTaxClass/payloadSchema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "name": { 5 | "type": "string" 6 | } 7 | }, 8 | "additionalProperties": true, 9 | "required": ["name"] 10 | } 11 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/updateTaxClass/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/tax/classes/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/updateTaxRate/[context]borderParser[auth].js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | 3 | export default (request, response, delegate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/api/updateTaxRate/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/tax/rates/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/graphql/types/TaxSetting/TaxSetting.admin.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | defaultProductTaxClassId: Int 3 | defaultShippingTaxClassId: Int 4 | baseCalculationAddress: String 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/graphql/types/TaxSetting/TaxSetting.graphql: -------------------------------------------------------------------------------- 1 | extend type Setting { 2 | priceIncludingTax: Boolean 3 | } 4 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/graphql/types/TaxSetting/TaxSetting.resolvers.js: -------------------------------------------------------------------------------- 1 | import { getConfig } from '../../../../../lib/util/getConfig.js'; 2 | 3 | export default { 4 | Setting: { 5 | priceIncludingTax: () => getConfig('pricing.tax.price_including_tax', false) 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/pages/admin/taxSetting/index.js: -------------------------------------------------------------------------------- 1 | import { setContextValue } from '../../../../graphql/services/contextHelper.js'; 2 | 3 | export default (request) => { 4 | setContextValue(request, 'pageInfo', { 5 | title: 'Tax Setting', 6 | description: 'Tax Setting' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/evershop/src/modules/tax/pages/admin/taxSetting/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/setting/tax" 4 | } 5 | -------------------------------------------------------------------------------- /packages/evershop/src/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from './route.js'; 2 | export * from './widget.js'; 3 | export * from './request.js'; 4 | export * from './response.js'; 5 | -------------------------------------------------------------------------------- /packages/evershop/src/types/request.d.ts: -------------------------------------------------------------------------------- 1 | import { Request as ExpressRequest } from 'express'; 2 | import { Route } from './route.js'; 3 | export interface EvershopRequest extends ExpressRequest { 4 | isAdmin?: boolean; 5 | session?: any; 6 | currentRoute?: Route; 7 | } 8 | -------------------------------------------------------------------------------- /packages/evershop/src/types/response.ts: -------------------------------------------------------------------------------- 1 | import { Response as ExpressResponse } from 'express'; 2 | 3 | export interface EvershopResponse extends ExpressResponse { 4 | debugMiddlewares: { id: string; time: number }[]; 5 | } 6 | -------------------------------------------------------------------------------- /packages/evershop/src/types/route.d.ts: -------------------------------------------------------------------------------- 1 | export interface Route { 2 | id: string; 3 | name: string; 4 | method: string | string[]; 5 | path: string; 6 | isAdmin: boolean; 7 | isApi: boolean; 8 | folder: string; 9 | payloadSchema?: Record; 10 | access?: string; 11 | } 12 | -------------------------------------------------------------------------------- /packages/evershop/src/types/route.ts: -------------------------------------------------------------------------------- 1 | export interface Route { 2 | id: string; 3 | name: string; 4 | method: string | string[]; 5 | path: string; 6 | isAdmin: boolean; 7 | isApi: boolean; 8 | folder: string; 9 | payloadSchema?: Record; 10 | access?: string; 11 | } 12 | -------------------------------------------------------------------------------- /packages/google_login/pages/frontStore/gauth/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/auth/google" 4 | } 5 | -------------------------------------------------------------------------------- /packages/google_login/pages/frontStore/gcallback/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/auth/google/callback" 4 | } 5 | -------------------------------------------------------------------------------- /packages/google_login/pages/frontStore/login/GoogleLogin.scss: -------------------------------------------------------------------------------- 1 | .google__login__button { 2 | display: flex; 3 | justify-content: center; 4 | gap: 1rem; 5 | margin-top: 1.5rem; 6 | border: 1px solid #ccc; 7 | border-radius: 5px; 8 | padding-top: 1rem; 9 | padding-bottom: 1rem; 10 | } 11 | -------------------------------------------------------------------------------- /packages/google_login/services/getGoogleAuthUrl.js: -------------------------------------------------------------------------------- 1 | module.exports.getGoogleAuthUrl = (client_id, redirect_uri) => 2 | `https://accounts.google.com/o/oauth2/v2/auth?scope=profile%20email&access_type=offline&response_type=code&redirect_uri=${redirect_uri}&client_id=${client_id}`; 3 | -------------------------------------------------------------------------------- /packages/postgres-query-builder/toString.js: -------------------------------------------------------------------------------- 1 | export function toString(value) { 2 | // Check if value is an array or object 3 | if (Array.isArray(value) || (typeof value === 'object' && value !== null)) { 4 | // If value is an array, return a string with comma separated values 5 | return JSON.stringify(value); 6 | } else { 7 | return value; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/product_review/api/addReview/[context]bodyParser[auth].js: -------------------------------------------------------------------------------- 1 | const bodyParser = require('body-parser'); 2 | 3 | module.exports = (request, response, deledate, next) => { 4 | bodyParser.json({ inflate: false })(request, response, next); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/product_review/api/addReview/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["POST"], 3 | "path": "/reviews", 4 | "access": "public" 5 | } 6 | -------------------------------------------------------------------------------- /packages/product_review/api/approveReview/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/reviews/approved/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/product_review/api/deleteReview/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["DELETE"], 3 | "path": "/product/reviews/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/product_review/api/unApproveReview/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["PATCH"], 3 | "path": "/reviews/pending/:id", 4 | "access": "private" 5 | } 6 | -------------------------------------------------------------------------------- /packages/product_review/components/Rating.scss: -------------------------------------------------------------------------------- 1 | .rating__stars { 2 | display: flex; 3 | justify-self: start; 4 | } 5 | -------------------------------------------------------------------------------- /packages/product_review/pages/admin/reviewGrid/Heading.jsx: -------------------------------------------------------------------------------- 1 | import PageHeading from '@components/admin/cms/PageHeading'; 2 | import React from 'react'; 3 | 4 | export default function Heading() { 5 | return ; 6 | } 7 | 8 | export const layout = { 9 | areaId: 'content', 10 | sortOrder: 10 11 | }; 12 | -------------------------------------------------------------------------------- /packages/product_review/pages/admin/reviewGrid/route.json: -------------------------------------------------------------------------------- 1 | { 2 | "methods": ["GET"], 3 | "path": "/reviews" 4 | } 5 | -------------------------------------------------------------------------------- /translations/de/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, Ausgewählte Kollektion 2 | SHOP BY, Einkaufen nach 3 | Sort By, Sortieren nach 4 | There is no product to display, Es gibt keine Produkte zum Anzeigen 5 | ${count} products, ${count} Produkte 6 | Search results for "${keyword}", Suchergebnisse für \"${keyword}\" -------------------------------------------------------------------------------- /translations/de/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, Du wirst zu PayPal weitergeleitet. 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again., Es tut uns leid. Bei der Bearbeitung Ihrer Zahlung ist ein Fehler aufgetreten. Ihre Karte wurde nicht belastet. Bitte versuchen Sie es erneut. -------------------------------------------------------------------------------- /translations/es/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, Colección destacada 2 | SHOP BY, Comprar por 3 | Sort By, Ordenar por 4 | There is no product to display, No hay productos para mostrar 5 | ${count} products, ${count} productos 6 | Search results for "${keyword}", Resultados de búsqueda para "${keyword}" -------------------------------------------------------------------------------- /translations/es/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, Serás redirigido a PayPal. 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again., Lo sentimos. Hubo un error al procesar tu pago. Tu tarjeta no fue cargada. Por favor, inténtalo nuevamente. -------------------------------------------------------------------------------- /translations/fr/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, Collection en vedette 2 | SHOP BY, Acheter par 3 | Sort By, Trier par 4 | There is no product to display, Aucun produit à afficher 5 | ${count} products, ${count} produits 6 | Search results for "${keyword}", Résultats de recherche pour "${keyword}" 7 | -------------------------------------------------------------------------------- /translations/fr/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, Vous serez redirigé vers PayPal. 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again., Nous sommes désolés. Une erreur est survenue lors du traitement de votre paiement. Votre carte n'a pas été débitée. Veuillez réessayer. -------------------------------------------------------------------------------- /translations/gr/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection,Επιλεγμένη Συλλογή 2 | SHOP BY,Αγοράστε ανά 3 | Sort By,Ταξινόμηση ανά 4 | There is no product to display,Δεν υπάρχουν προϊόντα για προβολή 5 | ${count} products,${count} Προϊόντα 6 | "Search results for "${keyword}"","Αποτελέσματα αναζήτησης για "${keyword}"" 7 | -------------------------------------------------------------------------------- /translations/gr/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal,Θα ανακατευθυνθείτε στο PayPal 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again.,Λυπούμαστε. Παρουσιάστηκε ένα σφάλμα κατά την επεξεργασία της πληρωμής σας. Η κάρτα σας δεν χρεώθηκε. Παρακαλούμε προσπαθήστε ξανά. 3 | -------------------------------------------------------------------------------- /translations/hu/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, Kiemelt termékek 2 | SHOP BY, Vásárlás 3 | Sort By, Rendezés 4 | There is no product to display, Nincs megjeleníthető termék 5 | ${count} products, ${count} Termék 6 | Search results for "${keyword}", \"${keyword}\" keresési eredményei -------------------------------------------------------------------------------- /translations/it/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, In primo piano 2 | SHOP BY, FILTRA 3 | Sort By, Ordina per 4 | There is no product to display, Non ci sono prodotti da mostrare 5 | ${count} products, ${count} prodotti 6 | Search results for "${keyword}", Risultati per “${keyword}” 7 | -------------------------------------------------------------------------------- /translations/it/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, Verrai reindirizzato su PayPal. 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again.,Siamo spiacenti. Si è verificato un errore nell'elaborazione del pagamento. Non è stato addebitato alcun importo. Si prega di riprovare. -------------------------------------------------------------------------------- /translations/nb/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, Utvalgt samling 2 | SHOP BY, Handle etter 3 | Sort By, Sorter etter 4 | There is no product to display, Det er ingen produkter å vise 5 | ${count} products, ${count} produkter 6 | Search results for "${keyword}", Søkeresultater for "${keyword}" 7 | -------------------------------------------------------------------------------- /translations/nb/general.csv: -------------------------------------------------------------------------------- 1 | Discount ${discount} For All Orders Over ${price}, Rabatt på ${discount} for alle bestillinger over ${price} 2 | Please select, Vennligst velg... 3 | The page you requested does not exist., Siden du ba om eksisterer ikke. 4 | Continue shopping, Fortsett å handle 5 | 404 Page Not Found, 404 Side ikke funnet 6 | Home, Hjem 7 | Not found, Ikke funnet 8 | -------------------------------------------------------------------------------- /translations/nb/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, Du vil bli omdirigert til PayPal. 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again., Beklager. Det oppstod en feil under behandling av betalingen din. Kortet ditt ble ikke belastet. Vennligst prøv igjen. 3 | -------------------------------------------------------------------------------- /translations/ne/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, विशेष संग्रह 2 | SHOP BY, बाट किन्नुहोस् 3 | Sort By, द्वारा क्रमबद्ध 4 | There is no product to display, देखाउन कुनै पनि सामान छैन 5 | ${count} products, ${count} सामानहरू 6 | Search results for "${keyword}", "${keyword}"को लागि खोज परिणाम 7 | -------------------------------------------------------------------------------- /translations/ne/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, तपाईंलाई PayPal मा पुन: निर्देशित गरिनेछ। 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again., हामीलाई माफ गर्नुहोस। तपाईंको भुक्तानी प्रक्रिया गर्दा त्रुटि भयो। तपाईंको कार्ड चार्ज गरिएको छैन। कृपया पुन: प्रयास गर्नुहोस्। -------------------------------------------------------------------------------- /translations/nl/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, Uitgelichte collectie 2 | SHOP BY, Winkel op 3 | Sort By, Sorteren op 4 | There is no product to display, Er zijn geen producten om te tonen 5 | ${count} products, ${count} producten 6 | Search results for "${keyword}", Zoekresultaten voor “${keyword}” -------------------------------------------------------------------------------- /translations/nl/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, U wordt doorgestuurd naar PayPal. 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again.,Het spijt ons. Er is een fout opgetreden bij het verwerken van je betaling. Je kaart is niet gedebiteerd. Probeer het opnieuw. -------------------------------------------------------------------------------- /translations/pt/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, Coleções em destaque 2 | SHOP BY, COMPRAR POR 3 | Sort By, Ordenar Por 4 | There is no product to display, Nenhum há nenhum produto a ser exibido 5 | ${count} products, ${count} produtos 6 | Search results for "${keyword}", Resultados da busca por \"${keyword}\" -------------------------------------------------------------------------------- /translations/pt/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, Você será redirecionado para o PayPal. 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again., Sentimos muito. Ocorreu um erro ao processar seu pagamento. A cobrança em seu cartão não foi efetuada. Por favor tente novamente. -------------------------------------------------------------------------------- /translations/rs/catalog.csv: -------------------------------------------------------------------------------- 1 | SHOP BY, FILTRIRAJ 2 | Sort By, Sortiraj po 3 | There is no product to display, Nema proizvoda za prikaz 4 | ${count} products, ${count} proizvoda 5 | Search results for "${keyword}", Rezultati pretrage za „${keyword}” -------------------------------------------------------------------------------- /translations/rs/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, Bićete preusmereni na PayPal. 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again., Žao nam je. Došlo je do greške prilikom obrade plaćanja. Vaša kartica nije naplaćena. Molimo pokušajte ponovo. 3 | -------------------------------------------------------------------------------- /translations/ru/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, Вы будете перенаправлены на PayPal. 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again., Мы сожалеем. При обработке вашего платежа произошла ошибка. Средства с вашей карты не были списаны. Пожалуйста, попробуйте еще раз. -------------------------------------------------------------------------------- /translations/zh/catalog.csv: -------------------------------------------------------------------------------- 1 | Featured collection, 精选合集 2 | SHOP BY, 按类别购买 3 | Sort By, 按类别排序 4 | There is no product to display, 没有产品可显示 5 | ${count} products, ${count} 个产品 6 | Search results for "${keyword}", 搜索结果为 “${keyword}” -------------------------------------------------------------------------------- /translations/zh/general.csv: -------------------------------------------------------------------------------- 1 | Discount ${discount} For All Orders Over ${price}, 所有超过 ${price} 的订单可享受 ${discount} 折扣 2 | Please select, 请选择 3 | The page you requested does not exist., 您请求的页面不存在。 4 | Continue shopping, 继续购物 5 | 404 Page Not Found, 404 页面未找到 6 | Home, 首页 7 | Not found, 未找到 -------------------------------------------------------------------------------- /translations/zh/paypal.csv: -------------------------------------------------------------------------------- 1 | You will be redirected to PayPal, 您将被重定向至 PayPal 2 | We are sorry. There was an error processing your payment. Your card was not charged. Please try again.,我们很抱歉。在处理您的付款时发生了错误。您的银行卡尚未扣款。请重试。 --------------------------------------------------------------------------------