Browse Source

Merge branch 'master' into minor

Michael Bromley 4 years ago
parent
commit
cd897f31a6
36 changed files with 3856 additions and 3036 deletions
  1. 15 0
      CHANGELOG.md
  2. 1 1
      lerna.json
  3. 3 3
      packages/admin-ui-plugin/package.json
  4. 2 2
      packages/admin-ui/package.json
  5. 134 145
      packages/admin-ui/src/lib/core/src/common/generated-types.ts
  6. 1 1
      packages/admin-ui/src/lib/core/src/common/version.ts
  7. 10 0
      packages/admin-ui/src/lib/core/src/data/definitions/order-definitions.ts
  8. 16 2
      packages/admin-ui/src/lib/order/src/components/order-detail/order-detail.component.ts
  9. 671 513
      packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts
  10. 3 3
      packages/asset-server-plugin/package.json
  11. 1 1
      packages/common/package.json
  12. 625 581
      packages/common/src/generated-shop-types.ts
  13. 130 145
      packages/common/src/generated-types.ts
  14. 29 2
      packages/core/e2e/authentication-strategy.e2e-spec.ts
  15. 38 1
      packages/core/e2e/collection.e2e-spec.ts
  16. 71 0
      packages/core/e2e/fixtures/test-authentication-strategies.ts
  17. 671 513
      packages/core/e2e/graphql/generated-e2e-admin-types.ts
  18. 597 553
      packages/core/e2e/graphql/generated-e2e-shop-types.ts
  19. 69 0
      packages/core/e2e/shop-catalog.e2e-spec.ts
  20. 2 2
      packages/core/package.json
  21. 1 1
      packages/core/src/api/config/configure-graphql-module.ts
  22. 20 6
      packages/core/src/api/resolvers/entity/collection-entity.resolver.ts
  23. 1 3
      packages/core/src/api/schema/common/common-enums.graphql
  24. 21 5
      packages/core/src/config/catalog/default-collection-filters.ts
  25. 1 0
      packages/core/src/i18n/messages/en.json
  26. 24 12
      packages/core/src/service/helpers/external-authentication/external-authentication.service.ts
  27. 3 3
      packages/create/package.json
  28. 9 9
      packages/dev-server/package.json
  29. 671 513
      packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts
  30. 3 3
      packages/elasticsearch-plugin/package.json
  31. 3 3
      packages/email-plugin/package.json
  32. 3 3
      packages/job-queue-plugin/package.json
  33. 3 3
      packages/testing/package.json
  34. 4 4
      packages/ui-devkit/package.json
  35. 0 0
      schema-admin.json
  36. 0 0
      schema-shop.json

+ 15 - 0
CHANGELOG.md

