diff --git a/.env-cmdrc b/.env-cmdrc index 73bb133bc45..60fdf05f15f 100644 --- a/.env-cmdrc +++ b/.env-cmdrc @@ -55,6 +55,10 @@ "CX_REQUESTED_DELIVERY_DATE": "true", "CX_PDF_INVOICES": "true" }, + "omf":{ + "CX_BASE_URL": "https://api.cg79x9wuu9-eccommerc1-s9-public.model-t.myhybris.cloud", + "CX_OMF": "true" + }, "requested-delivery-date": { "CX_BASE_URL": "https://api.cg79x9wuu9-eccommerc1-s8-public.model-t.myhybris.cloud", "CX_REQUESTED_DELIVERY_DATE": "true" diff --git a/core-libs/setup/tsconfig.spec.json b/core-libs/setup/tsconfig.spec.json index 1e7adccf9a9..1952ea3bcfe 100644 --- a/core-libs/setup/tsconfig.spec.json +++ b/core-libs/setup/tsconfig.spec.json @@ -575,6 +575,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/extra-webpack.config.js b/extra-webpack.config.js index c6f0f66837c..42ea421b644 100644 --- a/extra-webpack.config.js +++ b/extra-webpack.config.js @@ -72,6 +72,7 @@ module.exports = { ), '@spartacus/s4om': path.join(__dirname, 'integration-libs/s4om'), '@spartacus/s4-service': path.join(__dirname, 'integration-libs/s4-service'), + '@spartacus/omf': path.join(__dirname, 'integration-libs/omf'), }, }, }; diff --git a/feature-libs/asm/tsconfig.schematics.json b/feature-libs/asm/tsconfig.schematics.json index a9e1a8dbc30..63f3725717b 100644 --- a/feature-libs/asm/tsconfig.schematics.json +++ b/feature-libs/asm/tsconfig.schematics.json @@ -572,6 +572,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/cart/tsconfig.schematics.json b/feature-libs/cart/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/cart/tsconfig.schematics.json +++ b/feature-libs/cart/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/checkout/tsconfig.schematics.json b/feature-libs/checkout/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/checkout/tsconfig.schematics.json +++ b/feature-libs/checkout/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/customer-ticketing/tsconfig.schematics.json b/feature-libs/customer-ticketing/tsconfig.schematics.json index 2e09eb491ef..cb9f54cdff4 100644 --- a/feature-libs/customer-ticketing/tsconfig.schematics.json +++ b/feature-libs/customer-ticketing/tsconfig.schematics.json @@ -595,6 +595,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/estimated-delivery-date/tsconfig.schematics.json b/feature-libs/estimated-delivery-date/tsconfig.schematics.json index 2e09eb491ef..cb9f54cdff4 100644 --- a/feature-libs/estimated-delivery-date/tsconfig.schematics.json +++ b/feature-libs/estimated-delivery-date/tsconfig.schematics.json @@ -595,6 +595,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.html b/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.html index aa0b7a541c7..616c86b3635 100644 --- a/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.html +++ b/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.html @@ -33,6 +33,7 @@

params: order } | cxUrl " + [queryParams]="getQueryParams(order)" > {{ 'orderHistory.orderId' | cxTranslate }} {{ order?.code }} diff --git a/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.spec.ts b/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.spec.ts index e408ffbd20f..bf3c4fbb36f 100644 --- a/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.spec.ts +++ b/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.spec.ts @@ -15,10 +15,14 @@ import { TranslationService, } from '@spartacus/core'; import { MyAccountV2OrderHistoryService } from '@spartacus/order/core'; -import { EMPTY, Observable, of } from 'rxjs'; -import { ReplenishmentOrderHistoryFacade } from '../../../root/facade'; -import { OrderHistoryList, OrderHistoryView } from '../../../root/model'; +import { BehaviorSubject, EMPTY, Observable, of } from 'rxjs'; +import { + OrderHistoryFacade, + ReplenishmentOrderHistoryFacade, +} from '../../../root/facade'; +import { Order, OrderHistoryList, OrderHistoryView } from '../../../root/model'; import { MyAccountV2OrderHistoryComponent } from './my-account-v2-order-history.component'; +import { Params } from '@angular/router'; const mockOrders: OrderHistoryList = { orders: [ @@ -60,6 +64,24 @@ class MockUrlPipe implements PipeTransform { transform() {} } +class MockOrderHistoryFacade implements Partial { + getOrderHistoryList(): Observable { + return new BehaviorSubject(mockOrders); + } + getOrderHistoryListLoaded(): Observable { + return of(true); + } + getQueryParams(_order: Order): Params | null { + return null; + } + loadOrderList( + _pageSize: number, + _currentPage?: number, + _sort?: string + ): void {} + clearOrderList() {} +} + class MockMyAccountV2OrderHistoryService implements Partial { @@ -119,6 +141,7 @@ describe('MyAccountV2OrderHistoryComponent', () => { ], providers: [ { provide: RoutingService, useClass: MockRoutingService }, + { provide: OrderHistoryFacade, useClass: MockOrderHistoryFacade }, { provide: MyAccountV2OrderHistoryService, useClass: MockMyAccountV2OrderHistoryService, @@ -164,10 +187,15 @@ describe('MyAccountV2OrderHistoryComponent', () => { By.css('.cx-my-account-v2-order-history-code') ); codes[1].triggerEventHandler('click'); - expect(routingService.go).toHaveBeenCalledWith({ - cxRoute: 'orderDetails', - params: mockOrders.orders?.[1], - }); + expect(routingService.go).toHaveBeenCalledWith( + { + cxRoute: 'orderDetails', + params: mockOrders.orders?.[1], + }, + { + queryParams: null, + } + ); }); it('should display pagination', () => { diff --git a/feature-libs/order/components/order-history/order-history.component.html b/feature-libs/order/components/order-history/order-history.component.html index 78adcb74bfa..b780c1a4e84 100644 --- a/feature-libs/order/components/order-history/order-history.component.html +++ b/feature-libs/order/components/order-history/order-history.component.html @@ -106,6 +106,7 @@

params: order } | cxUrl " + [queryParams]="getQueryParams(order)" class="cx-order-history-value" > {{ order?.code }} params: order } | cxUrl " + [queryParams]="getQueryParams(order)" class="cx-order-history-value" > {{ order.purchaseOrderNumber }} params: order } | cxUrl " + [queryParams]="getQueryParams(order)" class="cx-order-history-value" > {{ order.costCenter?.name }} params: order } | cxUrl " + [queryParams]="getQueryParams(order)" class="cx-order-history-value" >{{ order?.placed | cxDate: 'longDate' }} @@ -174,6 +178,7 @@

params: order } | cxUrl " + [queryParams]="getQueryParams(order)" class="cx-order-history-value" > {{ @@ -193,6 +198,7 @@

