Skip to content
This repository has been archived by the owner on Feb 12, 2022. It is now read-only.

Commit

Permalink
Integration (#206)
Browse files Browse the repository at this point in the history
* Update the link on homepage (#111)

* New: sampleApp - Document Product Search Result and Home components (W-7156928)

* bug: fix ux (W-7208631)

* bug: fix ux (W-7208228)

* Don't send private values to the browser via apiconfig.js

* Fix the prod build to work on first run

The sass styles need to be compiled first, otherwise LWC won't pickup
the output CSS and add them to the final bundle.

* Remove data-sources functionality

* Initial PoC for @sfcc-core/core

* Fix license

Signed-off-by: Bret Little <[email protected]>

* Logger implementation

* Add tests to logger

* Migrate the remainder of core to typescript

* Add typescript configuration files to version control

* Cleanup types (remove some any's)

* add component extension readme (#120)

* Paul's edits to Zi's componentExtension.md file.

* minor updates (#123)

* Cleanup

* Switch to interfaces

* new: Search - Keyword Search Encoding for Security Best Practices (W-6984514)

* new: Search - Keyword Search Encoding for Security Best Practices (W-6984514) (#126)

* Breaking: replace product detial wire adaptor with lwc-apollo-client

* Update: sampleApp - Update to SDK 1.3.0-alpha.8. Update PDP and product search to use new authentication and product search refinement (W-7241436)

* Bug: Fixed issue on PDP where strike through price appears when there is no sale price (W-7162332)

* chore: get product search sorting rules from BFF (W-7034305)

* edit: acknowledged Ozzy's comments (W-7034305)

* Adding Cart Services & Authentication (#135)

New: Session Management & Cart Authentication

* edit: acknowledged Zi's comment on keyword-search-encoding

* edit: acknowledged Zi's comment on keyword-search-encoding

* removing conflicts after rebase

edit: acknowledged Ozzy's comments (W-7034305)

edit: acknowledged Zi's comment on keyword-search-encoding

edit: acknowledged Zi's comment on keyword-search-encoding

* edit: resolved merge conflicts, acknowledged Zi's keyword encoding comment

* edit: reorder import graphqlPassport

* edit: yarn.lock upgrade

* edit: cartResolvers.js empty object linting issue

* edit: productDetailsResolvers.js empty object linting issue

* fix: cart.js, productDetail.js linting issue

* edit: acknowledged Evan's comment on router.js

* Bug: Fix the TypeScript definitions inside core (#141)

* Fix running the app on windows by adding cross-env

Fixes #127

* New: update Cart UX initial commit (#142)

* New: Rename cart functionality to basket and move to TypeScript

* Propogate error from authenticate middleware

* Fix fix building on windows (#147)

Co-authored-by: Gurpreet Saini <[email protected]>

* Chore: fix linting problems throughout the typescript source (#149)

* Fix cross env to be a main dependency (#154)

Cannot be a dev dependency because it is used in the main startup

* new: search no result page clean up (W-7246249)

* new: search no result page clean-up

* new: search no result page should be cleaned up (W-7246249)

* edit: acknowledged Bret's comments on PR

* edit: empty div rendered when loading products

* New(storefront-lwc): add bundle analysis to the deployment (#155)

* edit: text changes addressing Paul's feedback

* Update(@sfcc-bff) commerce-sdk to v1.3.0-alpha.9 (#157)

* Fix the build by removing deploy to heroku

Heroku already is hooked into the git repo and will deploy independent
of circle ci

* Chore: adding a list of library components to README

* update readme (#148)

* Fix(storefront-lwc) remove innerHTML in favor of imperative dom creation (#160)

This should resolve some of the XSS concerns

* New: Show empty cart view (W-7114838)

* Bug: Fixed hyberlink on need help message.

* New: Remove Product from Basket (#163)

New: Remove Product from Basket

* Update: Handle cross site scripting (W-7262039)

* Chore: Performance Improvement for getBasket (#166)

* NEW: Search Results to use new apollo-client

* CHORE: linting pdp gql query file

* New: Show Product Quantity on Header Cart (#171)

New: Show Product Quantity on Header Cart

* Chore: Add lint step to CircleCI config and fix lint error

* Lots of cleanup (#172)

* Update(storefront-lwc): remove lwc-services and use rollup directly

* Chore remove mjs in favor of using esm

Bug(@sfcc-bff/productapi): the default image property was defined properly

Fix tests

Fix lint issue on an unused expression

Add linting to circle ci steps

* Fix sass build and change documentation for api.js and port 3000

* Fix dev build

* Paul's edits to README.md file.

* Fix lint

* Update rollup config

* Remove lwce/router from this PR

Co-authored-by: Paul DiSabito <[email protected]>
Co-authored-by: Gurpreet Saini <[email protected]>

* New:Basket product line item Card(W-7114827) (#170)

New:Basket product line item Card(W-7114827)

* minor css updates for Basket

* more css cleanup

* use bootstrap classes

* New: Coupon add and remove functionality on cart page (W-7114978)

* reset auth token on request if it has expired
    - remove basketid from session on product search/detail

* Disable cors unless defined by an environment variable

* Add documenation

* Update: the error handling in basketapi, productapi, and on the client (W-7361704) (#191)

* Update: Fixed some UX styling for Promo code and Order totals

* Blittle add lwce router (#178)

* Update(storefront-lwc): move to @lwce/router single-page-app routing

* Fix(storefront-lwc): show the query in the searchbar header

* Update: change the cookie to have a strict same-site policy (#195)

* New: session management documentation

* Paul's edits to sessionManagement.md.

* Bug(storefront-lwc): Fix PDP carousel back and forward buttons (W-7361322)

* Fix(storefront-lwc): build fixes (#198)

1. Fix lwc to output proper sourcemaps
2. Add live reload
3. Fix express-session warnings

* New: add header component (W-7360766)

* New: Replace Cart Sevice with LWC Apollo Client

* Basket readme (#194)

* Update(storefront-lwc): add tests for the product detail page (#203)

* New: Error Handling (#197)

New: Error Handling

* chore(release): publish v1.0.0-alpha.2 @skip-ci@

* Fix integration (#207)

* Integration (#119)

* Update the link on homepage (#111)

* New: sampleApp - Document Product Search Result and Home components (W-7156928)

* bug: fix ux (W-7208631)

* bug: fix ux (W-7208228)

* Don't send private values to the browser via apiconfig.js

* Fix the prod build to work on first run

The sass styles need to be compiled first, otherwise LWC won't pickup
the output CSS and add them to the final bundle.

* Remove data-sources functionality

Co-authored-by: Zi Sardone <[email protected]>
Co-authored-by: anndiep-sfcc <[email protected]>
Co-authored-by: Abhinav Kapoor <[email protected]>
Co-authored-by: echessman <[email protected]>

* New: Adding a PR checklist to the master branch

Co-authored-by: echessman <[email protected]>
Co-authored-by: Zi Sardone <[email protected]>
Co-authored-by: anndiep-sfcc <[email protected]>
Co-authored-by: Abhinav Kapoor <[email protected]>
Co-authored-by: Syed Shehroz Hussain (Ozzy) <[email protected]>

Co-authored-by: Zi Sardone <[email protected]>
Co-authored-by: Abhinav Kapoor <[email protected]>
Co-authored-by: echessman <[email protected]>
Co-authored-by: Bret Little <[email protected]>
Co-authored-by: Bret Little <[email protected]>
Co-authored-by: Paul DiSabito <[email protected]>
Co-authored-by: Jason Cooper <[email protected]>
Co-authored-by: Evan Chessman <[email protected]>
Co-authored-by: Gurpreet Saini <[email protected]>
Co-authored-by: Alex Clark <[email protected]>
Co-authored-by: Alex Clark <[email protected]>
Co-authored-by: Syed Shehroz Hussain (Ozzy) <[email protected]>
  • Loading branch information
13 people authored Apr 20, 2020
1 parent ba1204f commit 96fcda3
Show file tree
Hide file tree
Showing 749 changed files with 8,258 additions and 6,359 deletions.
9 changes: 6 additions & 3 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
orbs:
node: circleci/[email protected]

jobs:
build:
working_directory: ~/build_only
Expand All @@ -7,10 +10,10 @@ jobs:
steps:
- checkout
- run: yarn install
- run: yarn lint
- run: yarn build
- run: yarn test
- run: yarn clean:stats
- store_test_results:
path: ~/
orbs:
node: circleci/[email protected]
version: 2.1
version: 2.1
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ coverage
*.iml
jest-report
yarn-error.log
tsconfig.json
.idea

**/package-lock.json
Expand Down
29 changes: 20 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,20 @@ To set up the sample application:
2. Change into the `sfcc-sample-apps` folder:
`cd sfcc-sample-apps`

3. Copy the `api.example.mjs` file located at `/packages/storefront-lwc/scripts/`, save it as `api.mjs`, and make sure `api.mjs` is added to your `.gitignore` file.
3. Copy the `api.example.js` file located at `/packages/storefront-lwc/app/`, save it as `api.js`, and make sure `api.js` is added to your `.gitignore` file.

4. In the `api.mjs` file, provide values for the following variables (you can obtain these values from your Account Executive (AE) or Customer Support Manager (CSM)):
4. In the `api.js` file, provide values for the following variables (you can obtain these values from your Account Executive (AE) or Customer Support Manager (CSM)):
<table>
<tr><th>Variable</th><th>Description</th></tr>
<tr><td><code>COMMERCE_CLIENT_API_SITE_ID</code></td><td>A unique site ID (for example, RefArch or SiteGenesis).</td></tr>
<tr><td><code>COMMERCE_CLIENT_CLIENT_ID</code></td><td>A unique ID used exclusively for API access. See <a href="https://documentation.b2c.commercecloud.salesforce.com/DOC1/topic/com.demandware.dochelp/AccountManager/AccountManagerAddAPIClientID.html">Add a Client API</a> for more information.</td></tr>
<tr><td><code>COMMERCE_CLIENT_REALM_ID</code></td><td>A unique four-character ID (for example, bblx).</td></tr>
<tr><td><code>COMMERCE_CLIENT_INSTANCE_ID</code></td><td>Instance ID within a realm (for example, 015).</td></tr>
<tr><td><code>COMMERCE_CLIENT_SHORT_CODE</code></td><td>Region-specific merchant identifier (for example, staging-001).</td></tr>
<tr><td><code>COMMERCE_CLIENT_API_SITE_ID</code></td><td>Unique site ID (for example, RefArch or SiteGenesis).</td></tr>
<tr><td><code>COMMERCE_CLIENT_CLIENT_ID</code></td><td>Unique ID used exclusively for API access. See <a href="https://documentation.b2c.commercecloud.salesforce.com/DOC1/topic/com.demandware.dochelp/AccountManager/AccountManagerAddAPIClientID.html">Add a Client API</a> for more information.</td></tr>
<tr><td><code>COMMERCE_CLIENT_REALM_ID</code></td><td>Unique four-character realm ID (for example, bblx).</td></tr>
<tr><td><code>COMMERCE_CLIENT_INSTANCE_ID</code></td><td>Unique instance ID within a realm (for example, 015).</td></tr>
<tr><td><code>COMMERCE_CLIENT_SHORT_CODE</code></td><td>Unique region-specific merchant ID (for example, staging-001).</td></tr>
<tr><td><code>COMMERCE_SESSION_SECRET</code></td><td>Unique ID for session management (for example, thisisasecretkey).</td></tr>
<tr><td><code>COMMERCE_CORS</code></td><td>Optionally enable <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS">CORS</a> for GraphQL on the defined domains (for example, enable all domains with "\*").</td></tr>
</table>
Note: If the COMMERCE_SESSION_SECRET key is not unique per customer application, session information can be unintentionally shared between ecommerce sites.

5. Install dependencies:
`yarn`
Expand All @@ -45,7 +48,7 @@ To set up the sample application:
`yarn start:dev` (development mode) or
`yarn start` (production mode)

8. To access the sample application in development mode, open the browser to http://localhost:3000 (for production mode, open to http://localhost:3002).
8. To access the application, open the browser to http://localhost:3000

You can optionally test the sample application:
`yarn test`
Expand All @@ -55,7 +58,7 @@ You can optionally test the sample application:
We recommend Visual Studio Code inbuilt debugger to troubleshoot the code. The `.vscode` launch configuration is included in the repo. To debug using VSCode, see [VS Code Debugging](https://code.visualstudio.com/docs/editor/debugging).

## Configuration
* You can change the logging levels by modifying the `COMMERCE_LOG_LEVEL` property in `api.mjs`. The supported log levels are:
* You can change the logging levels by modifying the `COMMERCE_LOG_LEVEL` property in `api.js`. The supported log levels are:
* `TRACE`
* `DEBUG`
* `INFO`
Expand All @@ -74,6 +77,14 @@ We recommend Visual Studio Code inbuilt debugger to troubleshoot the code. The `
* [Jest](https://jestjs.io/docs/en/getting-started)
* [Visual Studio Code](https://code.visualstudio.com/docs)

## Library of Components
The sample app currently includes the following components:
* [Home Page](https://github.com/SalesforceCommerceCloud/sfcc-sample-apps/tree/master/packages/storefront-lwc/src/modules/commerce/home)
* [Product Detail](https://github.com/SalesforceCommerceCloud/sfcc-sample-apps/tree/master/packages/storefront-lwc/src/modules/commerce/productDetail)
* [Product Search Results](https://github.com/SalesforceCommerceCloud/sfcc-sample-apps/tree/master/packages/storefront-lwc/src/modules/commerce/productSearchResults)
* [Basket](https://github.com/SalesforceCommerceCloud/sfcc-sample-apps/tree/integration/packages/storefront-lwc/src/modules/commerce/basket)


## Contributing

* See [Contributing](CONTRIBUTING.md)
Expand Down
Binary file added docs/SessionManagement.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 7 additions & 3 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,12 @@ Data source implementation for the Salesforce Commerce API. It includes the Grap
#### storefront-lwc
Front-end application, built with [lwc-services](https://www.npmjs.com/package/lwc-services).

## Session Management

To learn about session management in the sample app please see [session management](sessionManagement.md)

## Customizing and Extending
When customizing or extending the sample app, do not modify the packages within `@sfcc-bff` and `@sfcc-core`. These packages will be published and consumed via NPM. Instead, create a new custom package within the monorepo that registers itself with `@sfcc-core` and provides access to data from a third-party service.
When customizing or extending the sample app, do not modify the packages within `@sfcc-bff` and `@sfcc-core`. These packages will be published and consumed via NPM. Instead, create a new custom package within the monorepo that registers itself with `@sfcc-core` and provides access to data from a third-party service. For more information, see [Component Extension](docs/componentExtension.md).

![Sample App Project Layout](project-layout.png)

Expand All @@ -40,7 +44,7 @@ The core-graphql module within `@sfcc-core` is responsible for getting all the r
## What's Not Included?
This is a sample application, and is not intended to be a full reference architecture. There are multiple components missing, some of which will be added in the future. Specifically, the app does not currently include:

1. **Authentication** - Required for a fully functional cart and checkout experience.
1. **Authentication** - Required for a fully functional basket and checkout experience.
2. **CMS Integration** - Required to customize the storefront experience per user.
3. **Server-side Rendering** - Required for product listing search engine optimization.
4. **Component Portability** - Work needs to be done to re-use components outside of the sample app context.
4. **Component Portability** - Work needs to be done to re-use components outside of the sample app context.
Binary file added docs/authenticationFlow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
86 changes: 86 additions & 0 deletions docs/componentExtension.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
## Customizing and Extending Components

As mentioned in the [architecture document](architecture.md), when customizing or extending the sample app component, you should not modify the packages within `@sfcc-bff` and `@sfcc-core`. These packages will be published and consumed via `npm`. Instead, create a new custom package either within the monorepo or a new module that registers itself with `@sfcc-core\core` and provides access to data from a third-party service. Then we will need to extend the data model and extend the query for the client component.


This example below shows how to create a product recommendations extension for the product details component:

Background: The Product Details Page shows the product name, product id, color swatches, images, price, and so on. Our goal is to extend this component to also show the product's recommendations.

1. In the storefront-lwc `app` directory, create a new extension called `productDetailExtension.js`

2. In the `productDetailExtension.js` file, register the extension with core using the `API_EXTENSIONS_KEY` key. Extensions can have multiple entries per extension key, so we can simply register a new extension with the existing key:

```
core.registerExtension(API_EXTENSIONS_KEY, function (config) {
return new ProductDetailExtensions();
});
```

3. To Extend the data model, define the Recommendation type and use it to extend the Product type:

```
const productRecommendationTypeDef = gql`
type Recommendation {
productId: String
productName: String
image: Image
}
extend type Product {
recommendations: [Recommendation]
}
`;
```

4. Resolve the recommendations for a Product
```
const productRecommendationResolver = (config) => {
return {
Product: {
recommendations: async (product) => {
if (product.recommendations) {
return Promise.all(product.recommendations.map( async recommendation => {
const apiProduct = await getClientProduct(config, recommendation.recommendedItemId);
return {productId: apiProduct.id, productName:apiProduct.name, image: new Image(apiProduct.imageGroups[2].images[0])};
})
)
}
}
}
}
}
```

5. Add the product recommendation extension to the Backend For Frontend (BFF) by importing the extension created in step 1 to the `sample-app.js` file.
```
import './extension/productDetailExtension';
```

6. To Extend the query for client component, In the `productdetailadapator.js` file, specify the query for product recommendations.
```
recommendations {
productId
productName
image {
title
link
alt
}
}
```

7. In the `productdetail.html` file, consume the recommendations data (if any) returned from the BFF.
```
<!-- Product Recommendations -->
<template if:true={product.recommendations}>
<div class="recommendation">
<template for:each={product.recommendations} for:item="recommendation">
<div class='col-6 col-sm-4 grid-gutter' key={recommendation.productId} >
<div class='product' >
<commerce-product-tile product={recommendation}></commerce-product-tile>
</div>
</div>
</template>
</div>
</template>
```
88 changes: 88 additions & 0 deletions docs/sessionManagement.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Session Management

When the client loads the Sample App, the Sample App is initialized with the express authentication middleware, [passportjs](http://www.passportjs.org/). After initialization, `passport.session` is invoked to generate a session. A cookie is also generated (using [express-session](https://www.npmjs.com/package/express-session) to represent the session.

The Sample App uses `GraphQLLocalStrategy` from the [graphql-passport](https://www.npmjs.com/package/graphql-passport) package for its authentication strategy.

Authentication enables end users to perform actions like creating a basket.

After successful authentication, the anonymous user ID is stored in the session corresponding to the generated cookie.


## Session Management and Authentication Flow

![session management and authentication flow](SessionManagement.png)

The Sample App uses the `express-session` module to generate a unique cookie that represents the session. The default cookie used for the session ID is `connect.sid`. When the cookie expires, the module automatically creates a new one.

Passport middleware provides functions to serialize and deserialize a user to and from the session. As stated in the [architecture document](architecture.md), the front-end client communicates with the BFF via GraphQL. In the Sample App, every query using GraphQL uses the `/api` route. GraphQL separates queries based on resolvers in Sample App.

An authentication request is needed to get an access token that allows the Sample App to perform certain actions, such as creating a basket or adding products to a basket. The Sample App uses the package `graphql-passport` to provide the functionality to authenticate with passport.

![authentication flow](authenticationFlow.png)

GraphQL provides a `context` object which is the third parameter passed to any resolver. The `context` object is generated per request and can store data used by the resolver. The Sample App populates this `context` object in the `[graphql.ts](../packages/@sfcc-core/core-graphql/src/graphql.ts)` file (which is in the `core-graphql` package). The `context` function defined in `graphql.ts` takes two parameters, request (req) and response (res).

```typescript
this.apolloServer = new ApolloServer({
schema,
context: ({ req, res }) => ({
...graphqlPassport.buildContext({ req, res }),
setSessionProperty(key: string, value: string) {
(req as Request).session[key] = value;
},
getSessionProperty(key: string) {
return (req as Request).session[key];
},
}),
});
```

The request parameter is the same request object that express generates and is the actual web service call that contains the request headers, cookies, and so on. In the context function, the helper function `buildContext()` (which is provided by graphql-passport) helps build a context that is unique for each user, adding methods to the context to help authenticate using passport. After the `context` object is built, a resolver can ensure that the user is authenticated.

The resolvers in Sample App need to retrieve the user from the context. To help with this operation, Sample App defines a function `getUserFromContext()`. This function calls the `context.authenticate()` function provided by graphql-passport.

```typescript
export async function getUserFromContext(context: AppContext) {
let user = context.getUser();
const token = user ? user.token : '';
if (!token) {
const res = await context.authenticate('graphql-local', { token });
context.login(res.user);
user = res.user;
}
return user;
}
```

The `context.authenticate` function calls the graphql-passport strategy configured in [runtime.js](../packages/storefront-lwc/scripts/runtime.js). This is the central location to perform the authentication logic.

```typescript
passport.use(
new graphqlPassport.GraphQLLocalStrategy(function(user, pass, done) {
const clientConfig = getCommerceClientConfig(config);
CommerceSdk.helpers
.getShopperToken(clientConfig, { type: 'guest' })
.then(token => {
const customerId = JSON.parse(token.decodedToken.sub)
.customer_info.customer_id;
done(null, {
id: customerId,
token: token.getBearerHeader(),
});
})
.catch(error => done(error));
}),
);
```

In Sample App’s authentication configuration, the shopper token is retrieved from the Commerce SDK. From this token, the anonymous user customer ID is determined. If authentication is successful, a user is returned containing the id and the bearer token. Following successful authentication, the `getUserFromContext()` function calls `context.login()` -- which invokes `passport.serializeUser`:

```typescript
passport.serializeUser(function(user, done) {
users.set(user.id, user);
done(null, user.id);
});
```

The above function is used to serialize the user to the in-memory `users` object for the session.
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"lerna": "2.11.0",
"exact": true,
"version": "0.18.23",
"version": "1.0.0-alpha.2",
"npmClient": "yarn",
"command": {
"init": {
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"lint": "lerna run lint --stream",
"lint:fix": "lerna run lint:fix --stream",
"clean": "lerna run clean --stream",
"clean:stats": "lerna run clean:stats --stream",
"test": "lerna run test:unit --stream",
"test:watch": "lerna run test:unit:watch --stream",
"start": "yarn start:lwc",
Expand Down Expand Up @@ -66,6 +67,6 @@
}
},
"lint-staged": {
"*.{js}": "prettier --write"
"*.{js,ts,mjs}": "prettier --write"
}
}
12 changes: 12 additions & 0 deletions packages/@sfcc-bff/basketapi/.babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
]
]
}
9 changes: 9 additions & 0 deletions packages/@sfcc-bff/basketapi/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# `@sfcc-bff/basketapi`
The GraphQL type definitions and resolvers for the Basket API.

## Usage
Just by importing the package, the `basketapi` will register itself with the @sfcc-core/core-graphql

```js
import '@sfcc-bff/basketapi';
```
43 changes: 43 additions & 0 deletions packages/@sfcc-bff/basketapi/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"license": "BSD-3-Clause",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"files": [
"dist"
],
"scripts": {
"start:dev": "tsdx watch",
"build": "tsdx build",
"test:unit": "tsdx test --collect-coverage",
"lint": "tsdx lint",
"prepare": "tsdx build",
"pub": "npm build; npm pack; npm publish -f",
"pack": "npm pack"
},
"dependencies": {
"@sfcc-bff/productapi": "1.0.0-alpha.2",
"@sfcc-core/core": "1.0.0-alpha.2"
},
"husky": {
"hooks": {
"pre-commit": "tsdx lint"
}
},
"name": "@sfcc-bff/basketapi",
"version": "1.0.0-alpha.2",
"description": "sfcc backend for frontend api service",
"module": "dist/basketapi.esm.js",
"exports": {
".": {
"require": "./dist/index.js",
"default": "./dist/basketapi.esm.js"
}
},
"devDependencies": {
"@types/jest": "^25.1.2",
"husky": "^4.2.3",
"tsdx": "^0.12.3",
"tslib": "^1.10.0",
"typescript": "^3.7.5"
}
}
Loading

0 comments on commit 96fcda3

Please sign in to comment.