@@ -1,3 +1,18 @@
+## <small>1.0.2 (2021-06-10)</small>
+
+
+#### Fixes
+
+* **admin-ui** Allow Channel tokens to be updated from ChannelDetail ([cafa04e](https://github.com/vendure-ecommerce/vendure/commit/cafa04e))
+* **core** Do not error when removing deleted variant from channel ([e3e8828](https://github.com/vendure-ecommerce/vendure/commit/e3e8828))
+* **core** Fix worker error when using custom Logger ([cbe764a](https://github.com/vendure-ecommerce/vendure/commit/cbe764a)), closes [#912](https://github.com/vendure-ecommerce/vendure/issues/912)
+* **core** Update search index when removing translated variants ([fced1dc](https://github.com/vendure-ecommerce/vendure/commit/fced1dc)), closes [#896](https://github.com/vendure-ecommerce/vendure/issues/896)
+* **create** Remove tslib resolution from package.json ([863ffcb](https://github.com/vendure-ecommerce/vendure/commit/863ffcb)), closes [#925](https://github.com/vendure-ecommerce/vendure/issues/925)
+
+#### Perf
+
+* **core** Improve performance of apply-collection-filters job (#915) ([1e8c137](https://github.com/vendure-ecommerce/vendure/commit/1e8c137)), closes [#915](https://github.com/vendure-ecommerce/vendure/issues/915)
+
 ## <small>1.0.1 (2021-05-27)</small>
 
 

+ 1 - 1
lerna.json

@@ -2,7 +2,7 @@
   "packages": [
     "packages/*"
   ],
-  "version": "1.0.1",
+  "version": "1.0.2",
   "npmClient": "yarn",
   "useWorkspaces": true,
   "command": {

+ 3 - 3
packages/admin-ui-plugin/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/admin-ui-plugin",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "main": "lib/index.js",
   "types": "lib/index.d.ts",
   "files": [
@@ -19,8 +19,8 @@
   "devDependencies": {
     "@types/express": "^4.17.8",
     "@types/fs-extra": "^9.0.1",
-    "@vendure/common": "^1.0.0",
-    "@vendure/core": "^1.0.1",
+    "@vendure/common": "^1.0.2",
+    "@vendure/core": "^1.0.2",
     "express": "^4.17.1",
     "rimraf": "^3.0.2",
     "typescript": "4.1.5"

+ 2 - 2
packages/admin-ui/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/admin-ui",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "license": "MIT",
   "scripts": {
     "ng": "ng",
@@ -37,7 +37,7 @@
     "@ng-select/ng-select": "^6.1.0",
     "@ngx-translate/core": "^13.0.0",
     "@ngx-translate/http-loader": "^6.0.0",
-    "@vendure/common": "^1.0.0",
+    "@vendure/common": "^1.0.2",
     "@webcomponents/custom-elements": "^1.4.3",
     "apollo-angular": "^2.4.0",
     "apollo-upload-client": "^14.1.3",

+ 134 - 145
packages/admin-ui/src/lib/core/src/common/generated-types.ts

@@ -1083,6 +1083,13 @@ export type MutationUpdateZoneArgs = {
   input: UpdateZoneInput;
 };
 
+export type AdministratorListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<AdministratorSortParameter>;
+  filter?: Maybe<AdministratorFilterParameter>;
+};
+
 export type CreateAdministratorInput = {
   firstName: Scalars['String'];
   lastName: Scalars['String'];
@@ -1157,12 +1164,12 @@ export type MimeTypeError = ErrorResult & {
 export type CreateAssetResult = Asset | MimeTypeError;
 
 export type AssetListOptions = {
+  tags?: Maybe<Array<Scalars['String']>>;
+  tagsOperator?: Maybe<LogicalOperator>;
   skip?: Maybe<Scalars['Int']>;
   take?: Maybe<Scalars['Int']>;
   sort?: Maybe<AssetSortParameter>;
   filter?: Maybe<AssetFilterParameter>;
-  tags?: Maybe<Array<Scalars['String']>>;
-  tagsOperator?: Maybe<LogicalOperator>;
 };
 
 export type CreateAssetInput = {
@@ -1201,6 +1208,10 @@ export type AssignAssetsToChannelInput = {
   channelId: Scalars['ID'];
 };
 
+export type AuthenticationInput = {
+  native?: Maybe<NativeAuthInput>;
+};
+
 export type NativeAuthenticationResult = CurrentUser | InvalidCredentialsError | NativeAuthStrategyError;
 
 export type AuthenticationResult = CurrentUser | InvalidCredentialsError;
@@ -1267,6 +1278,13 @@ export type CollectionProductVariantsArgs = {
   options?: Maybe<ProductVariantListOptions>;
 };
 
+export type CollectionListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<CollectionSortParameter>;
+  filter?: Maybe<CollectionFilterParameter>;
+};
+
 export type MoveCollectionInput = {
   collectionId: Scalars['ID'];
   parentId: Scalars['ID'];
@@ -1330,6 +1348,13 @@ export type UpdateCountryInput = {
   enabled?: Maybe<Scalars['Boolean']>;
 };
 
+export type CountryListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<CountrySortParameter>;
+  filter?: Maybe<CountryFilterParameter>;
+};
+
 export type Customer = Node & {
   __typename?: 'Customer';
   groups: Array<CustomerGroup>;
@@ -1364,6 +1389,13 @@ export type CustomerGroupList = PaginatedList & {
   totalItems: Scalars['Int'];
 };
 
+export type CustomerGroupListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<CustomerGroupSortParameter>;
+  filter?: Maybe<CustomerGroupFilterParameter>;
+};
+
 export type CreateCustomerGroupInput = {
   name: Scalars['String'];
   customerIds?: Maybe<Array<Scalars['ID']>>;
@@ -1384,6 +1416,13 @@ export type UpdateCustomerInput = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
+export type CustomerListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<CustomerSortParameter>;
+  filter?: Maybe<CustomerFilterParameter>;
+};
+
 export type AddNoteToCustomerInput = {
   id: Scalars['ID'];
   note: Scalars['String'];
@@ -1413,6 +1452,13 @@ export type Facet = Node & {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
+export type FacetListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<FacetSortParameter>;
+  filter?: Maybe<FacetFilterParameter>;
+};
+
 export type FacetTranslationInput = {
   id?: Maybe<Scalars['ID']>;
   languageCode: LanguageCode;
@@ -1549,6 +1595,13 @@ export enum JobState {
   CANCELLED = 'CANCELLED'
 }
 
+export type JobListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<JobSortParameter>;
+  filter?: Maybe<JobFilterParameter>;
+};
+
 export type JobList = PaginatedList & {
   __typename?: 'JobList';
   items: Array<Job>;
@@ -1684,6 +1737,7 @@ export type OrderModification = Node & {
 };
 
 export type OrderFilterParameter = {
+  customerLastName?: Maybe<StringOperators>;
   createdAt?: Maybe<DateOperators>;
   updatedAt?: Maybe<DateOperators>;
   orderPlacedAt?: Maybe<DateOperators>;
@@ -1698,10 +1752,10 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  customerLastName?: Maybe<StringOperators>;
 };
 
 export type OrderSortParameter = {
+  customerLastName?: Maybe<SortOrder>;
   id?: Maybe<SortOrder>;
   createdAt?: Maybe<SortOrder>;
   updatedAt?: Maybe<SortOrder>;
@@ -1715,7 +1769,13 @@ export type OrderSortParameter = {
   shippingWithTax?: Maybe<SortOrder>;
   total?: Maybe<SortOrder>;
   totalWithTax?: Maybe<SortOrder>;
-  customerLastName?: Maybe<SortOrder>;
+};
+
+export type OrderListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<OrderSortParameter>;
+  filter?: Maybe<OrderFilterParameter>;
 };
 
 export type UpdateOrderInput = {
@@ -2034,6 +2094,13 @@ export type PaymentMethodList = PaginatedList & {
   totalItems: Scalars['Int'];
 };
 
+export type PaymentMethodListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<PaymentMethodSortParameter>;
+  filter?: Maybe<PaymentMethodFilterParameter>;
+};
+
 export type CreatePaymentMethodInput = {
   name: Scalars['String'];
   code: Scalars['String'];
@@ -2116,7 +2183,7 @@ export type ProductVariant = Node & {
   options: Array<ProductOption>;
   facetValues: Array<FacetValue>;
   translations: Array<ProductVariantTranslation>;
-  customFields?: Maybe<ProductVariantCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -2202,6 +2269,20 @@ export type StockMovementListOptions = {
   take?: Maybe<Scalars['Int']>;
 };
 
+export type ProductListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<ProductSortParameter>;
+  filter?: Maybe<ProductFilterParameter>;
+};
+
+export type ProductVariantListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<ProductVariantSortParameter>;
+  filter?: Maybe<ProductVariantFilterParameter>;
+};
+
 export type ProductTranslationInput = {
   id?: Maybe<Scalars['ID']>;
   languageCode: LanguageCode;
@@ -2257,7 +2338,7 @@ export type CreateProductVariantInput = {
   outOfStockThreshold?: Maybe<Scalars['Int']>;
   useGlobalOutOfStockThreshold?: Maybe<Scalars['Boolean']>;
   trackInventory?: Maybe<GlobalFlag>;
-  customFields?: Maybe<CreateProductVariantCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductVariantInput = {
@@ -2274,7 +2355,7 @@ export type UpdateProductVariantInput = {
   outOfStockThreshold?: Maybe<Scalars['Int']>;
   useGlobalOutOfStockThreshold?: Maybe<Scalars['Boolean']>;
   trackInventory?: Maybe<GlobalFlag>;
-  customFields?: Maybe<UpdateProductVariantCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type AssignProductsToChannelInput = {
@@ -2309,6 +2390,13 @@ export type ProductOptionInUseError = ErrorResult & {
 
 export type RemoveOptionGroupFromProductResult = Product | ProductOptionInUseError;
 
+export type PromotionListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<PromotionSortParameter>;
+  filter?: Maybe<PromotionFilterParameter>;
+};
+
 export type CreatePromotionInput = {
   name: Scalars['String'];
   enabled: Scalars['Boolean'];
@@ -2353,6 +2441,13 @@ export type CreatePromotionResult = Promotion | MissingConditionsError;
 
 export type UpdatePromotionResult = Promotion | MissingConditionsError;
 
+export type RoleListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<RoleSortParameter>;
+  filter?: Maybe<RoleFilterParameter>;
+};
+
 export type CreateRoleInput = {
   code: Scalars['String'];
   description: Scalars['String'];
@@ -2368,6 +2463,13 @@ export type UpdateRoleInput = {
   channelIds?: Maybe<Array<Scalars['ID']>>;
 };
 
+export type ShippingMethodListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<ShippingMethodSortParameter>;
+  filter?: Maybe<ShippingMethodFilterParameter>;
+};
+
 export type ShippingMethodTranslationInput = {
   id?: Maybe<Scalars['ID']>;
   languageCode: LanguageCode;
@@ -2516,6 +2618,13 @@ export type StockMovementList = {
   totalItems: Scalars['Int'];
 };
 
+export type TagListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<TagSortParameter>;
+  filter?: Maybe<TagFilterParameter>;
+};
+
 export type CreateTagInput = {
   value: Scalars['String'];
 };
@@ -2536,6 +2645,13 @@ export type UpdateTaxCategoryInput = {
   isDefault?: Maybe<Scalars['Boolean']>;
 };
 
+export type TaxRateListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<TaxRateSortParameter>;
+  filter?: Maybe<TaxRateFilterParameter>;
+};
+
 export type CreateTaxRateInput = {
   name: Scalars['String'];
   enabled: Scalars['Boolean'];
@@ -3743,6 +3859,13 @@ export type HistoryEntryList = PaginatedList & {
   totalItems: Scalars['Int'];
 };
 
+export type HistoryEntryListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<HistoryEntrySortParameter>;
+  filter?: Maybe<HistoryEntryFilterParameter>;
+};
+
 /**
  * @description
  * Languages in the form of a ISO 639-1 language code with optional
@@ -4511,125 +4634,6 @@ export type Zone = Node & {
   members: Array<Country>;
 };
 
-export type AdministratorListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<AdministratorSortParameter>;
-  filter?: Maybe<AdministratorFilterParameter>;
-};
-
-export type CollectionListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<CollectionSortParameter>;
-  filter?: Maybe<CollectionFilterParameter>;
-};
-
-export type CountryListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<CountrySortParameter>;
-  filter?: Maybe<CountryFilterParameter>;
-};
-
-export type CustomerGroupListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<CustomerGroupSortParameter>;
-  filter?: Maybe<CustomerGroupFilterParameter>;
-};
-
-export type CustomerListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<CustomerSortParameter>;
-  filter?: Maybe<CustomerFilterParameter>;
-};
-
-export type FacetListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<FacetSortParameter>;
-  filter?: Maybe<FacetFilterParameter>;
-};
-
-export type JobListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<JobSortParameter>;
-  filter?: Maybe<JobFilterParameter>;
-};
-
-export type OrderListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<OrderSortParameter>;
-  filter?: Maybe<OrderFilterParameter>;
-};
-
-export type PaymentMethodListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<PaymentMethodSortParameter>;
-  filter?: Maybe<PaymentMethodFilterParameter>;
-};
-
-export type ProductListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<ProductSortParameter>;
-  filter?: Maybe<ProductFilterParameter>;
-};
-
-export type ProductVariantListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<ProductVariantSortParameter>;
-  filter?: Maybe<ProductVariantFilterParameter>;
-};
-
-export type PromotionListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<PromotionSortParameter>;
-  filter?: Maybe<PromotionFilterParameter>;
-};
-
-export type RoleListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<RoleSortParameter>;
-  filter?: Maybe<RoleFilterParameter>;
-};
-
-export type ShippingMethodListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<ShippingMethodSortParameter>;
-  filter?: Maybe<ShippingMethodFilterParameter>;
-};
-
-export type TagListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<TagSortParameter>;
-  filter?: Maybe<TagFilterParameter>;
-};
-
-export type TaxRateListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<TaxRateSortParameter>;
-  filter?: Maybe<TaxRateFilterParameter>;
-};
-
-export type HistoryEntryListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<HistoryEntrySortParameter>;
-  filter?: Maybe<HistoryEntryFilterParameter>;
-};
-
 export type AdministratorFilterParameter = {
   createdAt?: Maybe<DateOperators>;
   updatedAt?: Maybe<DateOperators>;
@@ -4836,7 +4840,6 @@ export type ProductVariantFilterParameter = {
   currencyCode?: Maybe<StringOperators>;
   priceWithTax?: Maybe<NumberOperators>;
   stockLevel?: Maybe<StringOperators>;
-  discountPrice?: Maybe<NumberOperators>;
 };
 
 export type ProductVariantSortParameter = {
@@ -4852,7 +4855,6 @@ export type ProductVariantSortParameter = {
   price?: Maybe<SortOrder>;
   priceWithTax?: Maybe<SortOrder>;
   stockLevel?: Maybe<SortOrder>;
-  discountPrice?: Maybe<SortOrder>;
 };
 
 export type PromotionFilterParameter = {
@@ -4953,23 +4955,6 @@ export type HistoryEntrySortParameter = {
   updatedAt?: Maybe<SortOrder>;
 };
 
-export type ProductVariantCustomFields = {
-  __typename?: 'ProductVariantCustomFields';
-  discountPrice?: Maybe<Scalars['Int']>;
-};
-
-export type CreateProductVariantCustomFieldsInput = {
-  discountPrice?: Maybe<Scalars['Int']>;
-};
-
-export type UpdateProductVariantCustomFieldsInput = {
-  discountPrice?: Maybe<Scalars['Int']>;
-};
-
-export type AuthenticationInput = {
-  native?: Maybe<NativeAuthInput>;
-};
-
 export type NativeAuthInput = {
   username: Scalars['String'];
   password: Scalars['String'];
@@ -6042,9 +6027,11 @@ export type CreateFulfillmentMutation = { addFulfillmentToOrder: (
     & ErrorResult_InvalidFulfillmentHandlerError_Fragment
   ) | (
     { __typename?: 'FulfillmentStateTransitionError' }
+    & Pick<FulfillmentStateTransitionError, 'errorCode' | 'message' | 'transitionError'>
     & ErrorResult_FulfillmentStateTransitionError_Fragment
   ) | (
     { __typename?: 'CreateFulfillmentError' }
+    & Pick<CreateFulfillmentError, 'errorCode' | 'message' | 'fulfillmentHandlerError'>
     & ErrorResult_CreateFulfillmentError_Fragment
   ) };
 
@@ -8932,6 +8919,8 @@ export namespace CreateFulfillment {
   export type Variables = CreateFulfillmentMutationVariables;
   export type Mutation = CreateFulfillmentMutation;
   export type AddFulfillmentToOrder = (NonNullable<CreateFulfillmentMutation['addFulfillmentToOrder']>);
+  export type CreateFulfillmentErrorInlineFragment = (DiscriminateUnion<(NonNullable<CreateFulfillmentMutation['addFulfillmentToOrder']>), { __typename?: 'CreateFulfillmentError' }>);
+  export type FulfillmentStateTransitionErrorInlineFragment = (DiscriminateUnion<(NonNullable<CreateFulfillmentMutation['addFulfillmentToOrder']>), { __typename?: 'FulfillmentStateTransitionError' }>);
 }
 
 export namespace CancelOrder {

+ 1 - 1
packages/admin-ui/src/lib/core/src/common/version.ts

@@ -1,2 +1,2 @@
 // Auto-generated by the set-version.js script.
-export const ADMIN_UI_VERSION = '1.0.1';
+export const ADMIN_UI_VERSION = '1.0.2';

+ 10 - 0
packages/admin-ui/src/lib/core/src/data/definitions/order-definitions.ts

@@ -308,6 +308,16 @@ export const CREATE_FULFILLMENT = gql`
     mutation CreateFulfillment($input: FulfillOrderInput!) {
         addFulfillmentToOrder(input: $input) {
             ...Fulfillment
+            ... on CreateFulfillmentError {
+                errorCode
+                message
+                fulfillmentHandlerError
+            }
+            ... on FulfillmentStateTransitionError {
+                errorCode
+                message
+                transitionError
+            }
             ...ErrorResult
         }
     }

+ 16 - 2
packages/admin-ui/src/lib/order/src/components/order-detail/order-detail.component.ts

@@ -64,6 +64,7 @@ export class OrderDetailComponent
         'Modifying',
         'ArrangingAdditionalPayment',
     ];
+
     constructor(
         router: Router,
         route: ActivatedRoute,
@@ -332,15 +333,28 @@ export class OrderDetailComponent
             )
             .subscribe(result => {
                 if (result) {
-                    switch (result.addFulfillmentToOrder.__typename) {
+                    const { addFulfillmentToOrder } = result;
+                    switch (addFulfillmentToOrder.__typename) {
                         case 'Fulfillment':
                             this.notificationService.success(_('order.create-fulfillment-success'));
                             break;
                         case 'EmptyOrderLineSelectionError':
                         case 'InsufficientStockOnHandError':
                         case 'ItemsAlreadyFulfilledError':
-                            this.notificationService.error(result.addFulfillmentToOrder.message);
+                        case 'InvalidFulfillmentHandlerError':
+                            this.notificationService.error(addFulfillmentToOrder.message);
+                            break;
+                        case 'FulfillmentStateTransitionError':
+                            this.notificationService.error(addFulfillmentToOrder.transitionError);
+                            break;
+                        case 'CreateFulfillmentError':
+                            this.notificationService.error(addFulfillmentToOrder.fulfillmentHandlerError);
                             break;
+                        case undefined:
+                            this.notificationService.error(JSON.stringify(addFulfillmentToOrder));
+                            break;
+                        default:
+                            assertNever(addFulfillmentToOrder);
                     }
                 }
             });

File diff suppressed because it is too large
+ 671 - 513
packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts


+ 3 - 3
packages/asset-server-plugin/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/asset-server-plugin",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "main": "lib/index.js",
   "types": "lib/index.d.ts",
   "files": [
@@ -22,8 +22,8 @@
     "@types/fs-extra": "^9.0.8",
     "@types/node-fetch": "^2.5.8",
     "@types/sharp": "^0.27.1",
-    "@vendure/common": "^1.0.0",
-    "@vendure/core": "^1.0.1",
+    "@vendure/common": "^1.0.2",
+    "@vendure/core": "^1.0.2",
     "aws-sdk": "^2.856.0",
     "express": "^4.17.1",
     "node-fetch": "^2.6.1",

+ 1 - 1
packages/common/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/common",
-  "version": "1.0.0",
+  "version": "1.0.2",
   "main": "index.js",
   "license": "MIT",
   "scripts": {

File diff suppressed because it is too large
+ 625 - 581
packages/common/src/generated-shop-types.ts


+ 130 - 145
packages/common/src/generated-types.ts

@@ -1046,6 +1046,13 @@ export type MutationRemoveMembersFromZoneArgs = {
   memberIds: Array<Scalars['ID']>;
 };
 
+export type AdministratorListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<AdministratorSortParameter>;
+  filter?: Maybe<AdministratorFilterParameter>;
+};
+
 export type CreateAdministratorInput = {
   firstName: Scalars['String'];
   lastName: Scalars['String'];
@@ -1120,12 +1127,12 @@ export type MimeTypeError = ErrorResult & {
 export type CreateAssetResult = Asset | MimeTypeError;
 
 export type AssetListOptions = {
+  tags?: Maybe<Array<Scalars['String']>>;
+  tagsOperator?: Maybe<LogicalOperator>;
   skip?: Maybe<Scalars['Int']>;
   take?: Maybe<Scalars['Int']>;
   sort?: Maybe<AssetSortParameter>;
   filter?: Maybe<AssetFilterParameter>;
-  tags?: Maybe<Array<Scalars['String']>>;
-  tagsOperator?: Maybe<LogicalOperator>;
 };
 
 export type CreateAssetInput = {
@@ -1164,6 +1171,10 @@ export type AssignAssetsToChannelInput = {
   channelId: Scalars['ID'];
 };
 
+export type AuthenticationInput = {
+  native?: Maybe<NativeAuthInput>;
+};
+
 export type NativeAuthenticationResult = CurrentUser | InvalidCredentialsError | NativeAuthStrategyError;
 
 export type AuthenticationResult = CurrentUser | InvalidCredentialsError;
@@ -1230,6 +1241,13 @@ export type CollectionProductVariantsArgs = {
   options?: Maybe<ProductVariantListOptions>;
 };
 
+export type CollectionListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<CollectionSortParameter>;
+  filter?: Maybe<CollectionFilterParameter>;
+};
+
 export type MoveCollectionInput = {
   collectionId: Scalars['ID'];
   parentId: Scalars['ID'];
@@ -1293,6 +1311,13 @@ export type UpdateCountryInput = {
   enabled?: Maybe<Scalars['Boolean']>;
 };
 
+export type CountryListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<CountrySortParameter>;
+  filter?: Maybe<CountryFilterParameter>;
+};
+
 export type Customer = Node & {
   __typename?: 'Customer';
   groups: Array<CustomerGroup>;
@@ -1327,6 +1352,13 @@ export type CustomerGroupList = PaginatedList & {
   totalItems: Scalars['Int'];
 };
 
+export type CustomerGroupListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<CustomerGroupSortParameter>;
+  filter?: Maybe<CustomerGroupFilterParameter>;
+};
+
 export type CreateCustomerGroupInput = {
   name: Scalars['String'];
   customerIds?: Maybe<Array<Scalars['ID']>>;
@@ -1347,6 +1379,13 @@ export type UpdateCustomerInput = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
+export type CustomerListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<CustomerSortParameter>;
+  filter?: Maybe<CustomerFilterParameter>;
+};
+
 export type AddNoteToCustomerInput = {
   id: Scalars['ID'];
   note: Scalars['String'];
@@ -1376,6 +1415,13 @@ export type Facet = Node & {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
+export type FacetListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<FacetSortParameter>;
+  filter?: Maybe<FacetFilterParameter>;
+};
+
 export type FacetTranslationInput = {
   id?: Maybe<Scalars['ID']>;
   languageCode: LanguageCode;
@@ -1512,6 +1558,13 @@ export enum JobState {
   CANCELLED = 'CANCELLED'
 }
 
+export type JobListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<JobSortParameter>;
+  filter?: Maybe<JobFilterParameter>;
+};
+
 export type JobList = PaginatedList & {
   __typename?: 'JobList';
   items: Array<Job>;
@@ -1647,6 +1700,7 @@ export type OrderModification = Node & {
 };
 
 export type OrderFilterParameter = {
+  customerLastName?: Maybe<StringOperators>;
   createdAt?: Maybe<DateOperators>;
   updatedAt?: Maybe<DateOperators>;
   orderPlacedAt?: Maybe<DateOperators>;
@@ -1661,10 +1715,10 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  customerLastName?: Maybe<StringOperators>;
 };
 
 export type OrderSortParameter = {
+  customerLastName?: Maybe<SortOrder>;
   id?: Maybe<SortOrder>;
   createdAt?: Maybe<SortOrder>;
   updatedAt?: Maybe<SortOrder>;
@@ -1678,7 +1732,13 @@ export type OrderSortParameter = {
   shippingWithTax?: Maybe<SortOrder>;
   total?: Maybe<SortOrder>;
   totalWithTax?: Maybe<SortOrder>;
-  customerLastName?: Maybe<SortOrder>;
+};
+
+export type OrderListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<OrderSortParameter>;
+  filter?: Maybe<OrderFilterParameter>;
 };
 
 export type UpdateOrderInput = {
@@ -1997,6 +2057,13 @@ export type PaymentMethodList = PaginatedList & {
   totalItems: Scalars['Int'];
 };
 
+export type PaymentMethodListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<PaymentMethodSortParameter>;
+  filter?: Maybe<PaymentMethodFilterParameter>;
+};
+
 export type CreatePaymentMethodInput = {
   name: Scalars['String'];
   code: Scalars['String'];
@@ -2079,7 +2146,7 @@ export type ProductVariant = Node & {
   options: Array<ProductOption>;
   facetValues: Array<FacetValue>;
   translations: Array<ProductVariantTranslation>;
-  customFields?: Maybe<ProductVariantCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -2165,6 +2232,20 @@ export type StockMovementListOptions = {
   take?: Maybe<Scalars['Int']>;
 };
 
+export type ProductListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<ProductSortParameter>;
+  filter?: Maybe<ProductFilterParameter>;
+};
+
+export type ProductVariantListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<ProductVariantSortParameter>;
+  filter?: Maybe<ProductVariantFilterParameter>;
+};
+
 export type ProductTranslationInput = {
   id?: Maybe<Scalars['ID']>;
   languageCode: LanguageCode;
@@ -2220,7 +2301,7 @@ export type CreateProductVariantInput = {
   outOfStockThreshold?: Maybe<Scalars['Int']>;
   useGlobalOutOfStockThreshold?: Maybe<Scalars['Boolean']>;
   trackInventory?: Maybe<GlobalFlag>;
-  customFields?: Maybe<CreateProductVariantCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateProductVariantInput = {
@@ -2237,7 +2318,7 @@ export type UpdateProductVariantInput = {
   outOfStockThreshold?: Maybe<Scalars['Int']>;
   useGlobalOutOfStockThreshold?: Maybe<Scalars['Boolean']>;
   trackInventory?: Maybe<GlobalFlag>;
-  customFields?: Maybe<UpdateProductVariantCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type AssignProductsToChannelInput = {
@@ -2272,6 +2353,13 @@ export type ProductOptionInUseError = ErrorResult & {
 
 export type RemoveOptionGroupFromProductResult = Product | ProductOptionInUseError;
 
+export type PromotionListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<PromotionSortParameter>;
+  filter?: Maybe<PromotionFilterParameter>;
+};
+
 export type CreatePromotionInput = {
   name: Scalars['String'];
   enabled: Scalars['Boolean'];
@@ -2316,6 +2404,13 @@ export type CreatePromotionResult = Promotion | MissingConditionsError;
 
 export type UpdatePromotionResult = Promotion | MissingConditionsError;
 
+export type RoleListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<RoleSortParameter>;
+  filter?: Maybe<RoleFilterParameter>;
+};
+
 export type CreateRoleInput = {
   code: Scalars['String'];
   description: Scalars['String'];
@@ -2331,6 +2426,13 @@ export type UpdateRoleInput = {
   channelIds?: Maybe<Array<Scalars['ID']>>;
 };
 
+export type ShippingMethodListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<ShippingMethodSortParameter>;
+  filter?: Maybe<ShippingMethodFilterParameter>;
+};
+
 export type ShippingMethodTranslationInput = {
   id?: Maybe<Scalars['ID']>;
   languageCode: LanguageCode;
@@ -2479,6 +2581,13 @@ export type StockMovementList = {
   totalItems: Scalars['Int'];
 };
 
+export type TagListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<TagSortParameter>;
+  filter?: Maybe<TagFilterParameter>;
+};
+
 export type CreateTagInput = {
   value: Scalars['String'];
 };
@@ -2499,6 +2608,13 @@ export type UpdateTaxCategoryInput = {
   isDefault?: Maybe<Scalars['Boolean']>;
 };
 
+export type TaxRateListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<TaxRateSortParameter>;
+  filter?: Maybe<TaxRateFilterParameter>;
+};
+
 export type CreateTaxRateInput = {
   name: Scalars['String'];
   enabled: Scalars['Boolean'];
@@ -3705,6 +3821,13 @@ export type HistoryEntryList = PaginatedList & {
   totalItems: Scalars['Int'];
 };
 
+export type HistoryEntryListOptions = {
+  skip?: Maybe<Scalars['Int']>;
+  take?: Maybe<Scalars['Int']>;
+  sort?: Maybe<HistoryEntrySortParameter>;
+  filter?: Maybe<HistoryEntryFilterParameter>;
+};
+
 /**
  * @description
  * Languages in the form of a ISO 639-1 language code with optional
@@ -4473,125 +4596,6 @@ export type Zone = Node & {
   members: Array<Country>;
 };
 
-export type AdministratorListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<AdministratorSortParameter>;
-  filter?: Maybe<AdministratorFilterParameter>;
-};
-
-export type CollectionListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<CollectionSortParameter>;
-  filter?: Maybe<CollectionFilterParameter>;
-};
-
-export type CountryListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<CountrySortParameter>;
-  filter?: Maybe<CountryFilterParameter>;
-};
-
-export type CustomerGroupListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<CustomerGroupSortParameter>;
-  filter?: Maybe<CustomerGroupFilterParameter>;
-};
-
-export type CustomerListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<CustomerSortParameter>;
-  filter?: Maybe<CustomerFilterParameter>;
-};
-
-export type FacetListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<FacetSortParameter>;
-  filter?: Maybe<FacetFilterParameter>;
-};
-
-export type JobListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<JobSortParameter>;
-  filter?: Maybe<JobFilterParameter>;
-};
-
-export type OrderListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<OrderSortParameter>;
-  filter?: Maybe<OrderFilterParameter>;
-};
-
-export type PaymentMethodListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<PaymentMethodSortParameter>;
-  filter?: Maybe<PaymentMethodFilterParameter>;
-};
-
-export type ProductListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<ProductSortParameter>;
-  filter?: Maybe<ProductFilterParameter>;
-};
-
-export type ProductVariantListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<ProductVariantSortParameter>;
-  filter?: Maybe<ProductVariantFilterParameter>;
-};
-
-export type PromotionListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<PromotionSortParameter>;
-  filter?: Maybe<PromotionFilterParameter>;
-};
-
-export type RoleListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<RoleSortParameter>;
-  filter?: Maybe<RoleFilterParameter>;
-};
-
-export type ShippingMethodListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<ShippingMethodSortParameter>;
-  filter?: Maybe<ShippingMethodFilterParameter>;
-};
-
-export type TagListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<TagSortParameter>;
-  filter?: Maybe<TagFilterParameter>;
-};
-
-export type TaxRateListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<TaxRateSortParameter>;
-  filter?: Maybe<TaxRateFilterParameter>;
-};
-
-export type HistoryEntryListOptions = {
-  skip?: Maybe<Scalars['Int']>;
-  take?: Maybe<Scalars['Int']>;
-  sort?: Maybe<HistoryEntrySortParameter>;
-  filter?: Maybe<HistoryEntryFilterParameter>;
-};
-
 export type AdministratorFilterParameter = {
   createdAt?: Maybe<DateOperators>;
   updatedAt?: Maybe<DateOperators>;
@@ -4798,7 +4802,6 @@ export type ProductVariantFilterParameter = {
   currencyCode?: Maybe<StringOperators>;
   priceWithTax?: Maybe<NumberOperators>;
   stockLevel?: Maybe<StringOperators>;
-  discountPrice?: Maybe<NumberOperators>;
 };
 
 export type ProductVariantSortParameter = {
@@ -4814,7 +4817,6 @@ export type ProductVariantSortParameter = {
   price?: Maybe<SortOrder>;
   priceWithTax?: Maybe<SortOrder>;
   stockLevel?: Maybe<SortOrder>;
-  discountPrice?: Maybe<SortOrder>;
 };
 
 export type PromotionFilterParameter = {
@@ -4915,23 +4917,6 @@ export type HistoryEntrySortParameter = {
   updatedAt?: Maybe<SortOrder>;
 };
 
-export type ProductVariantCustomFields = {
-  __typename?: 'ProductVariantCustomFields';
-  discountPrice?: Maybe<Scalars['Int']>;
-};
-
-export type CreateProductVariantCustomFieldsInput = {
-  discountPrice?: Maybe<Scalars['Int']>;
-};
-
-export type UpdateProductVariantCustomFieldsInput = {
-  discountPrice?: Maybe<Scalars['Int']>;
-};
-
-export type AuthenticationInput = {
-  native?: Maybe<NativeAuthInput>;
-};
-
 export type NativeAuthInput = {
   username: Scalars['String'];
   password: Scalars['String'];

+ 29 - 2
packages/core/e2e/authentication-strategy.e2e-spec.ts

@@ -12,13 +12,14 @@ import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-conf
 import {
     TestAuthenticationStrategy,
     TestAuthenticationStrategy2,
+    TestSSOStrategyAdmin,
+    TestSSOStrategyShop,
     VALID_AUTH_TOKEN,
 } from './fixtures/test-authentication-strategies';
 import { CURRENT_USER_FRAGMENT } from './graphql/fragments';
 import {
     Authenticate,
     CreateCustomer,
-    CurrentUser,
     CurrentUserFragment,
     CustomerFragment,
     DeleteCustomer,
@@ -31,7 +32,6 @@ import {
 import { Register } from './graphql/generated-e2e-shop-types';
 import { CREATE_CUSTOMER, DELETE_CUSTOMER, GET_CUSTOMER_HISTORY, ME } from './graphql/shared-definitions';
 import { REGISTER_ACCOUNT } from './graphql/shop-definitions';
-import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
 describe('AuthenticationStrategy', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
@@ -41,7 +41,9 @@ describe('AuthenticationStrategy', () => {
                     new NativeAuthenticationStrategy(),
                     new TestAuthenticationStrategy(),
                     new TestAuthenticationStrategy2(),
+                    new TestSSOStrategyShop(),
                 ],
+                adminAuthenticationStrategy: [new NativeAuthenticationStrategy(), new TestSSOStrategyAdmin()],
             },
         }),
     );
@@ -292,6 +294,31 @@ describe('AuthenticationStrategy', () => {
                 },
             ]);
         });
+
+        // https://github.com/vendure-ecommerce/vendure/issues/926
+        it('Customer and Admin external auth does not reuse same User for different strategies', async () => {
+            const emailAddress = 'hello@test-domain.com';
+            await adminClient.asAnonymousUser();
+            const { authenticate: adminAuth } = await adminClient.query<Authenticate.Mutation>(AUTHENTICATE, {
+                input: {
+                    test_sso_strategy_admin: {
+                        email: emailAddress,
+                    },
+                },
+            });
+            currentUserGuard.assertSuccess(adminAuth);
+
+            const { authenticate: shopAuth } = await shopClient.query<Authenticate.Mutation>(AUTHENTICATE, {
+                input: {
+                    test_sso_strategy_shop: {
+                        email: emailAddress,
+                    },
+                },
+            });
+            currentUserGuard.assertSuccess(shopAuth);
+
+            expect(adminAuth.id).not.toBe(shopAuth.id);
+        });
     });
 
     describe('native auth', () => {

+ 38 - 1
packages/core/e2e/collection.e2e-spec.ts

@@ -1286,12 +1286,14 @@ describe('Collection resolver', () => {
             async function createVariantNameFilteredCollection(
                 operator: string,
                 term: string,
+                parentId?: string,
             ): Promise<Collection.Fragment> {
                 const { createCollection } = await adminClient.query<
                     CreateCollection.Mutation,
                     CreateCollection.Variables
                 >(CREATE_COLLECTION, {
                     input: {
+                        parentId,
                         translations: [
                             {
                                 languageCode: LanguageCode.en,
@@ -1395,6 +1397,41 @@ describe('Collection resolver', () => {
                     'Hat',
                 ]);
             });
+
+            // https://github.com/vendure-ecommerce/vendure/issues/927
+            it('nested variantName filter', async () => {
+                const parent = await createVariantNameFilteredCollection('contains', 'lap');
+
+                const parentResult = await adminClient.query<
+                    GetCollectionProducts.Query,
+                    GetCollectionProducts.Variables
+                >(GET_COLLECTION_PRODUCT_VARIANTS, {
+                    id: parent.id,
+                });
+
+                expect(parentResult.collection?.productVariants.items.map(i => i.name)).toEqual([
+                    'Laptop 13 inch 8GB',
+                    'Laptop 15 inch 8GB',
+                    'Laptop 13 inch 16GB',
+                    'Laptop 15 inch 16GB',
+                ]);
+
+                const child = await createVariantNameFilteredCollection('contains', 'GB', parent.id);
+
+                const childResult = await adminClient.query<
+                    GetCollectionProducts.Query,
+                    GetCollectionProducts.Variables
+                >(GET_COLLECTION_PRODUCT_VARIANTS, {
+                    id: child.id,
+                });
+
+                expect(childResult.collection?.productVariants.items.map(i => i.name)).toEqual([
+                    'Laptop 13 inch 8GB',
+                    'Laptop 15 inch 8GB',
+                    'Laptop 13 inch 16GB',
+                    'Laptop 15 inch 16GB',
+                ]);
+            });
         });
 
         describe('re-evaluation of contents on changes', () => {
@@ -1606,7 +1643,7 @@ describe('Collection resolver', () => {
                     name: 'endsWith camera',
                 },
                 {
-                    id: 'T_21',
+                    id: 'T_23',
                     name: 'pear electronics',
                 },
             ]);

+ 71 - 0
packages/core/e2e/fixtures/test-authentication-strategies.ts

@@ -3,6 +3,7 @@ import {
     ExternalAuthenticationService,
     Injector,
     RequestContext,
+    RoleService,
     User,
 } from '@vendure/core';
 import { DocumentNode } from 'graphql';
@@ -65,6 +66,76 @@ export class TestAuthenticationStrategy implements AuthenticationStrategy<TestAu
     }
 }
 
+export class TestSSOStrategyAdmin implements AuthenticationStrategy<{ email: string }> {
+    readonly name = 'test_sso_strategy_admin';
+    private externalAuthenticationService: ExternalAuthenticationService;
+    private roleService: RoleService;
+
+    init(injector: Injector) {
+        this.externalAuthenticationService = injector.get(ExternalAuthenticationService);
+        this.roleService = injector.get(RoleService);
+    }
+
+    defineInputType(): DocumentNode {
+        return gql`
+            input TestSSOInputAdmin {
+                email: String!
+            }
+        `;
+    }
+
+    async authenticate(ctx: RequestContext, data: { email: string }): Promise<User | false | string> {
+        const { email } = data;
+        const user = await this.externalAuthenticationService.findUser(ctx, this.name, email);
+        if (user) {
+            return user;
+        }
+        const superAdminRole = await this.roleService.getSuperAdminRole();
+        return this.externalAuthenticationService.createAdministratorAndUser(ctx, {
+            strategy: this.name,
+            externalIdentifier: email,
+            emailAddress: email,
+            firstName: 'SSO Admin First Name',
+            lastName: 'SSO Admin Last Name',
+            identifier: email,
+            roles: [superAdminRole],
+        });
+    }
+}
+
+export class TestSSOStrategyShop implements AuthenticationStrategy<{ email: string }> {
+    readonly name = 'test_sso_strategy_shop';
+    private externalAuthenticationService: ExternalAuthenticationService;
+
+    init(injector: Injector) {
+        this.externalAuthenticationService = injector.get(ExternalAuthenticationService);
+    }
+
+    defineInputType(): DocumentNode {
+        return gql`
+            input TestSSOInputShop {
+                email: String!
+            }
+        `;
+    }
+
+    async authenticate(ctx: RequestContext, data: { email: string }): Promise<User | false | string> {
+        const { email } = data;
+        const user = await this.externalAuthenticationService.findUser(ctx, this.name, email);
+        if (user) {
+            return user;
+        }
+        return this.externalAuthenticationService.createCustomerAndUser(ctx, {
+            strategy: this.name,
+            externalIdentifier: email,
+            emailAddress: email,
+            firstName: 'SSO Customer First Name',
+            lastName: 'SSO Customer Last Name',
+            verified: true,
+        });
+    }
+}
+
 export class TestAuthenticationStrategy2 implements AuthenticationStrategy<{ token: string; email: string }> {
     readonly name = 'test_strategy2';
     private externalAuthenticationService: ExternalAuthenticationService;

File diff suppressed because it is too large
+ 671 - 513
packages/core/e2e/graphql/generated-e2e-admin-types.ts


File diff suppressed because it is too large
+ 597 - 553
packages/core/e2e/graphql/generated-e2e-shop-types.ts


+ 69 - 0
packages/core/e2e/shop-catalog.e2e-spec.ts

@@ -12,6 +12,7 @@ import {
     CreateFacet,
     DisableProduct,
     FacetWithValues,
+    GetCollection,
     GetCollectionList,
     GetCollectionVariants,
     GetFacetList,
@@ -232,6 +233,27 @@ describe('Shop catalog', () => {
     describe('collections', () => {
         let collection: CreateCollection.CreateCollection;
 
+        async function createNewCollection(name: string, isPrivate: boolean, parentId?: string) {
+            return await adminClient.query<CreateCollection.Mutation, CreateCollection.Variables>(
+                CREATE_COLLECTION,
+                {
+                    input: {
+                        translations: [
+                            {
+                                languageCode: LanguageCode.en,
+                                name,
+                                description: '',
+                                slug: name,
+                            },
+                        ],
+                        isPrivate,
+                        parentId,
+                        filters: [],
+                    },
+                },
+            );
+        }
+
         beforeAll(async () => {
             const result = await adminClient.query<GetFacetList.Query>(GET_FACET_LIST);
             const category = result.facets.items[0];
@@ -387,9 +409,56 @@ describe('Shop catalog', () => {
 
             expect(result.product!.collections).toEqual([]);
         });
+
+        it('private children not returned in Shop API', async () => {
+            const { createCollection: parent } = await createNewCollection('public-parent', false);
+            const { createCollection: child } = await createNewCollection('private-child', true, parent.id);
+
+            const result = await shopClient.query<GetCollection.Query, GetCollection.Variables>(
+                GET_COLLECTION_SHOP,
+                {
+                    id: parent.id,
+                },
+            );
+
+            expect(result.collection?.children).toEqual([]);
+        });
+
+        it('private parent not returned in Shop API', async () => {
+            const { createCollection: parent } = await createNewCollection('private-parent', true);
+            const { createCollection: child } = await createNewCollection('public-child', false, parent.id);
+
+            const result = await shopClient.query<GetCollection.Query, GetCollection.Variables>(
+                GET_COLLECTION_SHOP,
+                {
+                    id: child.id,
+                },
+            );
+
+            expect(result.collection?.parent).toBeNull();
+        });
     });
 });
 
+const GET_COLLECTION_SHOP = gql`
+    query GetCollectionShop($id: ID, $slug: String) {
+        collection(id: $id, slug: $slug) {
+            id
+            name
+            slug
+            description
+            parent {
+                id
+                name
+            }
+            children {
+                id
+                name
+            }
+        }
+    }
+`;
+
 const DISABLE_PRODUCT = gql`
     mutation DisableProduct($id: ID!) {
         updateProduct(input: { id: $id, enabled: false }) {

+ 2 - 2
packages/core/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/core",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "description": "A modern, headless ecommerce framework",
   "repository": {
     "type": "git",
@@ -47,7 +47,7 @@
     "@nestjs/testing": "7.6.17",
     "@nestjs/typeorm": "7.1.5",
     "@types/fs-extra": "^9.0.1",
-    "@vendure/common": "^1.0.0",
+    "@vendure/common": "^1.0.2",
     "apollo-server-express": "2.24.1",
     "bcrypt": "^5.0.0",
     "body-parser": "^1.19.0",

+ 1 - 1
packages/core/src/api/config/configure-graphql-module.ts

@@ -141,7 +141,6 @@ async function createGraphQLOptions(
             .map(e => (typeof e.schema === 'function' ? e.schema() : e.schema))
             .filter(notNullOrUndefined)
             .forEach(documentNode => (schema = extendSchema(schema, documentNode)));
-        schema = generatePermissionEnum(schema, configService.authOptions.customPermissions);
         schema = generateListOptions(schema);
         schema = addGraphQLCustomFields(schema, customFields, apiType === 'shop');
         schema = addOrderLineCustomFieldsInput(schema, customFields.OrderLine || []);
@@ -155,6 +154,7 @@ async function createGraphQLOptions(
         if (apiType === 'shop') {
             schema = addRegisterCustomerCustomFieldsInput(schema, customFields.Customer || []);
         }
+        schema = generatePermissionEnum(schema, configService.authOptions.customPermissions);
 
         return schema;
     }

+ 20 - 6
packages/core/src/api/resolvers/entity/collection-entity.resolver.ts

@@ -67,19 +67,33 @@ export class CollectionEntityResolver {
     }
 
     @ResolveField()
-    async parent(@Ctx() ctx: RequestContext, @Parent() collection: Collection): Promise<Collection> {
+    async parent(
+        @Ctx() ctx: RequestContext,
+        @Parent() collection: Collection,
+        @Api() apiType: ApiType,
+    ): Promise<Collection | undefined> {
+        let parent: Collection;
         if (collection.parent) {
-            return collection.parent;
+            parent = collection.parent;
+        } else {
+            parent = (await this.collectionService.getParent(ctx, collection.id)) as any;
         }
-        return this.collectionService.getParent(ctx, collection.id) as any;
+        return apiType === 'shop' && parent.isPrivate ? undefined : parent;
     }
 
     @ResolveField()
-    async children(@Ctx() ctx: RequestContext, @Parent() collection: Collection): Promise<Collection[]> {
+    async children(
+        @Ctx() ctx: RequestContext,
+        @Parent() collection: Collection,
+        @Api() apiType: ApiType,
+    ): Promise<Collection[]> {
+        let children: Collection[] = [];
         if (collection.children) {
-            return collection.children;
+            children = collection.children;
+        } else {
+            children = (await this.collectionService.getChildren(ctx, collection.id)) as any;
         }
-        return this.collectionService.getChildren(ctx, collection.id) as any;
+        return children.filter(c => (apiType === 'shop' ? !c.isPrivate : true));
     }
 
     @ResolveField()

+ 1 - 3
packages/core/src/api/schema/common/common-enums.graphql

@@ -17,9 +17,7 @@ enum DeletionResult {
 }
 
 # Populated at run-time
-enum Permission {
-    Placeholder
-}
+enum Permission
 
 enum SortOrder {
     ASC

+ 21 - 5
packages/core/src/config/catalog/default-collection-filters.ts

@@ -1,4 +1,5 @@
 import { LanguageCode } from '@vendure/common/lib/generated-types';
+import nanoid from 'nanoid';
 
 import { UserInputError } from '../../common/error/errors';
 import { ProductVariant } from '../../entity/product-variant/product-variant.entity';
@@ -88,17 +89,32 @@ export const variantNameCollectionFilter = new CollectionFilter({
     code: 'variant-name-filter',
     description: [{ languageCode: LanguageCode.en, value: 'Filter by ProductVariant name' }],
     apply: (qb, args) => {
-        qb.leftJoin('productVariant.translations', 'translation');
+        const translationAlias = `variant_name_filter_translation`;
+        const termName = `term_${nanoid(6)}`;
+        const hasJoinOnTranslations = !!qb.expressionMap.joinAttributes.find(
+            ja => ja.entityOrProperty === 'productVariant.translations',
+        );
+        if (!hasJoinOnTranslations) {
+            qb.leftJoin('productVariant.translations', translationAlias);
+        }
         const LIKE = qb.connection.options.type === 'postgres' ? 'ILIKE' : 'LIKE';
         switch (args.operator) {
             case 'contains':
-                return qb.andWhere(`translation.name ${LIKE} :term`, { term: `%${args.term}%` });
+                return qb.andWhere(`${translationAlias}.name ${LIKE} :${termName}`, {
+                    [termName]: `%${args.term}%`,
+                });
             case 'doesNotContain':
-                return qb.andWhere(`translation.name NOT ${LIKE} :term`, { term: `%${args.term}%` });
+                return qb.andWhere(`${translationAlias}.name NOT ${LIKE} :${termName}`, {
+                    [termName]: `%${args.term}%`,
+                });
             case 'startsWith':
-                return qb.andWhere(`translation.name ${LIKE} :term`, { term: `${args.term}%` });
+                return qb.andWhere(`${translationAlias}.name ${LIKE} :${termName}`, {
+                    [termName]: `${args.term}%`,
+                });
             case 'endsWith':
-                return qb.andWhere(`translation.name ${LIKE} :term`, { term: `%${args.term}` });
+                return qb.andWhere(`${translationAlias}.name ${LIKE} :${termName}`, {
+                    [termName]: `%${args.term}`,
+                });
             default:
                 throw new UserInputError(`${args.operator} is not a valid operator`);
         }

+ 1 - 0
packages/core/src/i18n/messages/en.json

@@ -53,6 +53,7 @@
     "COUPON_CODE_EXPIRED_ERROR": "Coupon code \"{ couponCode }\" has expired",
     "COUPON_CODE_INVALID_ERROR": "Coupon code \"{ couponCode }\" is not valid",
     "COUPON_CODE_LIMIT_ERROR": "Coupon code cannot be used more than {limit, plural, one {once} other {# times}} per customer",
+    "CREATE_FULFILLMENT_ERROR": "An error occurred when attempting to create the Fulfillment",
     "EMAIL_ADDRESS_CONFLICT_ERROR": "The email address is not available.",
     "EMPTY_ORDER_LINE_SELECTION_ERROR": "At least one OrderLine must be specified",
     "IDENTIFIER_CHANGE_TOKEN_INVALID_ERROR": "Identifier change token not recognized",

+ 24 - 12
packages/core/src/service/helpers/external-authentication/external-authentication.service.ts

@@ -4,7 +4,6 @@ import { HistoryEntryType } from '@vendure/common/lib/generated-types';
 import { RequestContext } from '../../../api/common/request-context';
 import { Administrator } from '../../../entity/administrator/administrator.entity';
 import { ExternalAuthenticationMethod } from '../../../entity/authentication-method/external-authentication-method.entity';
-import { Collection } from '../../../entity/collection/collection.entity';
 import { Customer } from '../../../entity/customer/customer.entity';
 import { Role } from '../../../entity/role/role.entity';
 import { User } from '../../../entity/user/user.entity';
@@ -13,7 +12,6 @@ import { ChannelService } from '../../services/channel.service';
 import { CustomerService } from '../../services/customer.service';
 import { HistoryService } from '../../services/history.service';
 import { RoleService } from '../../services/role.service';
-import { UserService } from '../../services/user.service';
 import { TransactionalConnection } from '../../transaction/transactional-connection';
 
 /**
@@ -32,7 +30,6 @@ export class ExternalAuthenticationService {
         private customerService: CustomerService,
         private administratorService: AdministratorService,
         private channelService: ChannelService,
-        private userService: UserService,
     ) {}
 
     /**
@@ -96,7 +93,8 @@ export class ExternalAuthenticationService {
     ): Promise<User> {
         let user: User;
 
-        const existingUser = await this.userService.getUserByEmailAddress(ctx, config.emailAddress);
+        const existingUser = await this.findExistingCustomerUserByEmailAddress(ctx, config.emailAddress);
+
         if (existingUser) {
             user = existingUser;
         } else {
@@ -207,20 +205,34 @@ export class ExternalAuthenticationService {
         strategy: string,
         externalIdentifier: string,
     ): Promise<User | undefined> {
-        const user = await this.connection
+        const usersWithMatchingIdentifier = await this.connection
             .getRepository(ctx, User)
             .createQueryBuilder('user')
             .leftJoinAndSelect('user.authenticationMethods', 'authMethod')
             .andWhere('authMethod.externalIdentifier = :externalIdentifier', { externalIdentifier })
             .andWhere('user.deletedAt IS NULL')
-            .getOne();
+            .getMany();
 
-        const userHasMatchingAuthMethod = !!user?.authenticationMethods.find(m => {
-            return m instanceof ExternalAuthenticationMethod && m.strategy === strategy;
-        });
+        const matchingUser = usersWithMatchingIdentifier.find(user =>
+            user.authenticationMethods.find(
+                m => m instanceof ExternalAuthenticationMethod && m.strategy === strategy,
+            ),
+        );
 
-        if (userHasMatchingAuthMethod) {
-            return user;
-        }
+        return matchingUser;
+    }
+
+    private async findExistingCustomerUserByEmailAddress(ctx: RequestContext, emailAddress: string) {
+        const customer = await this.connection
+            .getRepository(ctx, Customer)
+            .createQueryBuilder('customer')
+            .leftJoinAndSelect('customer.user', 'user')
+            .leftJoin('customer.channels', 'channel')
+            .leftJoinAndSelect('user.authenticationMethods', 'authMethod')
+            .andWhere('customer.emailAddress = :emailAddress', { emailAddress })
+            .andWhere('user.deletedAt IS NULL')
+            .getOne();
+
+        return customer?.user;
     }
 }

+ 3 - 3
packages/create/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/create",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "license": "MIT",
   "bin": {
     "create": "./index.js"
@@ -26,13 +26,13 @@
     "@types/handlebars": "^4.1.0",
     "@types/listr": "^0.14.2",
     "@types/semver": "^6.2.2",
-    "@vendure/core": "^1.0.1",
+    "@vendure/core": "^1.0.2",
     "rimraf": "^3.0.2",
     "ts-node": "^9.0.0",
     "typescript": "4.1.5"
   },
   "dependencies": {
-    "@vendure/common": "^1.0.0",
+    "@vendure/common": "^1.0.2",
     "chalk": "^4.1.0",
     "commander": "^7.1.0",
     "cross-spawn": "^7.0.3",

+ 9 - 9
packages/dev-server/package.json

@@ -1,6 +1,6 @@
 {
   "name": "dev-server",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "main": "index.js",
   "license": "MIT",
   "private": true,
@@ -14,18 +14,18 @@
     "load-test:100k": "node -r ts-node/register load-testing/run-load-test.ts 100000"
   },
   "dependencies": {
-    "@vendure/admin-ui-plugin": "^1.0.1",
-    "@vendure/asset-server-plugin": "^1.0.1",
-    "@vendure/common": "^1.0.0",
-    "@vendure/core": "^1.0.1",
-    "@vendure/elasticsearch-plugin": "^1.0.1",
-    "@vendure/email-plugin": "^1.0.1",
+    "@vendure/admin-ui-plugin": "^1.0.2",
+    "@vendure/asset-server-plugin": "^1.0.2",
+    "@vendure/common": "^1.0.2",
+    "@vendure/core": "^1.0.2",
+    "@vendure/elasticsearch-plugin": "^1.0.2",
+    "@vendure/email-plugin": "^1.0.2",
     "typescript": "4.1.5"
   },
   "devDependencies": {
     "@types/csv-stringify": "^3.1.0",
-    "@vendure/testing": "^1.0.1",
-    "@vendure/ui-devkit": "^1.0.1",
+    "@vendure/testing": "^1.0.2",
+    "@vendure/ui-devkit": "^1.0.2",
     "concurrently": "^5.0.0",
     "csv-stringify": "^5.3.3"
   }

File diff suppressed because it is too large
+ 671 - 513
packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts


+ 3 - 3
packages/elasticsearch-plugin/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/elasticsearch-plugin",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "lib/index.d.ts",
@@ -22,8 +22,8 @@
     "deepmerge": "^4.2.2"
   },
   "devDependencies": {
-    "@vendure/common": "^1.0.0",
-    "@vendure/core": "^1.0.1",
+    "@vendure/common": "^1.0.2",
+    "@vendure/core": "^1.0.2",
     "rimraf": "^3.0.2",
     "typescript": "4.1.5"
   }

+ 3 - 3
packages/email-plugin/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/email-plugin",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "lib/index.d.ts",
@@ -33,8 +33,8 @@
     "@types/fs-extra": "^9.0.1",
     "@types/handlebars": "^4.1.0",
     "@types/mjml": "^4.0.4",
-    "@vendure/common": "^1.0.0",
-    "@vendure/core": "^1.0.1",
+    "@vendure/common": "^1.0.2",
+    "@vendure/core": "^1.0.2",
     "rimraf": "^3.0.2",
     "typescript": "4.1.5"
   }

+ 3 - 3
packages/job-queue-plugin/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/job-queue-plugin",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "lib/index.d.ts",
@@ -21,8 +21,8 @@
   "devDependencies": {
     "@google-cloud/pubsub": "^2.8.0",
     "@types/redis": "^2.8.28",
-    "@vendure/common": "^1.0.0",
-    "@vendure/core": "^1.0.1",
+    "@vendure/common": "^1.0.2",
+    "@vendure/core": "^1.0.2",
     "redis": "^3.0.2",
     "rimraf": "^3.0.2",
     "typescript": "4.1.5"

+ 3 - 3
packages/testing/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/testing",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "description": "End-to-end testing tools for Vendure projects",
   "keywords": [
     "vendure",
@@ -33,7 +33,7 @@
   },
   "dependencies": {
     "@types/node-fetch": "^2.5.4",
-    "@vendure/common": "^1.0.0",
+    "@vendure/common": "^1.0.2",
     "faker": "^4.1.0",
     "form-data": "^3.0.0",
     "graphql": "15.5.0",
@@ -44,7 +44,7 @@
   "devDependencies": {
     "@types/mysql": "^2.15.15",
     "@types/pg": "^7.14.5",
-    "@vendure/core": "^1.0.1",
+    "@vendure/core": "^1.0.2",
     "mysql": "^2.18.1",
     "pg": "^8.4.0",
     "rimraf": "^3.0.0",

+ 4 - 4
packages/ui-devkit/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vendure/ui-devkit",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "description": "A library for authoring Vendure Admin UI extensions",
   "keywords": [
     "vendure",
@@ -39,8 +39,8 @@
     "@angular/cli": "11.2.4",
     "@angular/compiler": "11.2.5",
     "@angular/compiler-cli": "11.2.5",
-    "@vendure/admin-ui": "^1.0.1",
-    "@vendure/common": "^1.0.0",
+    "@vendure/admin-ui": "^1.0.2",
+    "@vendure/common": "^1.0.2",
     "chalk": "^4.1.0",
     "chokidar": "^3.5.1",
     "fs-extra": "^9.1.0",
@@ -51,7 +51,7 @@
     "@rollup/plugin-node-resolve": "^11.2.0",
     "@types/fs-extra": "^9.0.8",
     "@types/glob": "^7.1.3",
-    "@vendure/core": "^1.0.1",
+    "@vendure/core": "^1.0.2",
     "rimraf": "^3.0.2",
     "rollup": "^2.40.0",
     "rollup-plugin-terser": "^7.0.2",

File diff suppressed because it is too large
+ 0 - 0
schema-admin.json


File diff suppressed because it is too large
+ 0 - 0
schema-shop.json


Some files were not shown because too many files changed in this diff