params: order } | cxUrl " + [queryParams]="getQueryParams(order)" class="cx-order-history-value" > {{ order?.total.formattedValue }} { getOrderHistoryListLoaded(): Observable { return of(true); } + getQueryParams(_order: Order): Params | null { + return null; + } loadOrderList( _pageSize: number, _currentPage?: number, @@ -210,10 +215,15 @@ describe('OrderHistoryComponent', () => { ); rows[1].triggerEventHandler('click', null); - expect(routingService.go).toHaveBeenCalledWith({ - cxRoute: 'orderDetails', - params: mockOrders.orders[1], - }); + expect(routingService.go).toHaveBeenCalledWith( + { + cxRoute: 'orderDetails', + params: mockOrders.orders[1], + }, + { + queryParams: null, + } + ); }); it('should set correctly sort code', () => { diff --git a/feature-libs/order/components/order-history/order-history.component.ts b/feature-libs/order/components/order-history/order-history.component.ts index c6dd656e240..14a24e84548 100644 --- a/feature-libs/order/components/order-history/order-history.component.ts +++ b/feature-libs/order/components/order-history/order-history.component.ts @@ -5,6 +5,7 @@ */ import { ChangeDetectionStrategy, Component, OnDestroy } from '@angular/core'; +import { Params } from '@angular/router'; import { isNotUndefined, RoutingService, @@ -91,10 +92,19 @@ export class OrderHistoryComponent implements OnDestroy { } goToOrderDetail(order: Order): void { - this.routing.go({ - cxRoute: 'orderDetails', - params: order, - }); + this.routing.go( + { + cxRoute: 'orderDetails', + params: order, + }, + { + queryParams: this.getQueryParams(order), + } + ); + } + + getQueryParams(order: Order): Params | null { + return this.orderHistoryFacade.getQueryParams(order); } getSortLabels(): Observable<{ byDate: string; byOrderNumber: string }> { diff --git a/feature-libs/order/core/facade/order-history.service.spec.ts b/feature-libs/order/core/facade/order-history.service.spec.ts index 743b7750681..526facd5d03 100644 --- a/feature-libs/order/core/facade/order-history.service.spec.ts +++ b/feature-libs/order/core/facade/order-history.service.spec.ts @@ -270,4 +270,14 @@ describe('OrderHistoryService', () => { .subscribe((data) => expect(data).toEqual(true)) .unsubscribe(); }); + describe('getQueryParams', () => { + it('should always return null even if guid is present', () => { + const param = userOrderService.getQueryParams({ guid: '123' }); + expect(param).toEqual(null); + }); + it('should always return if no guid exists', () => { + const param = userOrderService.getQueryParams({ code: '123' }); + expect(param).toEqual(null); + }); + }); }); diff --git a/feature-libs/order/core/facade/order-history.service.ts b/feature-libs/order/core/facade/order-history.service.ts index 903376a585a..3f7328087c8 100644 --- a/feature-libs/order/core/facade/order-history.service.ts +++ b/feature-libs/order/core/facade/order-history.service.ts @@ -24,6 +24,7 @@ import { map, take, tap } from 'rxjs/operators'; import { OrderActions } from '../store/actions/index'; import { CANCEL_ORDER_PROCESS_ID, StateWithOrder } from '../store/order-state'; import { OrderSelectors } from '../store/selectors/index'; +import { Params } from '@angular/router'; @Injectable() export class OrderHistoryService implements OrderHistoryFacade { @@ -215,4 +216,8 @@ export class OrderHistoryService implements OrderHistoryFacade { getOrderDetailsLoading(): Observable { return this.store.pipe(select(OrderSelectors.getOrderDetailsLoading)); } + + getQueryParams(_order: Order): Params | null { + return null; + } } diff --git a/feature-libs/order/root/facade/order-history.facade.ts b/feature-libs/order/root/facade/order-history.facade.ts index 848d9d75e0f..29b5849fdd8 100644 --- a/feature-libs/order/root/facade/order-history.facade.ts +++ b/feature-libs/order/root/facade/order-history.facade.ts @@ -14,6 +14,7 @@ import { Order, OrderHistoryList, } from '../model/order.model'; +import { Params } from '@angular/router'; export function orderHistoryFacadeFactory() { return facadeFactory({ @@ -35,6 +36,7 @@ export function orderHistoryFacadeFactory() { 'getCancelOrderSuccess', 'resetCancelOrderProcessState', 'getOrderDetailsLoading', + 'getQueryParams', ], async: true, }); @@ -138,4 +140,9 @@ export abstract class OrderHistoryFacade { * Returns an order details loading flag */ abstract getOrderDetailsLoading(): Observable; + + /** + * Returns query parameters needed for order details route + */ + abstract getQueryParams(order: Order): Params | null; } diff --git a/feature-libs/order/tsconfig.schematics.json b/feature-libs/order/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/order/tsconfig.schematics.json +++ b/feature-libs/order/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/organization/tsconfig.schematics.json b/feature-libs/organization/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/organization/tsconfig.schematics.json +++ b/feature-libs/organization/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/pdf-invoices/tsconfig.schematics.json b/feature-libs/pdf-invoices/tsconfig.schematics.json index 2e09eb491ef..cb9f54cdff4 100644 --- a/feature-libs/pdf-invoices/tsconfig.schematics.json +++ b/feature-libs/pdf-invoices/tsconfig.schematics.json @@ -595,6 +595,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/pickup-in-store/tsconfig.schematics.json b/feature-libs/pickup-in-store/tsconfig.schematics.json index cc1e55926eb..447815bfdba 100644 --- a/feature-libs/pickup-in-store/tsconfig.schematics.json +++ b/feature-libs/pickup-in-store/tsconfig.schematics.json @@ -598,6 +598,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/product-configurator/tsconfig.schematics.json b/feature-libs/product-configurator/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/product-configurator/tsconfig.schematics.json +++ b/feature-libs/product-configurator/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/product/tsconfig.schematics.json b/feature-libs/product/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/product/tsconfig.schematics.json +++ b/feature-libs/product/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/qualtrics/tsconfig.schematics.json b/feature-libs/qualtrics/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/qualtrics/tsconfig.schematics.json +++ b/feature-libs/qualtrics/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/quote/tsconfig.schematics.json b/feature-libs/quote/tsconfig.schematics.json index cc1e55926eb..447815bfdba 100644 --- a/feature-libs/quote/tsconfig.schematics.json +++ b/feature-libs/quote/tsconfig.schematics.json @@ -598,6 +598,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/requested-delivery-date/tsconfig.schematics.json b/feature-libs/requested-delivery-date/tsconfig.schematics.json index 2e09eb491ef..cb9f54cdff4 100644 --- a/feature-libs/requested-delivery-date/tsconfig.schematics.json +++ b/feature-libs/requested-delivery-date/tsconfig.schematics.json @@ -595,6 +595,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/smartedit/tsconfig.schematics.json b/feature-libs/smartedit/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/smartedit/tsconfig.schematics.json +++ b/feature-libs/smartedit/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/storefinder/tsconfig.schematics.json b/feature-libs/storefinder/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/storefinder/tsconfig.schematics.json +++ b/feature-libs/storefinder/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/tracking/tsconfig.schematics.json b/feature-libs/tracking/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/tracking/tsconfig.schematics.json +++ b/feature-libs/tracking/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/feature-libs/user/tsconfig.schematics.json b/feature-libs/user/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/feature-libs/user/tsconfig.schematics.json +++ b/feature-libs/user/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/cdc/tsconfig.schematics.json b/integration-libs/cdc/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/integration-libs/cdc/tsconfig.schematics.json +++ b/integration-libs/cdc/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/cdp/tsconfig.schematics.json b/integration-libs/cdp/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/integration-libs/cdp/tsconfig.schematics.json +++ b/integration-libs/cdp/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/cds/tsconfig.schematics.json b/integration-libs/cds/tsconfig.schematics.json index 185cef46904..7fd3f760267 100644 --- a/integration-libs/cds/tsconfig.schematics.json +++ b/integration-libs/cds/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/cpq-quote/tsconfig.schematics.json b/integration-libs/cpq-quote/tsconfig.schematics.json index 2e09eb491ef..cb9f54cdff4 100644 --- a/integration-libs/cpq-quote/tsconfig.schematics.json +++ b/integration-libs/cpq-quote/tsconfig.schematics.json @@ -595,6 +595,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/digital-payments/tsconfig.schematics.json b/integration-libs/digital-payments/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/integration-libs/digital-payments/tsconfig.schematics.json +++ b/integration-libs/digital-payments/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/epd-visualization/tsconfig.schematics.json b/integration-libs/epd-visualization/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/integration-libs/epd-visualization/tsconfig.schematics.json +++ b/integration-libs/epd-visualization/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/omf/README.md b/integration-libs/omf/README.md new file mode 100644 index 00000000000..6ce492f2c92 --- /dev/null +++ b/integration-libs/omf/README.md @@ -0,0 +1,9 @@ +# Spartacus Order Management Foundation Integration + +The SAP Order Management foundation is a cloud-based solution that enables you to conveniently consolidate and manage all your orders and order-related data from a single location. + +Spartacus' Order Management Foundation Integration library leverages the advantages of SAP Order Management Foundation to bring a seamless order management experience to your e-commerce solution. + +It can be added to the existing Spartacus application by running `ng add @spartacus/omf`. For more information about Spartacus schematics, visit the [official Spartacus schematics documentation page](https://sap.github.io/spartacus-docs/schematics/). + +For more information, see [Spartacus](https://github.com/SAP/spartacus). diff --git a/integration-libs/omf/jest.schematics.config.js b/integration-libs/omf/jest.schematics.config.js new file mode 100644 index 00000000000..9ea8f415847 --- /dev/null +++ b/integration-libs/omf/jest.schematics.config.js @@ -0,0 +1,34 @@ +const { pathsToModuleNameMapper } = require('ts-jest'); +const { compilerOptions } = require('./tsconfig.schematics.json'); +const { defaultTransformerOptions } = require('jest-preset-angular/presets'); + +/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */ +module.exports = { + preset: 'jest-preset-angular', + moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths || {}, { + prefix: '/', + }), + setupFilesAfterEnv: ['/setup-jest.ts'], + testMatch: ['**/+(*_)+(spec).+(ts)'], + transform: { + '^.+\\.(ts|js|mjs|html|svg)$': [ + 'jest-preset-angular', + { + ...defaultTransformerOptions, + tsconfig: '/tsconfig.schematics.json', + }, + ], + }, + + collectCoverage: false, + coverageReporters: ['json', 'lcov', 'text', 'clover'], + coverageDirectory: '/../../coverage/omf/schematics', + coverageThreshold: { + global: { + statements: 90, + branches: 90, + functions: 90, + lines: 90, + }, + }, +}; diff --git a/integration-libs/omf/karma.conf.js b/integration-libs/omf/karma.conf.js new file mode 100644 index 00000000000..38f7df18657 --- /dev/null +++ b/integration-libs/omf/karma.conf.js @@ -0,0 +1,49 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-coverage'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('@angular-devkit/build-angular/plugins/karma'), + require('karma-junit-reporter'), + ], + client: { + clearContext: true, // close Jasmine Spec Runner output in browser to avoid 'Some of your tests did a full page reload!' error when '--no-watch' is active + }, + reporters: ['progress', 'kjhtml', 'dots', 'junit'], + junitReporter: { + outputFile: 'unit-test-omf.xml', + outputDir: require('path').join(__dirname, '../../unit-tests-reports'), + useBrowserName: false, + }, + coverageReporter: { + dir: require('path').join(__dirname, '../../coverage/omf'), + reporters: [{ type: 'lcov', subdir: '.' }, { type: 'text-summary' }], + check: { + global: { + statements: 90, + lines: 90, + branches: 75, + functions: 90, + }, + }, + }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true, + }); +}; diff --git a/integration-libs/omf/ng-package.json b/integration-libs/omf/ng-package.json new file mode 100644 index 00000000000..9249a261cfe --- /dev/null +++ b/integration-libs/omf/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/omf", + "lib": { + "entryFile": "./public_api.ts" + }, + "assets": ["**/*.scss", "schematics/**/*.json", "schematics/**/*.js"] +} diff --git a/integration-libs/omf/order/config/default-omf-config.ts b/integration-libs/omf/order/config/default-omf-config.ts new file mode 100644 index 00000000000..2ad483c46ce --- /dev/null +++ b/integration-libs/omf/order/config/default-omf-config.ts @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { OmfConfig } from './omf-config'; + +export const defaultOmfConfig: OmfConfig = { + omf: { + guidHttpHeaderName: 'guid', + }, +}; diff --git a/integration-libs/omf/order/config/omf-config.ts b/integration-libs/omf/order/config/omf-config.ts new file mode 100644 index 00000000000..aaab2b94e85 --- /dev/null +++ b/integration-libs/omf/order/config/omf-config.ts @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Injectable } from '@angular/core'; +import { Config } from '@spartacus/core'; +import { OmfConfiguration } from '@spartacus/omf'; + +@Injectable({ + providedIn: 'root', + useExisting: Config, +}) +export abstract class OmfConfig { + omf?: OmfConfiguration; +} + +declare module '@spartacus/core' { + interface Config extends OmfConfig {} +} diff --git a/integration-libs/omf/order/ng-package.json b/integration-libs/omf/order/ng-package.json new file mode 100644 index 00000000000..e9016efd633 --- /dev/null +++ b/integration-libs/omf/order/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/omf", + "lib": { + "entryFile": "./public_api.ts" + }, + "assets": ["**/*.scss", "schematics/**/*.json", "schematics/**/*.js"] +} diff --git a/integration-libs/omf/order/occ-omf-order-history.adapter.spec.ts b/integration-libs/omf/order/occ-omf-order-history.adapter.spec.ts new file mode 100644 index 00000000000..a098bdb4f1c --- /dev/null +++ b/integration-libs/omf/order/occ-omf-order-history.adapter.spec.ts @@ -0,0 +1,219 @@ +import { + HttpClientModule, + HttpHeaders, + HttpRequest, +} from '@angular/common/http'; +import { + HttpClientTestingModule, + HttpTestingController, +} from '@angular/common/http/testing'; +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { + ConverterService, + InterceptorUtil, + LoggerService, + OCC_USER_ID_ANONYMOUS, + OccConfig, + OccEndpointsService, + USE_CLIENT_TOKEN, +} from '@spartacus/core'; +import { Order, ORDER_NORMALIZER } from '@spartacus/order/root'; +import { + MockOccEndpointsService, + mockOccModuleConfig, +} from 'projects/core/src/occ/adapters/user/unit-test.helper'; +import { OccOmfOrderHistoryAdapter } from './occ-omf-order-history.adapter'; +import { of } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import { Store, StoreModule } from '@ngrx/store'; +import { OmfConfig } from './config/omf-config'; +import { OrderSelectors } from '@spartacus/order/core'; +const userId = '123'; + +const orderData: Order = { + site: 'electronics', + calculated: true, + code: '00001004', + guid: 'guid_01', +}; +const mockActivatedRoute = { + snapshot: { + params: {}, + }, + get queryParams() { + return of({ guid: orderData.guid }); + }, +}; + +const mockOrderState = { + value: { orders: [orderData] }, +}; + +const mockConfig: OmfConfig = { + omf: { + guidHttpHeaderName: 'my-guid-header', + }, +}; + +describe('OccOmfOrderHistoryAdapter', () => { + let adapter: OccOmfOrderHistoryAdapter; + let httpMock: HttpTestingController; + let converter: ConverterService; + let occEnpointsService: OccEndpointsService; + let store: Store; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientModule, + HttpClientTestingModule, + StoreModule.forRoot({}), + ], + providers: [ + LoggerService, + OccOmfOrderHistoryAdapter, + { provide: OmfConfig, useValue: mockConfig }, + { provide: OccConfig, useValue: mockOccModuleConfig }, + { provide: ActivatedRoute, useValue: mockActivatedRoute }, + { + provide: OccEndpointsService, + useClass: MockOccEndpointsService, + }, + ], + }); + + adapter = TestBed.inject(OccOmfOrderHistoryAdapter); + httpMock = TestBed.inject(HttpTestingController); + converter = TestBed.inject(ConverterService); + occEnpointsService = TestBed.inject(OccEndpointsService); + store = TestBed.inject(Store); + spyOn(converter, 'pipeable').and.callThrough(); + spyOn(converter, 'convert').and.callThrough(); + spyOn(occEnpointsService, 'buildUrl').and.callThrough(); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('loadOrder', () => { + it('should fetch a single order with guid passed in API request header for logged in user', waitForAsync(() => { + spyOn(adapter, 'getOrderGuid').and.returnValue(of(orderData.guid)); + spyOn(adapter, 'getRequestHeader').and.returnValue( + new HttpHeaders().set('Custom-Guid-Header', orderData.guid ?? '') + ); + spyOn(InterceptorUtil, 'createHeader').withArgs( + USE_CLIENT_TOKEN, + true, + jasmine.anything() + ); + adapter.load(userId, orderData.code ?? '').subscribe(); + const request = httpMock.expectOne((req: HttpRequest) => { + return req.method === 'GET'; + }, `GET a single order`); + expect(request.request.headers.has('Custom-Guid-Header')).toBe(true); + expect(request.request.headers.get('Custom-Guid-Header')).toEqual( + orderData.guid + ); + expect(occEnpointsService.buildUrl).toHaveBeenCalledWith('orderDetail', { + urlParams: { userId, orderId: orderData.code }, + }); + expect(InterceptorUtil.createHeader).not.toHaveBeenCalledWith( + USE_CLIENT_TOKEN, + true, + jasmine.anything() + ); + expect(converter.pipeable).toHaveBeenCalledWith(ORDER_NORMALIZER); + request.flush(orderData); + httpMock.verify(); + })); + it('should fetch a single order with guid passed in API request header for anonymous user', waitForAsync(() => { + spyOn(adapter, 'getOrderGuid').and.returnValue(of(orderData.guid)); + spyOn(adapter, 'getRequestHeader').and.returnValue( + new HttpHeaders().set('Custom-Guid-Header', orderData.guid ?? '') + ); + spyOn(InterceptorUtil, 'createHeader') + .withArgs(USE_CLIENT_TOKEN, true, jasmine.anything()) + .and.callThrough(); + adapter.load(OCC_USER_ID_ANONYMOUS, orderData.code ?? '').subscribe(); + const request = httpMock.expectOne((req: HttpRequest) => { + return req.method === 'GET'; + }, `GET a single order`); + expect(request.request.headers.has('Custom-Guid-Header')).toBe(true); + expect(request.request.headers.get('Custom-Guid-Header')).toEqual( + orderData.guid + ); + expect(occEnpointsService.buildUrl).toHaveBeenCalledWith('orderDetail', { + urlParams: { userId: OCC_USER_ID_ANONYMOUS, orderId: orderData.code }, + }); + expect(InterceptorUtil.createHeader).toHaveBeenCalledWith( + USE_CLIENT_TOKEN, + true, + jasmine.anything() + ); + expect(converter.pipeable).toHaveBeenCalledWith(ORDER_NORMALIZER); + request.flush(orderData); + httpMock.verify(); + })); + }); + describe('getRequestHeader', () => { + it('should construct a request header with guid', () => { + const header = adapter.getRequestHeader(orderData.guid); + expect(header.has('my-guid-header')).toBe(true); + expect(header.get('my-guid-header')).toEqual(orderData.guid); + }); + }); + describe('getOrderGuid', () => { + it('should return guid from route query params', (done) => { + adapter.getOrderGuid(orderData.code ?? '').subscribe((guid) => { + expect(guid).toEqual(orderData.guid); + done(); + }); + }); + it('should return guid from store', (done) => { + spyOnProperty(mockActivatedRoute, 'queryParams', 'get').and.returnValue( + of({ guid: null }) + ); + spyOn(store, 'select').and.callFake((selector: any) => { + if (selector === OrderSelectors.getOrdersState) { + return of(mockOrderState); + } + return of(null); + }); + adapter.getOrderGuid(orderData.code ?? '').subscribe((guid) => { + expect(guid).toEqual(orderData.guid); + done(); + }); + }); + it('should return undefined from store if order is not present in store', (done) => { + spyOnProperty(mockActivatedRoute, 'queryParams', 'get').and.returnValue( + of({ guid: null }) + ); + spyOn(store, 'select').and.callFake((selector: any) => { + if (selector === OrderSelectors.getOrdersState) { + return of({ value: { orders: [orderData] } }); + } + return of(null); + }); + adapter.getOrderGuid('guid_02').subscribe((guid) => { + expect(guid).toEqual(undefined); + done(); + }); + }); + it('should return undefined from store if store is empty', (done) => { + spyOnProperty(mockActivatedRoute, 'queryParams', 'get').and.returnValue( + of({ guid: null }) + ); + spyOn(store, 'select').and.callFake((selector: any) => { + if (selector === OrderSelectors.getOrdersState) { + return of({ value: {} }); + } + return of(null); + }); + adapter.getOrderGuid('guid_02').subscribe((guid) => { + expect(guid).toEqual(undefined); + done(); + }); + }); + }); +}); diff --git a/integration-libs/omf/order/occ-omf-order-history.adapter.ts b/integration-libs/omf/order/occ-omf-order-history.adapter.ts new file mode 100644 index 00000000000..20f582da81d --- /dev/null +++ b/integration-libs/omf/order/occ-omf-order-history.adapter.ts @@ -0,0 +1,89 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { inject, Injectable, isDevMode } from '@angular/core'; +import { + OCC_USER_ID_ANONYMOUS, + InterceptorUtil, + USE_CLIENT_TOKEN, + Occ, +} from '@spartacus/core'; +import { OccOrderHistoryAdapter } from '@spartacus/order/occ'; +import { Order, ORDER_NORMALIZER } from '@spartacus/order/root'; +import { HttpHeaders } from '@angular/common/http'; +import { map, Observable, of, switchMap } from 'rxjs'; +import { Store } from '@ngrx/store'; +import { StateWithOrder, OrderSelectors } from '@spartacus/order/core'; +import { OmfConfig } from './config/omf-config'; +import { ActivatedRoute } from '@angular/router'; + +@Injectable({ + providedIn: 'root', +}) +export class OccOmfOrderHistoryAdapter extends OccOrderHistoryAdapter { + protected route = inject(ActivatedRoute); + protected store = inject(Store); + protected config = inject(OmfConfig); + + protected getOrderDetailsValue(code: string): Observable { + return this.store.select(OrderSelectors.getOrdersState).pipe( + map((orderListState) => orderListState.value), + map((orderList) => { + return (orderList?.orders ?? []).find((order) => order.code === code); + }) + ); + } + getOrderGuid(orderCode: string): Observable { + return this.route.queryParams.pipe( + switchMap((queryParams) => { + if (queryParams.guid) { + // when navigating from Order History to Order Details page + return of(queryParams.guid); + } else { + // when loading Order History page in case of My-Account-V2 + return this.getOrderDetailsValue(orderCode).pipe( + map((order) => (order ? order.guid : undefined)) + ); + } + }) + ); + } + + getRequestHeader(guid: string | undefined): HttpHeaders { + let headers = new HttpHeaders(); + if (!this.config.omf?.guidHttpHeaderName && isDevMode()) { + this.logger.warn( + `There is no guidHttpHeaderName configured in OMF configuration` + ); + } + const guidHeader = this.config.omf?.guidHttpHeaderName?.toLowerCase?.(); + if (guid && guidHeader) { + headers = headers.set(guidHeader, guid); + } + return headers; + } + + public load(userId: string, orderCode: string): Observable { + return this.getOrderGuid(orderCode).pipe( + switchMap((guid) => { + const url = this.occEndpoints.buildUrl('orderDetail', { + urlParams: { userId, orderId: orderCode }, + }); + let headers = this.getRequestHeader(guid); + if (userId === OCC_USER_ID_ANONYMOUS) { + headers = InterceptorUtil.createHeader( + USE_CLIENT_TOKEN, + true, + headers + ); + } + return this.http + .get(url, { headers }) + .pipe(this.converter.pipeable(ORDER_NORMALIZER)); + }) + ); + } +} diff --git a/integration-libs/omf/order/omf-order-history.service.spec.ts b/integration-libs/omf/order/omf-order-history.service.spec.ts new file mode 100644 index 00000000000..2a7860b8a05 --- /dev/null +++ b/integration-libs/omf/order/omf-order-history.service.spec.ts @@ -0,0 +1,24 @@ +import { TestBed } from '@angular/core/testing'; +import { OmfOrderHistoryService } from './omf-order-history.service'; +import { StoreModule } from '@ngrx/store'; + +describe('OmfOrderHistoryService', () => { + let service: OmfOrderHistoryService; + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [StoreModule.forRoot({})], + providers: [OmfOrderHistoryService], + }); + service = TestBed.inject(OmfOrderHistoryService); + }); + describe('getQueryParams', () => { + it('should return a routing query param with given guid', () => { + const param = service.getQueryParams({ guid: '123' }); + expect(param).toEqual({ guid: '123' }); + }); + it('should return null if no guid exists', () => { + const param = service.getQueryParams({ code: '123' }); + expect(param).toEqual(null); + }); + }); +}); diff --git a/integration-libs/omf/order/omf-order-history.service.ts b/integration-libs/omf/order/omf-order-history.service.ts new file mode 100644 index 00000000000..910078da593 --- /dev/null +++ b/integration-libs/omf/order/omf-order-history.service.ts @@ -0,0 +1,24 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Injectable } from '@angular/core'; +import { Params } from '@angular/router'; +import { OrderHistoryService } from '@spartacus/order/core'; +import { Order, OrderHistoryFacade } from '@spartacus/order/root'; + +@Injectable() +export class OmfOrderHistoryService + extends OrderHistoryService + implements OrderHistoryFacade +{ + getQueryParams(order: Order): Params | null { + return order.guid + ? { + guid: order.guid, + } + : null; + } +} diff --git a/integration-libs/omf/order/omf-order.module.ts b/integration-libs/omf/order/omf-order.module.ts new file mode 100644 index 00000000000..2639027ba79 --- /dev/null +++ b/integration-libs/omf/order/omf-order.module.ts @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { NgModule } from '@angular/core'; +import { OrderHistoryAdapter } from '@spartacus/order/core'; +import { OccOmfOrderHistoryAdapter } from './occ-omf-order-history.adapter'; +import { OrderHistoryFacade } from '@spartacus/order/root'; +import { OmfOrderHistoryService } from './omf-order-history.service'; +import { provideDefaultConfig } from '@spartacus/core'; +import { defaultOmfConfig } from './config/default-omf-config'; + +@NgModule({ + providers: [ + OmfOrderHistoryService, + provideDefaultConfig(defaultOmfConfig), + { provide: OrderHistoryAdapter, useClass: OccOmfOrderHistoryAdapter }, + { + provide: OrderHistoryFacade, + useClass: OmfOrderHistoryService, + }, + ], +}) +export class OmfOrderModule {} diff --git a/integration-libs/omf/order/public_api.ts b/integration-libs/omf/order/public_api.ts new file mode 100644 index 00000000000..651b6e75332 --- /dev/null +++ b/integration-libs/omf/order/public_api.ts @@ -0,0 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './omf-order.module'; +export * from './occ-omf-order-history.adapter'; +export * from './omf-order-history.service'; diff --git a/integration-libs/omf/package.json b/integration-libs/omf/package.json new file mode 100644 index 00000000000..72d600fdf54 --- /dev/null +++ b/integration-libs/omf/package.json @@ -0,0 +1,37 @@ +{ + "name": "@spartacus/omf", + "version": "2211.27.0", + "description": "SAP Order Management Foundation Integration", + "keywords": [ + "spartacus", + "framework", + "storefront", + "omf" + ], + "homepage": "https://github.com/SAP/spartacus", + "repository": "https://github.com/SAP/spartacus", + "license": "Apache-2.0", + "scripts": { + "build:schematics": "npm run clean:schematics && ../../node_modules/.bin/tsc -p ./tsconfig.schematics.json", + "clean:schematics": "../../node_modules/.bin/rimraf --glob \"schematics/**/*.js\" \"schematics/**/*.js.map\" \"schematics/**/*.d.ts\"", + "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" + }, + "dependencies": { + "tslib": "^2.6.2" + }, + "peerDependencies": { + "@angular-devkit/schematics": "^17.0.5", + "@angular/common": "^17.0.5", + "@angular/core": "^17.0.5", + "@angular/router": "^17.0.5", + "@ngrx/store": "^17.0.1", + "@spartacus/core": "2211.27.0", + "@spartacus/order": "2211.27.0", + "@spartacus/schematics": "2211.27.0", + "rxjs": "^7.8.0" + }, + "publishConfig": { + "access": "public" + }, + "schematics": "./schematics/collection.json" +} diff --git a/integration-libs/omf/project.json b/integration-libs/omf/project.json new file mode 100644 index 00000000000..edd7c938aba --- /dev/null +++ b/integration-libs/omf/project.json @@ -0,0 +1,50 @@ +{ + "name": "omf", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "library", + "sourceRoot": "integration-libs/omf", + "prefix": "cx", + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:ng-packagr", + "options": { + "project": "integration-libs/omf/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "integration-libs/omf/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "integration-libs/omf/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "executor": "@angular-devkit/build-angular:karma", + "options": { + "main": "integration-libs/omf/test.ts", + "tsConfig": "integration-libs/omf/tsconfig.spec.json", + "polyfills": ["zone.js", "zone.js/testing"], + "karmaConfig": "integration-libs/omf/karma.conf.js" + } + }, + "test-jest": { + "executor": "nx:run-commands", + "options": { + "command": "npm run test:schematics", + "cwd": "integration-libs/omf" + } + }, + "lint": { + "executor": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "integration-libs/omf/**/*.ts", + "integration-libs/omf/**/*.html" + ] + } + } + }, + "tags": ["type:feature", "type:integration"] +} diff --git a/integration-libs/omf/public_api.ts b/integration-libs/omf/public_api.ts new file mode 100644 index 00000000000..3fe3a63378c --- /dev/null +++ b/integration-libs/omf/public_api.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './root/public_api'; diff --git a/integration-libs/omf/root/feature-name.ts b/integration-libs/omf/root/feature-name.ts new file mode 100644 index 00000000000..14c45e09839 --- /dev/null +++ b/integration-libs/omf/root/feature-name.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export const OMF_FEATURE = 'OMF'; diff --git a/integration-libs/omf/root/model/index.ts b/integration-libs/omf/root/model/index.ts new file mode 100644 index 00000000000..bca3e90ea98 --- /dev/null +++ b/integration-libs/omf/root/model/index.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './omf-configuration'; diff --git a/integration-libs/omf/root/model/omf-configuration.ts b/integration-libs/omf/root/model/omf-configuration.ts new file mode 100644 index 00000000000..52c3eb38c16 --- /dev/null +++ b/integration-libs/omf/root/model/omf-configuration.ts @@ -0,0 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export abstract class OmfConfiguration { + guidHttpHeaderName: string; +} diff --git a/integration-libs/omf/root/ng-package.json b/integration-libs/omf/root/ng-package.json new file mode 100644 index 00000000000..38e01ac17de --- /dev/null +++ b/integration-libs/omf/root/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "./public_api.ts" + } +} diff --git a/integration-libs/omf/root/omf-root.module.ts b/integration-libs/omf/root/omf-root.module.ts new file mode 100644 index 00000000000..de8d9cc3bcc --- /dev/null +++ b/integration-libs/omf/root/omf-root.module.ts @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { NgModule } from '@angular/core'; + +@NgModule() +export class OmfRootModule {} diff --git a/integration-libs/omf/root/public_api.ts b/integration-libs/omf/root/public_api.ts new file mode 100644 index 00000000000..195d0fdd35d --- /dev/null +++ b/integration-libs/omf/root/public_api.ts @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './omf-root.module'; +export * from './model/index'; diff --git a/integration-libs/omf/schematics/.gitignore b/integration-libs/omf/schematics/.gitignore new file mode 100644 index 00000000000..c88f4d69e15 --- /dev/null +++ b/integration-libs/omf/schematics/.gitignore @@ -0,0 +1,18 @@ +# Outputs +**/*.js +**/*.js.map +**/*.d.ts + +# IDEs +.idea/ +jsconfig.json +.vscode/ + +# Misc +node_modules/ +npm-debug.log* +yarn-error.log* + +# Mac OSX Finder files. +**/.DS_Store +.DS_Store diff --git a/integration-libs/omf/schematics/add-omf/__snapshots__/index_spec.ts.snap b/integration-libs/omf/schematics/add-omf/__snapshots__/index_spec.ts.snap new file mode 100644 index 00000000000..f89c186c71f --- /dev/null +++ b/integration-libs/omf/schematics/add-omf/__snapshots__/index_spec.ts.snap @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Spartacus OMF Schematics: ng-add OMF feature eager loading should import appropriate modules 1`] = ` +"import { NgModule } from '@angular/core'; +import { OmfRootModule } from "@spartacus/omf/root"; + +@NgModule({ + declarations: [], + imports: [ + OmfRootModule + ] +}) +export class OmfFeatureModule { } +" +`; + +exports[`Spartacus OMF Schematics: ng-add OMF feature general setup should add the feature using the lazy loading syntax 1`] = ` +"import { NgModule } from '@angular/core'; +import { OmfRootModule } from "@spartacus/omf/root"; + +@NgModule({ + declarations: [], + imports: [ + OmfRootModule + ] +}) +export class OmfFeatureModule { } +" +`; + +exports[`Spartacus OMF Schematics: ng-add OMF feature general setup should install the appropriate dependencies 1`] = `""`; diff --git a/integration-libs/omf/schematics/add-omf/index.ts b/integration-libs/omf/schematics/add-omf/index.ts new file mode 100644 index 00000000000..39829b110e8 --- /dev/null +++ b/integration-libs/omf/schematics/add-omf/index.ts @@ -0,0 +1,43 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + chain, + Rule, + SchematicContext, + Tree, +} from '@angular-devkit/schematics'; +import { + addFeatures, + addPackageJsonDependenciesForLibrary, + analyzeApplication, + analyzeCrossFeatureDependencies, + finalizeInstallation, + readPackageJson, + validateSpartacusInstallation, + LibraryOptions as SpartacusOmfOptions, +} from '@spartacus/schematics'; +import { peerDependencies } from '../../package.json'; + +export function addOmfFeature(options: SpartacusOmfOptions): Rule { + return (tree: Tree, _context: SchematicContext): Rule => { + const packageJson = readPackageJson(tree); + validateSpartacusInstallation(packageJson); + + const features = analyzeCrossFeatureDependencies( + options.features as string[] + ); + + return chain([ + analyzeApplication(options, features), + + addFeatures(options, features), + addPackageJsonDependenciesForLibrary(peerDependencies, options), + + finalizeInstallation(options, features), + ]); + }; +} diff --git a/integration-libs/omf/schematics/add-omf/index_spec.ts b/integration-libs/omf/schematics/add-omf/index_spec.ts new file mode 100644 index 00000000000..102ca54d965 --- /dev/null +++ b/integration-libs/omf/schematics/add-omf/index_spec.ts @@ -0,0 +1,194 @@ +/// + +import { + SchematicTestRunner, + UnitTestTree, +} from '@angular-devkit/schematics/testing'; +import { + Schema as ApplicationOptions, + Style, +} from '@schematics/angular/application/schema'; +import { Schema as WorkspaceOptions } from '@schematics/angular/workspace/schema'; +import { + OMF_FEATURE_NAME, + SPARTACUS_SCHEMATICS, + SPARTACUS_OMF, + LibraryOptions as OmfOptions, + SpartacusOptions, + omfFeatureModulePath, + ORDER_FEATURE_NAME, + orderWrapperModulePath, + SPARTACUS_ORDER, + orderFeatureModulePath, +} from '@spartacus/schematics'; +import * as path from 'path'; +import { peerDependencies } from '../../package.json'; + +const collectionPath = path.join(__dirname, '../collection.json'); + +describe('Spartacus OMF Schematics: ng-add', () => { + const schematicRunner = new SchematicTestRunner( + SPARTACUS_OMF, + collectionPath + ); + + let appTree: UnitTestTree; + + const workspaceOptions: WorkspaceOptions = { + name: 'workspace', + version: '0.5.0', + }; + + const appOptions: ApplicationOptions = { + name: 'schematics-test', + inlineStyle: false, + inlineTemplate: false, + routing: false, + style: Style.Scss, + skipTests: false, + projectRoot: '', + standalone: false, + }; + + const spartacusDefaultOptions: SpartacusOptions = { + project: 'schematics-test', + lazy: true, + features: [], + }; + + const libraryNoFeaturesOptions: OmfOptions = { + project: 'schematics-test', + lazy: false, + features: [], + }; + + const orderFeatureOptions: OmfOptions = { + ...libraryNoFeaturesOptions, + features: [ORDER_FEATURE_NAME], + }; + + const omfFeatureOptions: OmfOptions = { + ...libraryNoFeaturesOptions, + features: [OMF_FEATURE_NAME], + }; + + beforeEach(async () => { + schematicRunner.registerCollection( + SPARTACUS_SCHEMATICS, + path.join( + __dirname, + '../../../../projects/schematics/src/collection.json' + ) + ); + schematicRunner.registerCollection( + SPARTACUS_ORDER, + path.join( + __dirname, + '../../../../feature-libs/order/schematics/collection.json' + ) + ); + appTree = await schematicRunner.runExternalSchematic( + '@schematics/angular', + 'workspace', + workspaceOptions + ); + + appTree = await schematicRunner.runExternalSchematic( + '@schematics/angular', + 'application', + appOptions, + appTree + ); + + appTree = await schematicRunner.runExternalSchematic( + SPARTACUS_SCHEMATICS, + 'ng-add', + { ...spartacusDefaultOptions, name: 'schematics-test' }, + appTree + ); + }); + + describe('Without features', () => { + beforeEach(async () => { + appTree = await schematicRunner.runSchematic( + 'ng-add', + libraryNoFeaturesOptions, + appTree + ); + }); + + it('should not create any of the feature modules', () => { + expect(appTree.exists(omfFeatureModulePath)).toBeFalsy(); + }); + }); + + describe('OMF feature', () => { + describe('general setup', () => { + beforeEach(async () => { + appTree = await schematicRunner.runSchematic( + 'ng-add', + orderFeatureOptions, + appTree + ); + appTree = await schematicRunner.runSchematic( + 'ng-add', + omfFeatureOptions, + appTree + ); + appTree = await schematicRunner.runSchematic( + 'ng-add', + omfFeatureOptions, + appTree + ); + }); + + it('should install necessary Spartacus libraries', () => { + const packageJson = JSON.parse(appTree.readContent('package.json')); + let dependencies: Record = {}; + dependencies = { ...packageJson.dependencies }; + dependencies = { ...dependencies, ...packageJson.devDependencies }; + + for (const toAdd in peerDependencies) { + if ( + !peerDependencies.hasOwnProperty(toAdd) || + toAdd === SPARTACUS_SCHEMATICS + ) { + continue; + } + const expectedDependency = dependencies[toAdd]; + expect(expectedDependency).toBeTruthy(); + } + }); + + it('should add the feature using the lazy loading syntax', async () => { + const module = appTree.readContent(omfFeatureModulePath); + expect(module).toMatchSnapshot(); + }); + it('should install the appropriate dependencies', async () => { + const orderWrapperModule = appTree.readContent(orderWrapperModulePath); + expect(orderWrapperModule).toMatchSnapshot(); + }); + }); + + describe('eager loading', () => { + beforeEach(async () => { + appTree = await schematicRunner.runSchematic( + 'ng-add', + { ...orderFeatureOptions, lazy: false }, + appTree + ); + appTree = await schematicRunner.runSchematic( + 'ng-add', + { ...omfFeatureOptions, lazy: false }, + appTree + ); + }); + + it('should import appropriate modules', async () => { + const module = appTree.readContent(omfFeatureModulePath); + expect(module).toMatchSnapshot(); + expect(appTree.readContent(orderFeatureModulePath)).toBeTruthy(); + }); + }); + }); +}); diff --git a/integration-libs/omf/schematics/add-omf/schema.json b/integration-libs/omf/schematics/add-omf/schema.json new file mode 100644 index 00000000000..4662afa75b5 --- /dev/null +++ b/integration-libs/omf/schematics/add-omf/schema.json @@ -0,0 +1,26 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "OmfSchematics", + "title": "OMF Schematics", + "type": "object", + "properties": { + "project": { + "type": "string", + "description": "The name of the project.", + "$default": { + "$source": "projectName" + } + }, + "debug": { + "description": "Display additional details during the running process.", + "type": "boolean", + "default": false + }, + "features": { + "type": "array", + "uniqueItems": true, + "default": ["OMF"] + } + }, + "required": [] +} diff --git a/integration-libs/omf/schematics/collection.json b/integration-libs/omf/schematics/collection.json new file mode 100644 index 00000000000..b989e4db3d9 --- /dev/null +++ b/integration-libs/omf/schematics/collection.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", + "schematics": { + "ng-add": { + "factory": "./add-omf/index#addOmfFeature", + "description": "Add and configure Spartacus' OMF feature", + "schema": "./add-omf/schema.json", + "private": true, + "hidden": true, + "aliases": ["install"] + }, + "add": { + "factory": "./add-omf/index#addOmfFeature", + "description": "Add and configure Spartacus' OMF feature", + "schema": "./add-omf/schema.json" + } + } +} diff --git a/integration-libs/omf/setup-jest.ts b/integration-libs/omf/setup-jest.ts new file mode 100644 index 00000000000..aeb0a861992 --- /dev/null +++ b/integration-libs/omf/setup-jest.ts @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import 'jest-preset-angular/setup-jest'; +import 'zone.js'; diff --git a/integration-libs/omf/test.ts b/integration-libs/omf/test.ts new file mode 100644 index 00000000000..cb29fd468dd --- /dev/null +++ b/integration-libs/omf/test.ts @@ -0,0 +1,22 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), + { + teardown: { destroyAfterEach: false }, + } +); diff --git a/integration-libs/omf/tsconfig.lib.json b/integration-libs/omf/tsconfig.lib.json new file mode 100644 index 00000000000..f49a4958f7f --- /dev/null +++ b/integration-libs/omf/tsconfig.lib.json @@ -0,0 +1,102 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "module": "es2022", + "moduleResolution": "node", + "declaration": true, + "sourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "importHelpers": true, + "skipLibCheck": true, + "lib": ["dom", "esnext"], + "paths": { + "@spartacus/core": ["dist/core"], + "@spartacus/order/assets": ["dist/order/assets"], + "@spartacus/order/components": ["dist/order/components"], + "@spartacus/order/core": ["dist/order/core"], + "@spartacus/order": ["dist/order"], + "@spartacus/order/occ": ["dist/order/occ"], + "@spartacus/order/root": ["dist/order/root"], + "@spartacus/cart/base/assets": ["dist/cart/base/assets"], + "@spartacus/cart/base/components/add-to-cart": [ + "dist/cart/base/components/add-to-cart" + ], + "@spartacus/cart/base/components/mini-cart": [ + "dist/cart/base/components/mini-cart" + ], + "@spartacus/cart/base/components": ["dist/cart/base/components"], + "@spartacus/cart/base/core": ["dist/cart/base/core"], + "@spartacus/cart/base": ["dist/cart/base"], + "@spartacus/cart/base/occ": ["dist/cart/base/occ"], + "@spartacus/cart/base/root": ["dist/cart/base/root"], + "@spartacus/cart/import-export/assets": [ + "dist/cart/import-export/assets" + ], + "@spartacus/cart/import-export/components": [ + "dist/cart/import-export/components" + ], + "@spartacus/cart/import-export/core": ["dist/cart/import-export/core"], + "@spartacus/cart/import-export": ["dist/cart/import-export"], + "@spartacus/cart/import-export/root": ["dist/cart/import-export/root"], + "@spartacus/cart": ["dist/cart"], + "@spartacus/cart/quick-order/assets": ["dist/cart/quick-order/assets"], + "@spartacus/cart/quick-order/components": [ + "dist/cart/quick-order/components" + ], + "@spartacus/cart/quick-order/core": ["dist/cart/quick-order/core"], + "@spartacus/cart/quick-order": ["dist/cart/quick-order"], + "@spartacus/cart/quick-order/root": ["dist/cart/quick-order/root"], + "@spartacus/cart/saved-cart/assets": ["dist/cart/saved-cart/assets"], + "@spartacus/cart/saved-cart/components": [ + "dist/cart/saved-cart/components" + ], + "@spartacus/cart/saved-cart/core": ["dist/cart/saved-cart/core"], + "@spartacus/cart/saved-cart": ["dist/cart/saved-cart"], + "@spartacus/cart/saved-cart/occ": ["dist/cart/saved-cart/occ"], + "@spartacus/cart/saved-cart/root": ["dist/cart/saved-cart/root"], + "@spartacus/cart/wish-list/assets": ["dist/cart/wish-list/assets"], + "@spartacus/cart/wish-list/components/add-to-wishlist": [ + "dist/cart/wish-list/components/add-to-wishlist" + ], + "@spartacus/cart/wish-list/components": [ + "dist/cart/wish-list/components" + ], + "@spartacus/cart/wish-list/core": ["dist/cart/wish-list/core"], + "@spartacus/cart/wish-list": ["dist/cart/wish-list"], + "@spartacus/cart/wish-list/root": ["dist/cart/wish-list/root"], + "@spartacus/pdf-invoices/assets": ["dist/pdf-invoices/assets"], + "@spartacus/pdf-invoices/components": ["dist/pdf-invoices/components"], + "@spartacus/pdf-invoices/core": ["dist/pdf-invoices/core"], + "@spartacus/pdf-invoices": ["dist/pdf-invoices"], + "@spartacus/pdf-invoices/occ": ["dist/pdf-invoices/occ"], + "@spartacus/pdf-invoices/root": ["dist/pdf-invoices/root"], + "@spartacus/storefront": ["dist/storefrontlib"], + "@spartacus/user/account/assets": ["dist/user/account/assets"], + "@spartacus/user/account/components": ["dist/user/account/components"], + "@spartacus/user/account/core": ["dist/user/account/core"], + "@spartacus/user/account": ["dist/user/account"], + "@spartacus/user/account/occ": ["dist/user/account/occ"], + "@spartacus/user/account/root": ["dist/user/account/root"], + "@spartacus/user": ["dist/user"], + "@spartacus/user/profile/assets": ["dist/user/profile/assets"], + "@spartacus/user/profile/components": ["dist/user/profile/components"], + "@spartacus/user/profile/core": ["dist/user/profile/core"], + "@spartacus/user/profile": ["dist/user/profile"], + "@spartacus/user/profile/occ": ["dist/user/profile/occ"], + "@spartacus/user/profile/root": ["dist/user/profile/root"] + }, + "resolveJsonModule": true, + "esModuleInterop": true + }, + "angularCompilerOptions": { + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": ["test.ts", "**/*.spec.ts"] +} diff --git a/integration-libs/omf/tsconfig.lib.prod.json b/integration-libs/omf/tsconfig.lib.prod.json new file mode 100644 index 00000000000..2a2faa884cf --- /dev/null +++ b/integration-libs/omf/tsconfig.lib.prod.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/integration-libs/omf/tsconfig.schematics.json b/integration-libs/omf/tsconfig.schematics.json new file mode 100644 index 00000000000..ed17cd88119 --- /dev/null +++ b/integration-libs/omf/tsconfig.schematics.json @@ -0,0 +1,634 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "module": "CommonJs", + "types": ["jest"], + "paths": { + "@spartacus/schematics": ["../../projects/schematics/index"], + "@spartacus/setup": ["../../core-libs/setup/public_api"], + "@spartacus/setup/ssr": ["../../core-libs/setup/ssr/public_api"], + "@spartacus/asm/assets": ["../../feature-libs/asm/assets/public_api"], + "@spartacus/asm/components": [ + "../../feature-libs/asm/components/public_api" + ], + "@spartacus/asm/core": ["../../feature-libs/asm/core/public_api"], + "@spartacus/asm/customer-360/assets": [ + "../../feature-libs/asm/customer-360/assets/public_api" + ], + "@spartacus/asm/customer-360/components": [ + "../../feature-libs/asm/customer-360/components/public_api" + ], + "@spartacus/asm/customer-360/core": [ + "../../feature-libs/asm/customer-360/core/public_api" + ], + "@spartacus/asm/customer-360": [ + "../../feature-libs/asm/customer-360/public_api" + ], + "@spartacus/asm/customer-360/occ": [ + "../../feature-libs/asm/customer-360/occ/public_api" + ], + "@spartacus/asm/customer-360/root": [ + "../../feature-libs/asm/customer-360/root/public_api" + ], + "@spartacus/asm": ["../../feature-libs/asm/public_api"], + "@spartacus/asm/occ": ["../../feature-libs/asm/occ/public_api"], + "@spartacus/asm/root": ["../../feature-libs/asm/root/public_api"], + "@spartacus/cart/base/assets": [ + "../../feature-libs/cart/base/assets/public_api" + ], + "@spartacus/cart/base/components/add-to-cart": [ + "../../feature-libs/cart/base/components/add-to-cart/public_api" + ], + "@spartacus/cart/base/components/mini-cart": [ + "../../feature-libs/cart/base/components/mini-cart/public_api" + ], + "@spartacus/cart/base/components": [ + "../../feature-libs/cart/base/components/public_api" + ], + "@spartacus/cart/base/core": [ + "../../feature-libs/cart/base/core/public_api" + ], + "@spartacus/cart/base": ["../../feature-libs/cart/base/public_api"], + "@spartacus/cart/base/occ": [ + "../../feature-libs/cart/base/occ/public_api" + ], + "@spartacus/cart/base/root": [ + "../../feature-libs/cart/base/root/public_api" + ], + "@spartacus/cart/import-export/assets": [ + "../../feature-libs/cart/import-export/assets/public_api" + ], + "@spartacus/cart/import-export/components": [ + "../../feature-libs/cart/import-export/components/public_api" + ], + "@spartacus/cart/import-export/core": [ + "../../feature-libs/cart/import-export/core/public_api" + ], + "@spartacus/cart/import-export": [ + "../../feature-libs/cart/import-export/public_api" + ], + "@spartacus/cart/import-export/root": [ + "../../feature-libs/cart/import-export/root/public_api" + ], + "@spartacus/cart": ["../../feature-libs/cart/public_api"], + "@spartacus/cart/quick-order/assets": [ + "../../feature-libs/cart/quick-order/assets/public_api" + ], + "@spartacus/cart/quick-order/components": [ + "../../feature-libs/cart/quick-order/components/public_api" + ], + "@spartacus/cart/quick-order/core": [ + "../../feature-libs/cart/quick-order/core/public_api" + ], + "@spartacus/cart/quick-order": [ + "../../feature-libs/cart/quick-order/public_api" + ], + "@spartacus/cart/quick-order/root": [ + "../../feature-libs/cart/quick-order/root/public_api" + ], + "@spartacus/cart/saved-cart/assets": [ + "../../feature-libs/cart/saved-cart/assets/public_api" + ], + "@spartacus/cart/saved-cart/components": [ + "../../feature-libs/cart/saved-cart/components/public_api" + ], + "@spartacus/cart/saved-cart/core": [ + "../../feature-libs/cart/saved-cart/core/public_api" + ], + "@spartacus/cart/saved-cart": [ + "../../feature-libs/cart/saved-cart/public_api" + ], + "@spartacus/cart/saved-cart/occ": [ + "../../feature-libs/cart/saved-cart/occ/public_api" + ], + "@spartacus/cart/saved-cart/root": [ + "../../feature-libs/cart/saved-cart/root/public_api" + ], + "@spartacus/cart/wish-list/assets": [ + "../../feature-libs/cart/wish-list/assets/public_api" + ], + "@spartacus/cart/wish-list/components/add-to-wishlist": [ + "../../feature-libs/cart/wish-list/components/add-to-wishlist/public_api" + ], + "@spartacus/cart/wish-list/components": [ + "../../feature-libs/cart/wish-list/components/public_api" + ], + "@spartacus/cart/wish-list/core": [ + "../../feature-libs/cart/wish-list/core/public_api" + ], + "@spartacus/cart/wish-list": [ + "../../feature-libs/cart/wish-list/public_api" + ], + "@spartacus/cart/wish-list/root": [ + "../../feature-libs/cart/wish-list/root/public_api" + ], + "@spartacus/checkout/b2b/assets": [ + "../../feature-libs/checkout/b2b/assets/public_api" + ], + "@spartacus/checkout/b2b/components": [ + "../../feature-libs/checkout/b2b/components/public_api" + ], + "@spartacus/checkout/b2b/core": [ + "../../feature-libs/checkout/b2b/core/public_api" + ], + "@spartacus/checkout/b2b": ["../../feature-libs/checkout/b2b/public_api"], + "@spartacus/checkout/b2b/occ": [ + "../../feature-libs/checkout/b2b/occ/public_api" + ], + "@spartacus/checkout/b2b/root": [ + "../../feature-libs/checkout/b2b/root/public_api" + ], + "@spartacus/checkout/base/assets": [ + "../../feature-libs/checkout/base/assets/public_api" + ], + "@spartacus/checkout/base/components": [ + "../../feature-libs/checkout/base/components/public_api" + ], + "@spartacus/checkout/base/core": [ + "../../feature-libs/checkout/base/core/public_api" + ], + "@spartacus/checkout/base": [ + "../../feature-libs/checkout/base/public_api" + ], + "@spartacus/checkout/base/occ": [ + "../../feature-libs/checkout/base/occ/public_api" + ], + "@spartacus/checkout/base/root": [ + "../../feature-libs/checkout/base/root/public_api" + ], + "@spartacus/checkout": ["../../feature-libs/checkout/public_api"], + "@spartacus/checkout/scheduled-replenishment/assets": [ + "../../feature-libs/checkout/scheduled-replenishment/assets/public_api" + ], + "@spartacus/checkout/scheduled-replenishment/components": [ + "../../feature-libs/checkout/scheduled-replenishment/components/public_api" + ], + "@spartacus/checkout/scheduled-replenishment": [ + "../../feature-libs/checkout/scheduled-replenishment/public_api" + ], + "@spartacus/checkout/scheduled-replenishment/root": [ + "../../feature-libs/checkout/scheduled-replenishment/root/public_api" + ], + "@spartacus/customer-ticketing/assets": [ + "../../feature-libs/customer-ticketing/assets/public_api" + ], + "@spartacus/customer-ticketing/components": [ + "../../feature-libs/customer-ticketing/components/public_api" + ], + "@spartacus/customer-ticketing/core": [ + "../../feature-libs/customer-ticketing/core/public_api" + ], + "@spartacus/customer-ticketing": [ + "../../feature-libs/customer-ticketing/public_api" + ], + "@spartacus/customer-ticketing/occ": [ + "../../feature-libs/customer-ticketing/occ/public_api" + ], + "@spartacus/customer-ticketing/root": [ + "../../feature-libs/customer-ticketing/root/public_api" + ], + "@spartacus/estimated-delivery-date/assets": [ + "../../feature-libs/estimated-delivery-date/assets/public_api" + ], + "@spartacus/estimated-delivery-date": [ + "../../feature-libs/estimated-delivery-date/public_api" + ], + "@spartacus/estimated-delivery-date/root": [ + "../../feature-libs/estimated-delivery-date/root/public_api" + ], + "@spartacus/estimated-delivery-date/show-estimated-delivery-date": [ + "../../feature-libs/estimated-delivery-date/show-estimated-delivery-date/public_api" + ], + "@spartacus/order/assets": ["../../feature-libs/order/assets/public_api"], + "@spartacus/order/components": [ + "../../feature-libs/order/components/public_api" + ], + "@spartacus/order/core": ["../../feature-libs/order/core/public_api"], + "@spartacus/order": ["../../feature-libs/order/public_api"], + "@spartacus/order/occ": ["../../feature-libs/order/occ/public_api"], + "@spartacus/order/root": ["../../feature-libs/order/root/public_api"], + "@spartacus/organization/account-summary/assets": [ + "../../feature-libs/organization/account-summary/assets/public_api" + ], + "@spartacus/organization/account-summary/components": [ + "../../feature-libs/organization/account-summary/components/public_api" + ], + "@spartacus/organization/account-summary/core": [ + "../../feature-libs/organization/account-summary/core/public_api" + ], + "@spartacus/organization/account-summary": [ + "../../feature-libs/organization/account-summary/public_api" + ], + "@spartacus/organization/account-summary/occ": [ + "../../feature-libs/organization/account-summary/occ/public_api" + ], + "@spartacus/organization/account-summary/root": [ + "../../feature-libs/organization/account-summary/root/public_api" + ], + "@spartacus/organization/administration/assets": [ + "../../feature-libs/organization/administration/assets/public_api" + ], + "@spartacus/organization/administration/components": [ + "../../feature-libs/organization/administration/components/public_api" + ], + "@spartacus/organization/administration/core": [ + "../../feature-libs/organization/administration/core/public_api" + ], + "@spartacus/organization/administration": [ + "../../feature-libs/organization/administration/public_api" + ], + "@spartacus/organization/administration/occ": [ + "../../feature-libs/organization/administration/occ/public_api" + ], + "@spartacus/organization/administration/root": [ + "../../feature-libs/organization/administration/root/public_api" + ], + "@spartacus/organization": ["../../feature-libs/organization/public_api"], + "@spartacus/organization/order-approval/assets": [ + "../../feature-libs/organization/order-approval/assets/public_api" + ], + "@spartacus/organization/order-approval": [ + "../../feature-libs/organization/order-approval/public_api" + ], + "@spartacus/organization/order-approval/root": [ + "../../feature-libs/organization/order-approval/root/public_api" + ], + "@spartacus/organization/unit-order/assets": [ + "../../feature-libs/organization/unit-order/assets/public_api" + ], + "@spartacus/organization/unit-order/components": [ + "../../feature-libs/organization/unit-order/components/public_api" + ], + "@spartacus/organization/unit-order/core": [ + "../../feature-libs/organization/unit-order/core/public_api" + ], + "@spartacus/organization/unit-order": [ + "../../feature-libs/organization/unit-order/public_api" + ], + "@spartacus/organization/unit-order/occ": [ + "../../feature-libs/organization/unit-order/occ/public_api" + ], + "@spartacus/organization/unit-order/root": [ + "../../feature-libs/organization/unit-order/root/public_api" + ], + "@spartacus/organization/user-registration/assets": [ + "../../feature-libs/organization/user-registration/assets/public_api" + ], + "@spartacus/organization/user-registration/components": [ + "../../feature-libs/organization/user-registration/components/public_api" + ], + "@spartacus/organization/user-registration/core": [ + "../../feature-libs/organization/user-registration/core/public_api" + ], + "@spartacus/organization/user-registration": [ + "../../feature-libs/organization/user-registration/public_api" + ], + "@spartacus/organization/user-registration/occ": [ + "../../feature-libs/organization/user-registration/occ/public_api" + ], + "@spartacus/organization/user-registration/root": [ + "../../feature-libs/organization/user-registration/root/public_api" + ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], + "@spartacus/pickup-in-store/assets": [ + "../../feature-libs/pickup-in-store/assets/public_api" + ], + "@spartacus/pickup-in-store/components": [ + "../../feature-libs/pickup-in-store/components/public_api" + ], + "@spartacus/pickup-in-store/core": [ + "../../feature-libs/pickup-in-store/core/public_api" + ], + "@spartacus/pickup-in-store": [ + "../../feature-libs/pickup-in-store/public_api" + ], + "@spartacus/pickup-in-store/occ": [ + "../../feature-libs/pickup-in-store/occ/public_api" + ], + "@spartacus/pickup-in-store/root": [ + "../../feature-libs/pickup-in-store/root/public_api" + ], + "@spartacus/product-configurator/common/assets": [ + "../../feature-libs/product-configurator/common/assets/public_api" + ], + "@spartacus/product-configurator/common": [ + "../../feature-libs/product-configurator/common/public_api" + ], + "@spartacus/product-configurator": [ + "../../feature-libs/product-configurator/public_api" + ], + "@spartacus/product-configurator/rulebased/cpq": [ + "../../feature-libs/product-configurator/rulebased/cpq/public_api" + ], + "@spartacus/product-configurator/rulebased": [ + "../../feature-libs/product-configurator/rulebased/public_api" + ], + "@spartacus/product-configurator/rulebased/root": [ + "../../feature-libs/product-configurator/rulebased/root/public_api" + ], + "@spartacus/product-configurator/textfield": [ + "../../feature-libs/product-configurator/textfield/public_api" + ], + "@spartacus/product-configurator/textfield/root": [ + "../../feature-libs/product-configurator/textfield/root/public_api" + ], + "@spartacus/product/bulk-pricing/assets": [ + "../../feature-libs/product/bulk-pricing/assets/public_api" + ], + "@spartacus/product/bulk-pricing/components": [ + "../../feature-libs/product/bulk-pricing/components/public_api" + ], + "@spartacus/product/bulk-pricing/core": [ + "../../feature-libs/product/bulk-pricing/core/public_api" + ], + "@spartacus/product/bulk-pricing": [ + "../../feature-libs/product/bulk-pricing/public_api" + ], + "@spartacus/product/bulk-pricing/occ": [ + "../../feature-libs/product/bulk-pricing/occ/public_api" + ], + "@spartacus/product/bulk-pricing/root": [ + "../../feature-libs/product/bulk-pricing/root/public_api" + ], + "@spartacus/product/future-stock/assets": [ + "../../feature-libs/product/future-stock/assets/public_api" + ], + "@spartacus/product/future-stock/components": [ + "../../feature-libs/product/future-stock/components/public_api" + ], + "@spartacus/product/future-stock/core": [ + "../../feature-libs/product/future-stock/core/public_api" + ], + "@spartacus/product/future-stock": [ + "../../feature-libs/product/future-stock/public_api" + ], + "@spartacus/product/future-stock/occ": [ + "../../feature-libs/product/future-stock/occ/public_api" + ], + "@spartacus/product/future-stock/root": [ + "../../feature-libs/product/future-stock/root/public_api" + ], + "@spartacus/product/image-zoom/assets": [ + "../../feature-libs/product/image-zoom/assets/public_api" + ], + "@spartacus/product/image-zoom/components": [ + "../../feature-libs/product/image-zoom/components/public_api" + ], + "@spartacus/product/image-zoom": [ + "../../feature-libs/product/image-zoom/public_api" + ], + "@spartacus/product/image-zoom/root": [ + "../../feature-libs/product/image-zoom/root/public_api" + ], + "@spartacus/product": ["../../feature-libs/product/public_api"], + "@spartacus/product/variants/assets": [ + "../../feature-libs/product/variants/assets/public_api" + ], + "@spartacus/product/variants/components": [ + "../../feature-libs/product/variants/components/public_api" + ], + "@spartacus/product/variants": [ + "../../feature-libs/product/variants/public_api" + ], + "@spartacus/product/variants/occ": [ + "../../feature-libs/product/variants/occ/public_api" + ], + "@spartacus/product/variants/root": [ + "../../feature-libs/product/variants/root/public_api" + ], + "@spartacus/qualtrics/components": [ + "../../feature-libs/qualtrics/components/public_api" + ], + "@spartacus/qualtrics": ["../../feature-libs/qualtrics/public_api"], + "@spartacus/qualtrics/root": [ + "../../feature-libs/qualtrics/root/public_api" + ], + "@spartacus/quote/assets": ["../../feature-libs/quote/assets/public_api"], + "@spartacus/quote/components/cart-guard": [ + "../../feature-libs/quote/components/cart-guard/public_api" + ], + "@spartacus/quote/components": [ + "../../feature-libs/quote/components/public_api" + ], + "@spartacus/quote/components/request-button": [ + "../../feature-libs/quote/components/request-button/public_api" + ], + "@spartacus/quote/core": ["../../feature-libs/quote/core/public_api"], + "@spartacus/quote": ["../../feature-libs/quote/public_api"], + "@spartacus/quote/occ": ["../../feature-libs/quote/occ/public_api"], + "@spartacus/quote/root": ["../../feature-libs/quote/root/public_api"], + "@spartacus/requested-delivery-date/assets": [ + "../../feature-libs/requested-delivery-date/assets/public_api" + ], + "@spartacus/requested-delivery-date/core": [ + "../../feature-libs/requested-delivery-date/core/public_api" + ], + "@spartacus/requested-delivery-date": [ + "../../feature-libs/requested-delivery-date/public_api" + ], + "@spartacus/requested-delivery-date/occ": [ + "../../feature-libs/requested-delivery-date/occ/public_api" + ], + "@spartacus/requested-delivery-date/root": [ + "../../feature-libs/requested-delivery-date/root/public_api" + ], + "@spartacus/smartedit/core": [ + "../../feature-libs/smartedit/core/public_api" + ], + "@spartacus/smartedit": ["../../feature-libs/smartedit/public_api"], + "@spartacus/smartedit/root": [ + "../../feature-libs/smartedit/root/public_api" + ], + "@spartacus/storefinder/assets": [ + "../../feature-libs/storefinder/assets/public_api" + ], + "@spartacus/storefinder/components": [ + "../../feature-libs/storefinder/components/public_api" + ], + "@spartacus/storefinder/core": [ + "../../feature-libs/storefinder/core/public_api" + ], + "@spartacus/storefinder": ["../../feature-libs/storefinder/public_api"], + "@spartacus/storefinder/occ": [ + "../../feature-libs/storefinder/occ/public_api" + ], + "@spartacus/storefinder/root": [ + "../../feature-libs/storefinder/root/public_api" + ], + "@spartacus/tracking": ["../../feature-libs/tracking/public_api"], + "@spartacus/tracking/personalization/core": [ + "../../feature-libs/tracking/personalization/core/public_api" + ], + "@spartacus/tracking/personalization": [ + "../../feature-libs/tracking/personalization/public_api" + ], + "@spartacus/tracking/personalization/root": [ + "../../feature-libs/tracking/personalization/root/public_api" + ], + "@spartacus/tracking/tms/aep": [ + "../../feature-libs/tracking/tms/aep/public_api" + ], + "@spartacus/tracking/tms/core": [ + "../../feature-libs/tracking/tms/core/public_api" + ], + "@spartacus/tracking/tms/gtm": [ + "../../feature-libs/tracking/tms/gtm/public_api" + ], + "@spartacus/tracking/tms": ["../../feature-libs/tracking/tms/public_api"], + "@spartacus/user/account/assets": [ + "../../feature-libs/user/account/assets/public_api" + ], + "@spartacus/user/account/components": [ + "../../feature-libs/user/account/components/public_api" + ], + "@spartacus/user/account/core": [ + "../../feature-libs/user/account/core/public_api" + ], + "@spartacus/user/account": ["../../feature-libs/user/account/public_api"], + "@spartacus/user/account/occ": [ + "../../feature-libs/user/account/occ/public_api" + ], + "@spartacus/user/account/root": [ + "../../feature-libs/user/account/root/public_api" + ], + "@spartacus/user": ["../../feature-libs/user/public_api"], + "@spartacus/user/profile/assets": [ + "../../feature-libs/user/profile/assets/public_api" + ], + "@spartacus/user/profile/components": [ + "../../feature-libs/user/profile/components/public_api" + ], + "@spartacus/user/profile/core": [ + "../../feature-libs/user/profile/core/public_api" + ], + "@spartacus/user/profile": ["../../feature-libs/user/profile/public_api"], + "@spartacus/user/profile/occ": [ + "../../feature-libs/user/profile/occ/public_api" + ], + "@spartacus/user/profile/root": [ + "../../feature-libs/user/profile/root/public_api" + ], + "@spartacus/cdc/assets": ["../../integration-libs/cdc/assets/public_api"], + "@spartacus/cdc/components": [ + "../../integration-libs/cdc/components/public_api" + ], + "@spartacus/cdc/core": ["../../integration-libs/cdc/core/public_api"], + "@spartacus/cdc": ["../../integration-libs/cdc/public_api"], + "@spartacus/cdc/organization/administration": [ + "../../integration-libs/cdc/organization/administration/public_api" + ], + "@spartacus/cdc/organization/user-registration": [ + "../../integration-libs/cdc/organization/user-registration/public_api" + ], + "@spartacus/cdc/root": ["../../integration-libs/cdc/root/public_api"], + "@spartacus/cdc/user-account": [ + "../../integration-libs/cdc/user-account/public_api" + ], + "@spartacus/cdc/user-profile": [ + "../../integration-libs/cdc/user-profile/public_api" + ], + "@spartacus/cdp/customer-ticketing": [ + "../../integration-libs/cdp/customer-ticketing/public_api" + ], + "@spartacus/cdp": ["../../integration-libs/cdp/public_api"], + "@spartacus/cds/assets": ["../../integration-libs/cds/assets/public_api"], + "@spartacus/cds": ["../../integration-libs/cds/public_api"], + "@spartacus/cpq-quote/assets": [ + "../../integration-libs/cpq-quote/assets/public_api" + ], + "@spartacus/cpq-quote/cpq-quote-discount": [ + "../../integration-libs/cpq-quote/cpq-quote-discount/public_api" + ], + "@spartacus/cpq-quote": ["../../integration-libs/cpq-quote/public_api"], + "@spartacus/cpq-quote/root": [ + "../../integration-libs/cpq-quote/root/public_api" + ], + "@spartacus/digital-payments/assets": [ + "../../integration-libs/digital-payments/assets/public_api" + ], + "@spartacus/digital-payments": [ + "../../integration-libs/digital-payments/public_api" + ], + "@spartacus/epd-visualization/assets": [ + "../../integration-libs/epd-visualization/assets/public_api" + ], + "@spartacus/epd-visualization/components": [ + "../../integration-libs/epd-visualization/components/public_api" + ], + "@spartacus/epd-visualization/core": [ + "../../integration-libs/epd-visualization/core/public_api" + ], + "@spartacus/epd-visualization/epd-visualization-api": [ + "../../integration-libs/epd-visualization/epd-visualization-api/public_api" + ], + "@spartacus/epd-visualization": [ + "../../integration-libs/epd-visualization/public_api" + ], + "@spartacus/epd-visualization/root": [ + "../../integration-libs/epd-visualization/root/public_api" + ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], + "@spartacus/opps": ["../../integration-libs/opps/public_api"], + "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], + "@spartacus/s4-service/assets": [ + "../../integration-libs/s4-service/assets/public_api" + ], + "@spartacus/s4-service/checkout": [ + "../../integration-libs/s4-service/checkout/public_api" + ], + "@spartacus/s4-service": ["../../integration-libs/s4-service/public_api"], + "@spartacus/s4-service/order": [ + "../../integration-libs/s4-service/order/public_api" + ], + "@spartacus/s4-service/root": [ + "../../integration-libs/s4-service/root/public_api" + ], + "@spartacus/s4om/assets": [ + "../../integration-libs/s4om/assets/public_api" + ], + "@spartacus/s4om": ["../../integration-libs/s4om/public_api"], + "@spartacus/s4om/root": ["../../integration-libs/s4om/root/public_api"], + "@spartacus/segment-refs": [ + "../../integration-libs/segment-refs/public_api" + ], + "@spartacus/segment-refs/root": [ + "../../integration-libs/segment-refs/root/public_api" + ], + "@spartacus/assets": ["../../projects/assets/src/public_api"], + "@spartacus/core": ["../../projects/core/public_api"], + "@spartacus/storefront": ["../../projects/storefrontlib/public_api"] + }, + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "strictNullChecks": true, + "resolveJsonModule": true, + "esModuleInterop": true + }, + "include": ["schematics/**/*.ts"], + "exclude": ["schematics/*/files/**/*", "schematics/**/*_spec.ts"] +} diff --git a/integration-libs/omf/tsconfig.spec.json b/integration-libs/omf/tsconfig.spec.json new file mode 100644 index 00000000000..32e84d9e66c --- /dev/null +++ b/integration-libs/omf/tsconfig.spec.json @@ -0,0 +1,12 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "strict": false, + "module": "es2022", + "types": ["jasmine", "node"] + }, + "files": ["test.ts"], + "include": ["**/*.spec.ts", "**/*.d.ts"] +} diff --git a/integration-libs/opps/tsconfig.schematics.json b/integration-libs/opps/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/integration-libs/opps/tsconfig.schematics.json +++ b/integration-libs/opps/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/s4-service/tsconfig.schematics.json b/integration-libs/s4-service/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/integration-libs/s4-service/tsconfig.schematics.json +++ b/integration-libs/s4-service/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/s4om/tsconfig.schematics.json b/integration-libs/s4om/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/integration-libs/s4om/tsconfig.schematics.json +++ b/integration-libs/s4om/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/integration-libs/segment-refs/tsconfig.schematics.json b/integration-libs/segment-refs/tsconfig.schematics.json index b4c289b5c84..ed17cd88119 100644 --- a/integration-libs/segment-refs/tsconfig.schematics.json +++ b/integration-libs/segment-refs/tsconfig.schematics.json @@ -582,6 +582,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/package.json b/package.json index 11c482ee6de..347565640c2 100644 --- a/package.json +++ b/package.json @@ -25,13 +25,14 @@ "build:epd-visualization": "npm --prefix integration-libs/epd-visualization run build:schematics && nx build epd-visualization --configuration production", "build:estimated-delivery-date": "npm --prefix feature-libs/estimated-delivery-date run build:schematics && nx build estimated-delivery-date --configuration production", "build:order": "npm --prefix feature-libs/order run build:schematics && nx build order --configuration production", - "build:libs": "nx build core --configuration production && nx build storefrontlib --configuration production && concurrently --kill-others-on-fail npm:build:schematics npm:build:user && npm run build:cart && npm run build:pdf-invoices && npm run build:order && npm run build:storefinder && concurrently --kill-others-on-fail npm:build:checkout npm:build:asm npm:build:tracking npm:build:customer-ticketing && concurrently --kill-others-on-fail npm:build:organization npm:build:product npm:build:product-configurator npm:build:requested-delivery-date && concurrently --kill-others-on-fail npm:build:estimated-delivery-date && concurrently --kill-others-on-fail npm:build:smartedit npm:build:qualtrics npm:build:assets npm:build:cds npm:build:cdc npm:build:cdp npm:build:digital-payments npm:build:epd-visualization npm:build:s4om npm:build:cpq-quote npm:build:segment-refs npm:build:opps npm:build:pickup-in-store npm:build:quote && npm run build:setup && npm run build:s4-service", + "build:libs": "nx build core --configuration production && nx build storefrontlib --configuration production && concurrently --kill-others-on-fail npm:build:schematics npm:build:user && npm run build:cart && npm run build:pdf-invoices && npm run build:order && npm run build:storefinder && concurrently --kill-others-on-fail npm:build:checkout npm:build:asm npm:build:tracking npm:build:customer-ticketing && concurrently --kill-others-on-fail npm:build:organization npm:build:product npm:build:product-configurator npm:build:requested-delivery-date && concurrently --kill-others-on-fail npm:build:estimated-delivery-date && concurrently --kill-others-on-fail npm:build:smartedit npm:build:qualtrics npm:build:assets npm:build:cds npm:build:cdc npm:build:cdp npm:build:digital-payments npm:build:epd-visualization npm:build:s4om npm:build:omf npm:build:cpq-quote npm:build:segment-refs npm:build:opps npm:build:pickup-in-store npm:build:quote && npm run build:setup && npm run build:s4-service", "build:organization": "npm --prefix feature-libs/organization run build:schematics && nx build organization --configuration production", "build:pdf-invoices": "npm --prefix feature-libs/pdf-invoices run build:schematics && nx build pdf-invoices --configuration production", "build:pickup-in-store": "npm --prefix feature-libs/pickup-in-store run build:schematics && nx build pickup-in-store --configuration production", "build:product": "npm --prefix feature-libs/product run build:schematics && nx build product --configuration production", "build:product-configurator": "npm --prefix feature-libs/product-configurator run build:schematics && nx build product-configurator --configuration production", "build:s4om": "npm --prefix integration-libs/s4om run build:schematics && nx build s4om --configuration production", + "build:omf": "npm --prefix integration-libs/omf run build:schematics && nx build omf --configuration production", "build:cpq-quote": "npm --prefix integration-libs/cpq-quote run build:schematics && npx nx build cpq-quote --configuration production", "build:segment-refs": "npm --prefix integration-libs/segment-refs run build:schematics && nx build segment-refs --configuration production", "build:opps": "npm --prefix integration-libs/opps run build:schematics && nx build opps --configuration production", @@ -99,7 +100,7 @@ "start:pwa": "cd ./dist/storefrontapp/ && http-server --silent --proxy http://localhost:4200? -p 4200", "test": "nx test", "test:all-schematics": "set -e; npm --prefix ./projects/schematics test -- -u; for dir in feature-libs/* integration-libs/*; do (cd $dir && npm run test:schematics -- -u); done", - "test:libs": "concurrently \"nx test core --code-coverage\" \"nx test storefrontlib --code-coverage\" \"nx test cart --code-coverage\" \"nx test organization --code-coverage\" \"nx test storefinder --code-coverage\" \"nx test smartedit --code-coverage\" \"nx test asm --code-coverage\" \"nx test qualtrics --code-coverage\" \"nx test product --code-coverage\" \"nx test product-configurator --code-coverage\" \"nx test customer-ticketing --code-coverage\" \"nx test cdc --code-coverage\" \"nx test s4-service --code-coverage\" \"nx test cdp --code-coverage\" \"nx test opps --code-coverage\" \"nx test setup --code-coverage\" \"nx test checkout --code-coverage\" \"nx test order --code-coverage\" \"nx test digital-payments --code-coverage\" \"nx test epd-visualization --code-coverage\" \"nx test pickup-in-store --code-coverage\" \"nx test s4om --code-coverage\" \"nx test cpq-quote --code-coverage\" \"nx test requested-delivery-date --code-coverage\" \"nx test estimated-delivery-date --code-coverage\" \"nx test pdf-invoices --code-coverage\" \"nx test quote --code-coverage\"", + "test:libs": "concurrently \"nx test core --code-coverage\" \"nx test storefrontlib --code-coverage\" \"nx test cart --code-coverage\" \"nx test organization --code-coverage\" \"nx test storefinder --code-coverage\" \"nx test smartedit --code-coverage\" \"nx test asm --code-coverage\" \"nx test qualtrics --code-coverage\" \"nx test product --code-coverage\" \"nx test product-configurator --code-coverage\" \"nx test customer-ticketing --code-coverage\" \"nx test cdc --code-coverage\" \"nx test s4-service --code-coverage\" \"nx test cdp --code-coverage\" \"nx test opps --code-coverage\" \"nx test setup --code-coverage\" \"nx test checkout --code-coverage\" \"nx test order --code-coverage\" \"nx test digital-payments --code-coverage\" \"nx test epd-visualization --code-coverage\" \"nx test pickup-in-store --code-coverage\" \"nx test s4om --code-coverage\" \"nx test cpq-quote --code-coverage\" \"nx test omf --code-coverage\" \"nx test requested-delivery-date --code-coverage\" \"nx test estimated-delivery-date --code-coverage\" \"nx test pdf-invoices --code-coverage\" \"nx test quote --code-coverage\"", "test:storefront:lib": "nx test storefrontlib --source-map --code-coverage", "dev:ssr": "env-cmd --no-override -e dev,b2c,$SPA_ENV cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 nx run storefrontapp:serve-ssr", "serve:ssr": "node dist/storefrontapp-server/main.js", diff --git a/projects/schematics/src/add-spartacus/schema.json b/projects/schematics/src/add-spartacus/schema.json index a24f5f32cf7..9fdd8b7a9ce 100644 --- a/projects/schematics/src/add-spartacus/schema.json +++ b/projects/schematics/src/add-spartacus/schema.json @@ -54,6 +54,7 @@ "S4HANA-Order-Management", "cpq-quote", "s4-service", + "OMF", "SmartEdit", "Store-Finder", "Personalization", @@ -233,6 +234,10 @@ "value": "s4-service", "label": "S/4HANA Service Integration (b2b feature)" }, + { + "value": "OMF", + "label": "SAP Order Management Foundation Integration" + }, { "value": "SmartEdit", "label": "SmartEdit" diff --git a/projects/schematics/src/dependencies.json b/projects/schematics/src/dependencies.json index 1afe034ca49..f9eecf22581 100644 --- a/projects/schematics/src/dependencies.json +++ b/projects/schematics/src/dependencies.json @@ -391,6 +391,17 @@ "bootstrap": "^4.6.2", "rxjs": "^7.8.0" }, + "@spartacus/omf": { + "@angular-devkit/schematics": "^17.0.5", + "@angular/common": "^17.0.5", + "@angular/core": "^17.0.5", + "@angular/router": "^17.0.5", + "@ngrx/store": "^17.0.1", + "@spartacus/core": "2211.27.0", + "@spartacus/order": "2211.27.0", + "@spartacus/schematics": "2211.27.0", + "rxjs": "^7.8.0" + }, "@spartacus/opps": { "@angular-devkit/schematics": "^17.0.5", "@angular/common": "^17.0.5", diff --git a/projects/schematics/src/shared/lib-configs/integration-libs/index.ts b/projects/schematics/src/shared/lib-configs/integration-libs/index.ts index d57a8c8d298..210ad10a547 100644 --- a/projects/schematics/src/shared/lib-configs/integration-libs/index.ts +++ b/projects/schematics/src/shared/lib-configs/integration-libs/index.ts @@ -14,3 +14,4 @@ export * from './segment-refs-schematics-config'; export * from './opps-schematics-config'; export * from './cpq-quote-schematics-config'; export * from './s4-service-schematics-config'; +export * from './omf-schematics-config'; diff --git a/projects/schematics/src/shared/lib-configs/integration-libs/omf-schematics-config.ts b/projects/schematics/src/shared/lib-configs/integration-libs/omf-schematics-config.ts new file mode 100644 index 00000000000..b508bd75cdb --- /dev/null +++ b/projects/schematics/src/shared/lib-configs/integration-libs/omf-schematics-config.ts @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + OMF_FEATURE_NAME, + ORDER_FEATURE_NAME, + SPARTACUS_OMF, + SPARTACUS_OMF_ORDER, + SPARTACUS_OMF_ROOT, +} from '../../libs-constants'; +import { SchematicConfig } from '../../utils/lib-utils'; +import { ORDER_MODULE } from '../order-schematics-config'; + +export const OMF_FOLDER_NAME = 'omf'; +export const OMF_MODULE_NAME = 'Omf'; +export const OMF_ROOT_MODULE = 'OmfRootModule'; +export const OMF_ORDER_MODULE = 'OmfOrderModule'; + +export const OMF_SCHEMATICS_CONFIG: SchematicConfig = { + library: { + featureName: OMF_FEATURE_NAME, + mainScope: SPARTACUS_OMF, + }, + folderName: OMF_FOLDER_NAME, + moduleName: OMF_MODULE_NAME, + featureModule: [ + { + name: OMF_ROOT_MODULE, + importPath: SPARTACUS_OMF, + }, + { + name: OMF_ORDER_MODULE, + importPath: SPARTACUS_OMF_ORDER, + }, + ], + rootModule: { + importPath: SPARTACUS_OMF_ROOT, + name: OMF_ROOT_MODULE, + content: `${OMF_ROOT_MODULE}`, + }, + dependencyFeatures: [ORDER_FEATURE_NAME], + importAfter: [ + { + markerModuleName: ORDER_MODULE, + featureModuleName: OMF_ORDER_MODULE, + }, + ], +}; diff --git a/projects/schematics/src/shared/libs-constants.ts b/projects/schematics/src/shared/libs-constants.ts index f9598305c0e..941aa32cfa4 100644 --- a/projects/schematics/src/shared/libs-constants.ts +++ b/projects/schematics/src/shared/libs-constants.ts @@ -223,6 +223,10 @@ export const SPARTACUS_S4OM = '@spartacus/s4om'; export const SPARTACUS_S4OM_ROOT = `@spartacus/s4om/root`; export const SPARTACUS_S4OM_ASSETS = `@spartacus/s4om/assets`; +export const SPARTACUS_OMF = '@spartacus/omf'; +export const SPARTACUS_OMF_ROOT = '@spartacus/omf/root'; +export const SPARTACUS_OMF_ORDER = '@spartacus/omf/order'; + export const SPARTACUS_OPPS = '@spartacus/opps'; export const SPARTACUS_OPPS_ROOT = '@spartacus/opps/root'; @@ -325,6 +329,8 @@ export const S4_SERVICE_FEATURE_NAME = 's4-service'; export const OPPS_FEATURE_NAME = 'OPPS'; +export const OMF_FEATURE_NAME = 'OMF'; + export const CUSTOMER_TICKETING_FEATURE_NAME = 'Customer-Ticketing'; /***** Feature name end *****/ diff --git a/projects/schematics/src/shared/schematics-config-mappings.ts b/projects/schematics/src/shared/schematics-config-mappings.ts index 030634f9045..702a3aef46a 100644 --- a/projects/schematics/src/shared/schematics-config-mappings.ts +++ b/projects/schematics/src/shared/schematics-config-mappings.ts @@ -14,6 +14,7 @@ import { QUOTE_SCHEMATICS_CONFIG, OPPS_SCHEMATICS_CONFIG, S4_SERVICE_SCHEMATICS_CONFIG, + OMF_SCHEMATICS_CONFIG, } from './lib-configs'; import { CART_BASE_SCHEMATICS_CONFIG, @@ -151,6 +152,8 @@ export const SCHEMATICS_CONFIGS: SchematicConfig[] = [ OPPS_SCHEMATICS_CONFIG, + OMF_SCHEMATICS_CONFIG, + S4OM_SCHEMATICS_CONFIG, S4_SERVICE_SCHEMATICS_CONFIG, diff --git a/projects/schematics/src/shared/utils/graph-utils_spec.ts b/projects/schematics/src/shared/utils/graph-utils_spec.ts index f69d38a4a53..ffe1b36e4e8 100644 --- a/projects/schematics/src/shared/utils/graph-utils_spec.ts +++ b/projects/schematics/src/shared/utils/graph-utils_spec.ts @@ -24,6 +24,7 @@ import { SPARTACUS_REQUESTED_DELIVERY_DATE, SPARTACUS_S4OM, SPARTACUS_S4_SERVICE, + SPARTACUS_OMF, SPARTACUS_SEGMENT_REFS, SPARTACUS_SMARTEDIT, SPARTACUS_STOREFINDER, @@ -148,6 +149,7 @@ describe('Graph utils', () => { SPARTACUS_S4OM, SPARTACUS_S4_SERVICE, SPARTACUS_OPPS, + SPARTACUS_OMF, SPARTACUS_EPD_VISUALIZATION, SPARTACUS_DIGITAL_PAYMENTS, SPARTACUS_CPQ_QUOTE, @@ -201,6 +203,7 @@ describe('Graph utils', () => { "Segment-Refs", "s4-service", "S4HANA-Order-Management", + "OMF", "OPPS", "EPD-Visualization", "Digital-Payments", diff --git a/projects/schematics/src/shared/utils/test-utils.ts b/projects/schematics/src/shared/utils/test-utils.ts index bcfe98caedd..525c8903440 100644 --- a/projects/schematics/src/shared/utils/test-utils.ts +++ b/projects/schematics/src/shared/utils/test-utils.ts @@ -92,6 +92,8 @@ export const trackingPersonalizationFeatureModulePath = 'src/app/spartacus/features/tracking/personalization-feature.module.ts'; export const trackingTagManagementFeatureModulePath = 'src/app/spartacus/features/tracking/tag-management-feature.module.ts'; +export const omfFeatureModulePath = + 'src/app/spartacus/features/omf/omf-feature.module.ts'; export const userFeatureModulePath = 'src/app/spartacus/features/user/user-feature.module.ts'; export const userAccountWrapperModulePath = diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v1-e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v1-e2e.cy.ts new file mode 100644 index 00000000000..cab0e861034 --- /dev/null +++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v1-e2e.cy.ts @@ -0,0 +1,83 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + ELECTRONICS_BASESITE, + ELECTRONICS_CURRENCY, + loginUser, + signOutUser, +} from '../../../helpers/checkout-flow'; +import { OmfConfig } from '@spartacus/core'; +import { + interceptOrdersEndpoint, + waitForResponse, +} from '../../../helpers/order-history'; +const omfTester = { + email: 'keenreviewer14@hybris.com', + password: 'Welcome@1', +}; + +const headerName = 'guid'; + +function systemConfig() { + Cypress.env('BASE_SITE', ELECTRONICS_BASESITE); + Cypress.env('BASE_CURRENCY', ELECTRONICS_CURRENCY); + cy.cxConfig({ + omf: { + guidHttpHeaderName: headerName, + }, + } as OmfConfig); +} +function intercepOrderDetailsHttpCalls(code: string, alias: string) { + cy.intercept( + 'GET', + `${Cypress.env('OCC_PREFIX')}/${Cypress.env( + 'BASE_SITE' + )}/users/current/orders/${code}?*` + ).as(alias); +} +function navigateToOrderHistoryV1() { + const ordersAlias = interceptOrdersEndpoint(); + cy.visit( + `${Cypress.env('BASE_SITE')}/${Cypress.env('BASE_LANG')}/${Cypress.env('BASE_CURRENCY')}/login` + ); + loginUser(omfTester); + cy.visit('/my-account/orders'); + waitForResponse(ordersAlias); +} +function navigateToOrderDetailsV1() { + cy.get('.cx-order-history-value') + .invoke('attr', 'href') + .then((href) => { + const orderMatch = href.match(/order\/([\w-]+)/); + const guidMatch = href.match(/guid=([\w-]+)/); + + const orderCode = orderMatch ? orderMatch[1] : null; + const orderGuid = guidMatch ? guidMatch[1] : null; + intercepOrderDetailsHttpCalls(orderCode, 'orderDetails'); + + cy.get('.cx-order-history-value').first().click(); + cy.wait('@orderDetails').then((xhr) => { + expect(xhr.request.headers).to.have.property(headerName, orderGuid); + }); + cy.get('cx-breadcrumb h1').should('contain', 'Order Details'); + cy.url().should((url) => { + const params = new URLSearchParams(url.split('?')[1]); + expect(params.has('guid')).to.be.true; + }); + }); +} + +describe('OMF - Navigate from Order History to Order Details Page', () => { + it('should load Order History and navigate to Order Details (MY_ACCOUT_V2 = false)', () => { + cy.restoreLocalStorage(); + Cypress.env('CX_MY_ACCOUNT_V2', false); + systemConfig(); + navigateToOrderHistoryV1(); + navigateToOrderDetailsV1(); + signOutUser(); + }); +}); diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v2-e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v2-e2e.cy.ts new file mode 100644 index 00000000000..3f039fb82ed --- /dev/null +++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v2-e2e.cy.ts @@ -0,0 +1,88 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + ELECTRONICS_BASESITE, + ELECTRONICS_CURRENCY, + loginUser, + signOutUser, +} from '../../../helpers/checkout-flow'; +import { + interceptOrdersEndpoint, + waitForResponse, +} from '../../../helpers/order-history'; +const omfTester = { + email: 'keenreviewer14@hybris.com', + password: 'Welcome@1', +}; +import { OmfConfig } from '@spartacus/core'; + +const headerName = 'guid'; + +function systemConfig() { + Cypress.env('BASE_SITE', ELECTRONICS_BASESITE); + Cypress.env('BASE_CURRENCY', ELECTRONICS_CURRENCY); + cy.cxConfig({ + omf: { + guidHttpHeaderName: headerName, + }, + } as OmfConfig); +} +const orderCode = '2200006056'; + +function intercepOrderDetailsHttpCalls(code: string, alias: string) { + cy.intercept( + 'GET', + `${Cypress.env('OCC_PREFIX')}/${Cypress.env( + 'BASE_SITE' + )}/users/current/orders/${code}?*` + ).as(alias); +} +function navigateToOrderDetailsV2() { + cy.contains('a', orderCode) + .invoke('attr', 'href') + .then((href) => { + const guidMatch = href.match(/guid=([\w-]+)/); + + const orderGuid = guidMatch ? guidMatch[1] : null; + intercepOrderDetailsHttpCalls(orderCode, 'orderDetails'); + + cy.contains('a', '2200006056').click(); + cy.wait('@orderDetails').then((xhr) => { + expect(xhr.request.headers).to.have.property(headerName, orderGuid); + }); + cy.get('cx-breadcrumb h1').should('contain', 'Order Details'); + cy.url().should((url) => { + const params = new URLSearchParams(url.split('?')[1]); + expect(params.has('guid')).to.be.true; + }); + }); +} + +function navigateToOrderHistoryV2() { + const ordersAlias = interceptOrdersEndpoint(); + intercepOrderDetailsHttpCalls(orderCode, 'orderHistoryV2'); + cy.visit( + `${Cypress.env('BASE_SITE')}/${Cypress.env('BASE_LANG')}/${Cypress.env('BASE_CURRENCY')}/login` + ); + loginUser(omfTester); + cy.visit('/my-account/orders'); + waitForResponse(ordersAlias); + cy.wait('@orderHistoryV2').then((xhr) => { + expect(xhr.request.headers).to.have.property(headerName); + }); +} + +describe('OMF - Navigate from Order History to Order Details Page', () => { + it('should load Order History and navigate to Order Details (MY_ACCOUT_V2 = true)', () => { + cy.restoreLocalStorage(); + Cypress.env('CX_MY_ACCOUNT_V2', true); + systemConfig(); + navigateToOrderHistoryV2(); + navigateToOrderDetailsV2(); + signOutUser(); + }); +}); diff --git a/projects/storefrontapp/src/app/spartacus/features/omf/omf-feature.module.ts b/projects/storefrontapp/src/app/spartacus/features/omf/omf-feature.module.ts new file mode 100644 index 00000000000..b76edce7ee0 --- /dev/null +++ b/projects/storefrontapp/src/app/spartacus/features/omf/omf-feature.module.ts @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2024 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { NgModule } from '@angular/core'; +import { OmfRootModule } from '@spartacus/omf/root'; + +@NgModule({ + imports: [OmfRootModule], +}) +export class OmfFeatureModule {} diff --git a/projects/storefrontapp/src/app/spartacus/features/order/order-wrapper.module.ts b/projects/storefrontapp/src/app/spartacus/features/order/order-wrapper.module.ts index 7b0a5b9953f..fb70b608eb0 100644 --- a/projects/storefrontapp/src/app/spartacus/features/order/order-wrapper.module.ts +++ b/projects/storefrontapp/src/app/spartacus/features/order/order-wrapper.module.ts @@ -8,11 +8,15 @@ import { NgModule, Type } from '@angular/core'; import { OrderModule } from '@spartacus/order'; import { environment } from '../../../../environments/environment'; import { S4ServiceOrderModule } from '@spartacus/s4-service/order'; +import { OmfOrderModule } from '@spartacus/omf/order'; const extensions: Type[] = []; if (environment.s4Service) { extensions.push(S4ServiceOrderModule); } +if (environment.omf) { + extensions.push(OmfOrderModule); +} @NgModule({ imports: [OrderModule, ...extensions], }) diff --git a/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts b/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts index d8bc10c7709..25c502e3799 100644 --- a/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts +++ b/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts @@ -103,6 +103,7 @@ import { SmartEditFeatureModule } from './features/smartedit/smartedit-feature.m import { StorefinderFeatureModule } from './features/storefinder/storefinder-feature.module'; import { TrackingFeatureModule } from './features/tracking/tracking-feature.module'; import { UserFeatureModule } from './features/user/user-feature.module'; +import { OmfFeatureModule } from './features/omf/omf-feature.module'; const featureModules = []; @@ -153,7 +154,9 @@ if (environment.requestedDeliveryDate) { if (environment.estimatedDeliveryDate) { featureModules.push(EstimatedDeliveryDateFeatureModule); } - +if (environment.omf) { + featureModules.push(OmfFeatureModule); +} if (environment.cpq) { featureModules.push(CpqQuoteFeatureModule); } diff --git a/projects/storefrontapp/src/environments/environment.prod.ts b/projects/storefrontapp/src/environments/environment.prod.ts index ca3f757651c..55d6ec33c5a 100644 --- a/projects/storefrontapp/src/environments/environment.prod.ts +++ b/projects/storefrontapp/src/environments/environment.prod.ts @@ -18,6 +18,7 @@ export const environment: Environment = { digitalPayments: buildProcess.env.CX_DIGITAL_PAYMENTS, epdVisualization: buildProcess.env.CX_EPD_VISUALIZATION, s4om: buildProcess.env.CX_S4OM, + omf: buildProcess.env.CX_OMF, segmentRefs: buildProcess.env.CX_SEGMENT_REFS, opps: buildProcess.env.CX_OPPS, requestedDeliveryDate: buildProcess.env.CX_REQUESTED_DELIVERY_DATE, diff --git a/projects/storefrontapp/src/environments/environment.ts b/projects/storefrontapp/src/environments/environment.ts index dada8d77550..b09532c3ede 100644 --- a/projects/storefrontapp/src/environments/environment.ts +++ b/projects/storefrontapp/src/environments/environment.ts @@ -31,6 +31,7 @@ export const environment: Environment = { digitalPayments: buildProcess.env.CX_DIGITAL_PAYMENTS ?? false, epdVisualization: buildProcess.env.CX_EPD_VISUALIZATION ?? false, s4om: buildProcess.env.CX_S4OM ?? false, + omf: buildProcess.env.CX_OMF ?? false, segmentRefs: buildProcess.env.CX_SEGMENT_REFS ?? false, opps: buildProcess.env.CX_OPPS ?? false, requestedDeliveryDate: buildProcess.env.CX_REQUESTED_DELIVERY_DATE ?? false, diff --git a/projects/storefrontapp/src/environments/models/build.process.env.d.ts b/projects/storefrontapp/src/environments/models/build.process.env.d.ts index f86ee9c9e34..57cee274138 100644 --- a/projects/storefrontapp/src/environments/models/build.process.env.d.ts +++ b/projects/storefrontapp/src/environments/models/build.process.env.d.ts @@ -20,6 +20,7 @@ interface Env { CX_DIGITAL_PAYMENTS: boolean; CX_EPD_VISUALIZATION: boolean; CX_S4OM: boolean; + CX_OMF: boolean; CX_SEGMENT_REFS: boolean; CX_OPPS: boolean; CX_REQUESTED_DELIVERY_DATE: boolean; diff --git a/projects/storefrontapp/src/environments/models/environment.model.ts b/projects/storefrontapp/src/environments/models/environment.model.ts index 4ca405f9a7d..e565b8fd7ef 100644 --- a/projects/storefrontapp/src/environments/models/environment.model.ts +++ b/projects/storefrontapp/src/environments/models/environment.model.ts @@ -16,6 +16,7 @@ export interface Environment { digitalPayments: boolean; epdVisualization: boolean; s4om: boolean; + omf: boolean; segmentRefs: boolean; opps: boolean; requestedDeliveryDate: boolean; diff --git a/projects/storefrontapp/tsconfig.app.prod.json b/projects/storefrontapp/tsconfig.app.prod.json index 335e967af7b..aa0c5d8f67b 100644 --- a/projects/storefrontapp/tsconfig.app.prod.json +++ b/projects/storefrontapp/tsconfig.app.prod.json @@ -373,6 +373,9 @@ ], "@spartacus/epd-visualization": ["dist/epd-visualization"], "@spartacus/epd-visualization/root": ["dist/epd-visualization/root"], + "@spartacus/omf": ["dist/omf"], + "@spartacus/omf/order": ["dist/omf/order"], + "@spartacus/omf/root": ["dist/omf/root"], "@spartacus/opps": ["dist/opps"], "@spartacus/opps/root": ["dist/opps/root"], "@spartacus/s4-service/assets": ["dist/s4-service/assets"], diff --git a/projects/storefrontapp/tsconfig.server.json b/projects/storefrontapp/tsconfig.server.json index f8fed2cea6d..1a50dd4d3a0 100644 --- a/projects/storefrontapp/tsconfig.server.json +++ b/projects/storefrontapp/tsconfig.server.json @@ -585,6 +585,9 @@ "@spartacus/epd-visualization/root": [ "../../integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": ["../../integration-libs/omf/public_api"], + "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"], + "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"], "@spartacus/opps": ["../../integration-libs/opps/public_api"], "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"], "@spartacus/s4-service/assets": [ diff --git a/projects/storefrontapp/tsconfig.server.prod.json b/projects/storefrontapp/tsconfig.server.prod.json index 3c5a3db38a6..8757a7ff450 100644 --- a/projects/storefrontapp/tsconfig.server.prod.json +++ b/projects/storefrontapp/tsconfig.server.prod.json @@ -430,6 +430,9 @@ "@spartacus/epd-visualization/root": [ "../../dist/epd-visualization/root" ], + "@spartacus/omf": ["../../dist/omf"], + "@spartacus/omf/order": ["../../dist/omf/order"], + "@spartacus/omf/root": ["../../dist/omf/root"], "@spartacus/opps": ["../../dist/opps"], "@spartacus/opps/root": ["../../dist/opps/root"], "@spartacus/s4-service/assets": ["../../dist/s4-service/assets"], diff --git a/tsconfig.compodoc.json b/tsconfig.compodoc.json index 7dba3b28271..d24ababccfd 100644 --- a/tsconfig.compodoc.json +++ b/tsconfig.compodoc.json @@ -668,6 +668,15 @@ "@spartacus/epd-visualization/root": [ "integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": [ + "integration-libs/omf/public_api" + ], + "@spartacus/omf/order": [ + "integration-libs/omf/order/public_api" + ], + "@spartacus/omf/root": [ + "integration-libs/omf/root/public_api" + ], "@spartacus/opps": [ "integration-libs/opps/public_api" ], @@ -734,4 +743,4 @@ "./projects/storefrontstyles/**/*.*", "./projects/vendor/**/*.*" ] -} +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 1a6bd4fd094..30d9276801f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -672,6 +672,15 @@ "@spartacus/epd-visualization/root": [ "integration-libs/epd-visualization/root/public_api" ], + "@spartacus/omf": [ + "integration-libs/omf/public_api" + ], + "@spartacus/omf/order": [ + "integration-libs/omf/order/public_api" + ], + "@spartacus/omf/root": [ + "integration-libs/omf/root/public_api" + ], "@spartacus/opps": [ "integration-libs/opps/public_api" ], @@ -745,4 +754,4 @@ "strictTemplates": true, "strictInputAccessModifiers": true } -} +} \ No newline at end of file