Showing preview only (221K chars total). Download the full file or copy to clipboard to get everything.
Repository: thanhchungbtc/vue-shopping-clean-architecture
Branch: master
Commit: 5d6d49811f9c
Files: 76
Total size: 201.0 KB
Directory structure:
gitextract_4fmq2k0l/
├── .browserslistrc
├── .eslintrc.js
├── .gitignore
├── .travis.yml
├── README.md
├── babel.config.js
├── coverage/
│ ├── clover.xml
│ ├── coverage-final.json
│ ├── lcov-report/
│ │ ├── base.css
│ │ ├── block-navigation.js
│ │ ├── index.html
│ │ ├── prettify.css
│ │ ├── prettify.js
│ │ ├── sorter.js
│ │ └── src/
│ │ ├── app/
│ │ │ ├── components/
│ │ │ │ ├── Product.vue.html
│ │ │ │ ├── ProductList.vue.html
│ │ │ │ └── index.html
│ │ │ └── store/
│ │ │ ├── cart.ts.html
│ │ │ ├── index.html
│ │ │ ├── index.ts.html
│ │ │ └── product.ts.html
│ │ ├── data/
│ │ │ └── inMemoryRepository/
│ │ │ ├── cartRepository.ts.html
│ │ │ ├── index.html
│ │ │ └── productRepository.ts.html
│ │ ├── di.ts.html
│ │ ├── index.html
│ │ └── usecases/
│ │ └── interactor/
│ │ ├── addItemToCart.ts.html
│ │ ├── getAllProduct.ts.html
│ │ ├── getTotalCartItem.ts.html
│ │ └── index.html
│ └── lcov.info
├── cypress.json
├── jest.config.js
├── package.json
├── public/
│ ├── index.html
│ └── robots.txt
├── src/
│ ├── app/
│ │ ├── App.vue
│ │ ├── assets/
│ │ │ └── app.css
│ │ ├── components/
│ │ │ ├── CartPreview.vue
│ │ │ ├── NavBar.vue
│ │ │ ├── Product.vue
│ │ │ └── ProductList.vue
│ │ ├── main.ts
│ │ ├── plugins/
│ │ │ └── vuetify.ts
│ │ ├── registerServiceWorker.ts
│ │ ├── router/
│ │ │ └── index.ts
│ │ ├── shims-tsx.d.ts
│ │ ├── shims-vue.d.ts
│ │ ├── store/
│ │ │ ├── cart.ts
│ │ │ ├── index.ts
│ │ │ └── product.ts
│ │ └── views/
│ │ ├── About.vue
│ │ ├── Checkout.vue
│ │ └── Home.vue
│ ├── data/
│ │ └── inMemoryRepository/
│ │ ├── cartRepository.ts
│ │ └── productRepository.ts
│ ├── di.ts
│ ├── domain/
│ │ └── entity/
│ │ └── index.ts
│ ├── main.ts
│ └── usecases/
│ ├── interactor/
│ │ ├── addItemToCart.ts
│ │ ├── getAllProduct.ts
│ │ ├── getTotalCartItem.ts
│ │ └── proceedCheckout.ts
│ └── repository/
│ ├── cartRepository.ts
│ └── productRepository.ts
├── tests/
│ ├── e2e/
│ │ ├── .eslintrc.js
│ │ ├── plugins/
│ │ │ └── index.js
│ │ ├── specs/
│ │ │ └── test.js
│ │ └── support/
│ │ ├── commands.js
│ │ └── index.js
│ └── unit/
│ ├── components/
│ │ ├── Product.spec.ts
│ │ └── ProductList.spec.ts
│ └── store/
│ ├── cart.spec.ts
│ └── product.spec.ts
├── tsconfig.json
└── vue.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .browserslistrc
================================================
> 1%
last 2 versions
================================================
FILE: .eslintrc.js
================================================
module.exports = {
root: true,
env: {
node: true
},
'extends': [
'plugin:vue/essential',
'eslint:recommended',
'@vue/typescript/recommended'
],
parserOptions: {
ecmaVersion: 2020
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-empty-function': 'off',
},
overrides: [
{
files: [
'**/__tests__/*.{j,t}s?(x)',
'**/tests/unit/**/*.spec.{j,t}s?(x)'
],
env: {
mocha: true
}
}
]
}
================================================
FILE: .gitignore
================================================
.DS_Store
node_modules
/dist
/tests/e2e/videos/
/tests/e2e/screenshots/
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
- 12
install: yarn
script:
- yarn build
- yarn test:unit
================================================
FILE: README.md
================================================
# Clean Architecture VueJS
Clean architecture with vue, shopping cart demo
[Demo](https://thanhchungbtc.github.io/vue-shopping)



## Development
```sh
yarn serve
```
## Production
```sh
yarn build
```
## Unit test
```sh
yarn test:unit
```
## Description
This is an example of implementation of Clean Architecture in Vue
It has major of 4 layers:
- Entity layer
- Repository layer
- Usecase layer
- Application layer - where the ui happend

## Tools used
- `inversify`\
Dependency injection for typescript
```ts
container
.bind<CartRepository>("CartRepository")
.to(CartRepositoryImpl)
.inSingletonScope();
```
Usage
```ts
constructor(
@inject("CartRepository") private cartRepository: CartRepository
) {}
```
- `vuetify`\
Material design ui library
- `vuex-module-decorators`\
Access `vuex` store in a type-safety way
Instead of writing as
```ts
this.$store.dispatch('cart/addProductToCart', {product: this.product, quantity: 1})
```
We write
```ts
const cartStore = getModule(CartStore, this.$store)
cartStore.addProductToCart({product: this.product, quantity: 1})
```
## TODO
- [x] In memory repository
- [ ] Use pouchDB to persist user's cart data
================================================
FILE: babel.config.js
================================================
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}
================================================
FILE: coverage/clover.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1582785406033" clover="3.2.0">
<project timestamp="1582785406034" name="All files">
<metrics statements="99" coveredstatements="72" conditionals="2" coveredconditionals="2" methods="31" coveredmethods="11" elements="132" coveredelements="85" complexity="0" loc="99" ncloc="99" packages="5" files="11" classes="11"/>
<package name="src">
<metrics statements="15" coveredstatements="15" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
<file name="di.ts" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\di.ts">
<metrics statements="15" coveredstatements="15" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
<line num="1" count="4" type="stmt"/>
<line num="2" count="4" type="stmt"/>
<line num="3" count="4" type="stmt"/>
<line num="6" count="4" type="stmt"/>
<line num="7" count="4" type="stmt"/>
<line num="8" count="4" type="stmt"/>
<line num="9" count="4" type="stmt"/>
<line num="10" count="4" type="stmt"/>
<line num="12" count="4" type="stmt"/>
<line num="14" count="4" type="stmt"/>
<line num="18" count="4" type="stmt"/>
<line num="23" count="4" type="stmt"/>
<line num="27" count="4" type="stmt"/>
<line num="31" count="4" type="stmt"/>
<line num="36" count="4" type="stmt"/>
</file>
</package>
<package name="src.app.components">
<metrics statements="13" coveredstatements="10" conditionals="0" coveredconditionals="0" methods="6" coveredmethods="4"/>
<file name="Product.vue" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\components\Product.vue">
<metrics statements="6" coveredstatements="3" conditionals="0" coveredconditionals="0" methods="3" coveredmethods="1"/>
<line num="19" count="2" type="stmt"/>
<line num="20" count="2" type="stmt"/>
<line num="30" count="3" type="stmt"/>
<line num="37" count="0" type="stmt"/>
<line num="38" count="0" type="stmt"/>
<line num="40" count="0" type="stmt"/>
</file>
<file name="ProductList.vue" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\components\ProductList.vue">
<metrics statements="7" coveredstatements="7" conditionals="0" coveredconditionals="0" methods="3" coveredmethods="3"/>
<line num="11" count="1" type="stmt"/>
<line num="12" count="1" type="stmt"/>
<line num="13" count="1" type="stmt"/>
<line num="14" count="1" type="stmt"/>
<line num="24" count="1" type="stmt"/>
<line num="28" count="1" type="stmt"/>
<line num="33" count="1" type="stmt"/>
</file>
</package>
<package name="src.app.store">
<metrics statements="36" coveredstatements="33" conditionals="2" coveredconditionals="2" methods="11" coveredmethods="7"/>
<file name="cart.ts" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\store\cart.ts">
<metrics statements="16" coveredstatements="13" conditionals="2" coveredconditionals="2" methods="8" coveredmethods="4"/>
<line num="1" count="3" type="stmt"/>
<line num="2" count="3" type="stmt"/>
<line num="19" count="3" type="stmt"/>
<line num="20" count="3" type="stmt"/>
<line num="21" count="3" type="stmt"/>
<line num="24" count="0" type="stmt"/>
<line num="28" count="0" type="stmt"/>
<line num="29" count="0" type="stmt"/>
<line num="35" count="3" type="stmt"/>
<line num="36" count="4" type="stmt"/>
<line num="37" count="4" type="cond" truecount="2" falsecount="0"/>
<line num="38" count="1" type="stmt"/>
<line num="40" count="3" type="stmt"/>
<line num="45" count="3" type="stmt"/>
<line num="46" count="4" type="stmt"/>
<line num="47" count="4" type="stmt"/>
</file>
<file name="index.ts" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\store\index.ts">
<metrics statements="10" coveredstatements="10" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
<line num="1" count="2" type="stmt"/>
<line num="2" count="2" type="stmt"/>
<line num="3" count="2" type="stmt"/>
<line num="4" count="2" type="stmt"/>
<line num="5" count="2" type="stmt"/>
<line num="7" count="2" type="stmt"/>
<line num="14" count="2" type="stmt"/>
<line num="21" count="2" type="stmt"/>
<line num="22" count="2" type="stmt"/>
<line num="24" count="2" type="stmt"/>
</file>
<file name="product.ts" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\store\product.ts">
<metrics statements="10" coveredstatements="10" conditionals="0" coveredconditionals="0" methods="3" coveredmethods="3"/>
<line num="1" count="3" type="stmt"/>
<line num="3" count="3" type="stmt"/>
<line num="15" count="3" type="stmt"/>
<line num="16" count="3" type="stmt"/>
<line num="18" count="3" type="stmt"/>
<line num="21" count="3" type="stmt"/>
<line num="22" count="4" type="stmt"/>
<line num="26" count="3" type="stmt"/>
<line num="27" count="2" type="stmt"/>
<line num="28" count="2" type="stmt"/>
</file>
</package>
<package name="src.data.inMemoryRepository">
<metrics statements="23" coveredstatements="8" conditionals="0" coveredconditionals="0" methods="8" coveredmethods="0"/>
<file name="cartRepository.ts" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\data\inMemoryRepository\cartRepository.ts">
<metrics statements="11" coveredstatements="4" conditionals="0" coveredconditionals="0" methods="5" coveredmethods="0"/>
<line num="1" count="4" type="stmt"/>
<line num="2" count="4" type="stmt"/>
<line num="3" count="4" type="stmt"/>
<line num="7" count="8" type="stmt"/>
<line num="8" count="0" type="stmt"/>
<line num="11" count="0" type="stmt"/>
<line num="12" count="0" type="stmt"/>
<line num="15" count="0" type="stmt"/>
<line num="21" count="0" type="stmt"/>
<line num="22" count="0" type="stmt"/>
<line num="24" count="0" type="stmt"/>
</file>
<file name="productRepository.ts" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\data\inMemoryRepository\productRepository.ts">
<metrics statements="12" coveredstatements="4" conditionals="0" coveredconditionals="0" methods="3" coveredmethods="0"/>
<line num="1" count="4" type="stmt"/>
<line num="3" count="4" type="stmt"/>
<line num="5" count="4" type="stmt"/>
<line num="8" count="8" type="stmt"/>
<line num="12" count="0" type="stmt"/>
<line num="23" count="0" type="stmt"/>
<line num="24" count="0" type="stmt"/>
<line num="25" count="0" type="stmt"/>
<line num="26" count="0" type="stmt"/>
<line num="34" count="0" type="stmt"/>
<line num="38" count="0" type="stmt"/>
<line num="39" count="0" type="stmt"/>
</file>
</package>
<package name="src.usecases.interactor">
<metrics statements="12" coveredstatements="6" conditionals="0" coveredconditionals="0" methods="6" coveredmethods="0"/>
<file name="addItemToCart.ts" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\usecases\interactor\addItemToCart.ts">
<metrics statements="4" coveredstatements="2" conditionals="0" coveredconditionals="0" methods="2" coveredmethods="0"/>
<line num="2" count="4" type="stmt"/>
<line num="11" count="4" type="stmt"/>
<line num="13" count="0" type="stmt"/>
<line num="18" count="0" type="stmt"/>
</file>
<file name="getAllProduct.ts" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\usecases\interactor\getAllProduct.ts">
<metrics statements="4" coveredstatements="2" conditionals="0" coveredconditionals="0" methods="2" coveredmethods="0"/>
<line num="3" count="4" type="stmt"/>
<line num="11" count="4" type="stmt"/>
<line num="13" count="0" type="stmt"/>
<line num="17" count="0" type="stmt"/>
</file>
<file name="getTotalCartItem.ts" path="C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\usecases\interactor\getTotalCartItem.ts">
<metrics statements="4" coveredstatements="2" conditionals="0" coveredconditionals="0" methods="2" coveredmethods="0"/>
<line num="2" count="4" type="stmt"/>
<line num="10" count="4" type="stmt"/>
<line num="12" count="0" type="stmt"/>
<line num="17" count="0" type="stmt"/>
</file>
</package>
</project>
</coverage>
================================================
FILE: coverage/coverage-final.json
================================================
{"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\di.ts": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\di.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"8":{"start":{"line":12,"column":18},"end":{"line":12,"column":22}},"9":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"10":{"start":{"line":18,"column":0},"end":{"line":18,"column":9}},"11":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"12":{"start":{"line":27,"column":0},"end":{"line":27,"column":9}},"13":{"start":{"line":31,"column":0},"end":{"line":31,"column":9}},"14":{"start":{"line":36,"column":21},"end":{"line":36,"column":35}}},"fnMap":{},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4},"f":{},"b":{}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\components\\Product.vue": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\components\\Product.vue","statementMap":{"0":{"start":{"line":19,"column":0},"end":{"line":19,"column":null}},"1":{"start":{"line":20,"column":0},"end":{"line":20,"column":null}},"2":{"start":{"line":30,"column":0},"end":{"line":30,"column":null}},"3":{"start":{"line":37,"column":0},"end":{"line":37,"column":null}},"4":{"start":{"line":38,"column":0},"end":{"line":41,"column":null}},"5":{"start":{"line":40,"column":0},"end":{"line":40,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":0},"end":{"line":29,"column":null}},"loc":{"start":{"line":29,"column":0},"end":{"line":33,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":36,"column":0},"end":{"line":36,"column":null}},"loc":{"start":{"line":36,"column":0},"end":{"line":42,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":38,"column":0},"end":{"line":38,"column":null}},"loc":{"start":{"line":38,"column":0},"end":{"line":41,"column":null}}}},"branchMap":{},"s":{"0":2,"1":2,"2":3,"3":0,"4":0,"5":0},"f":{"0":3,"1":0,"2":0},"b":{}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\components\\ProductList.vue": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\components\\ProductList.vue","statementMap":{"0":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"1":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"2":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"3":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}},"4":{"start":{"line":24,"column":0},"end":{"line":24,"column":null}},"5":{"start":{"line":28,"column":0},"end":{"line":28,"column":null}},"6":{"start":{"line":33,"column":0},"end":{"line":33,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":0},"end":{"line":23,"column":null}},"loc":{"start":{"line":23,"column":0},"end":{"line":25,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":27,"column":0},"end":{"line":27,"column":null}},"loc":{"start":{"line":27,"column":0},"end":{"line":29,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":32,"column":0},"end":{"line":32,"column":null}},"loc":{"start":{"line":32,"column":0},"end":{"line":36,"column":null}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{"0":1,"1":1,"2":1},"b":{}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\cart.ts": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\cart.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":19,"column":0},"end":{"line":19,"column":null}},"3":{"start":{"line":20,"column":9},"end":{"line":20,"column":25}},"4":{"start":{"line":24,"column":4},"end":{"line":24,"column":11}},"5":{"start":{"line":24,"column":44},"end":{"line":24,"column":65}},"6":{"start":{"line":28,"column":4},"end":{"line":28,"column":11}},"7":{"start":{"line":29,"column":21},"end":{"line":29,"column":null}},"8":{"start":{"line":36,"column":16},"end":{"line":36,"column":21}},"9":{"start":{"line":36,"column":42},"end":{"line":36,"column":null}},"10":{"start":{"line":37,"column":4},"end":{"line":41,"column":null}},"11":{"start":{"line":38,"column":6},"end":{"line":38,"column":11}},"12":{"start":{"line":40,"column":6},"end":{"line":40,"column":11}},"13":{"start":{"line":46,"column":4},"end":{"line":46,"column":10}},"14":{"start":{"line":47,"column":4},"end":{"line":47,"column":9}},"15":{"start":{"line":21,"column":31},"end":{"line":21,"column":69}},"16":{"start":{"line":35,"column":2},"end":{"line":35,"column":9}},"17":{"start":{"line":45,"column":2},"end":{"line":45,"column":8}},"18":{"start":{"line":19,"column":13},"end":{"line":19,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":19,"column":0},"end":{"line":19,"column":13}},"loc":{"start":{"line":19,"column":0},"end":{"line":52,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":2},"end":{"line":23,"column":6}},"loc":{"start":{"line":23,"column":19},"end":{"line":25,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":29},"end":{"line":24,"column":30}},"loc":{"start":{"line":24,"column":44},"end":{"line":24,"column":65}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":27,"column":2},"end":{"line":27,"column":6}},"loc":{"start":{"line":27,"column":17},"end":{"line":32,"column":null}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":29,"column":6},"end":{"line":29,"column":7}},"loc":{"start":{"line":29,"column":21},"end":{"line":29,"column":null}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":35,"column":2},"end":{"line":35,"column":9}},"loc":{"start":{"line":35,"column":20},"end":{"line":42,"column":null}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":36,"column":37},"end":{"line":36,"column":38}},"loc":{"start":{"line":36,"column":42},"end":{"line":36,"column":null}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":45,"column":2},"end":{"line":45,"column":8}},"loc":{"start":{"line":45,"column":71},"end":{"line":51,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":37,"column":4},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":41,"column":null}},{"start":{"line":37,"column":4},"end":{"line":41,"column":null}}]}},"s":{"0":3,"1":3,"2":3,"3":3,"4":0,"5":0,"6":0,"7":0,"8":4,"9":2,"10":4,"11":1,"12":3,"13":4,"14":4,"15":3,"16":3,"17":3,"18":3},"f":{"0":3,"1":0,"2":0,"3":0,"4":0,"5":4,"6":2,"7":4},"b":{"0":[1,3]}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\index.ts": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\index.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":4}},"6":{"start":{"line":14,"column":14},"end":{"line":14,"column":18}},"7":{"start":{"line":21,"column":21},"end":{"line":21,"column":31}},"8":{"start":{"line":22,"column":18},"end":{"line":22,"column":28}},"9":{"start":{"line":24,"column":15},"end":{"line":24,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2},"f":{},"b":{}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\product.ts": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\product.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"3":{"start":{"line":16,"column":9},"end":{"line":16,"column":28}},"4":{"start":{"line":22,"column":4},"end":{"line":22,"column":9}},"5":{"start":{"line":27,"column":17},"end":{"line":27,"column":28}},"6":{"start":{"line":28,"column":4},"end":{"line":28,"column":9}},"7":{"start":{"line":18,"column":31},"end":{"line":18,"column":69}},"8":{"start":{"line":21,"column":2},"end":{"line":21,"column":10}},"9":{"start":{"line":26,"column":2},"end":{"line":26,"column":8}},"10":{"start":{"line":15,"column":13},"end":{"line":15,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"loc":{"start":{"line":15,"column":0},"end":{"line":30,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":2},"end":{"line":21,"column":10}},"loc":{"start":{"line":21,"column":27},"end":{"line":23,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":2},"end":{"line":26,"column":8}},"loc":{"start":{"line":26,"column":18},"end":{"line":29,"column":null}}}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":4,"5":2,"6":2,"7":3,"8":3,"9":3,"10":3},"f":{"0":3,"1":4,"2":2},"b":{}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\data\\inMemoryRepository\\cartRepository.ts": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\data\\inMemoryRepository\\cartRepository.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":7,"column":0},"end":{"line":7,"column":null}},"4":{"start":{"line":8,"column":10},"end":{"line":8,"column":27}},"5":{"start":{"line":11,"column":4},"end":{"line":11,"column":9}},"6":{"start":{"line":12,"column":4},"end":{"line":12,"column":11}},"7":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"8":{"start":{"line":21,"column":16},"end":{"line":21,"column":null}},"9":{"start":{"line":22,"column":4},"end":{"line":22,"column":11}},"10":{"start":{"line":24,"column":16},"end":{"line":24,"column":null}},"11":{"start":{"line":7,"column":21},"end":{"line":7,"column":39}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}},"loc":{"start":{"line":7,"column":0},"end":{"line":27,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":22}},"loc":{"start":{"line":10,"column":57},"end":{"line":18,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":10},"end":{"line":14,"column":15}},"loc":{"start":{"line":14,"column":15},"end":{"line":16,"column":null}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":20,"column":9},"end":{"line":20,"column":25}},"loc":{"start":{"line":20,"column":25},"end":{"line":26,"column":null}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":24,"column":10},"end":{"line":24,"column":16}},"loc":{"start":{"line":24,"column":16},"end":{"line":24,"column":null}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":8},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\data\\inMemoryRepository\\productRepository.ts": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\data\\inMemoryRepository\\productRepository.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"3":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"4":{"start":{"line":12,"column":20},"end":{"line":12,"column":null}},"5":{"start":{"line":23,"column":4},"end":{"line":23,"column":11}},"6":{"start":{"line":24,"column":21},"end":{"line":24,"column":null}},"7":{"start":{"line":25,"column":4},"end":{"line":33,"column":null}},"8":{"start":{"line":25,"column":17},"end":{"line":25,"column":20}},"9":{"start":{"line":26,"column":6},"end":{"line":26,"column":14}},"10":{"start":{"line":34,"column":4},"end":{"line":34,"column":9}},"11":{"start":{"line":38,"column":4},"end":{"line":38,"column":11}},"12":{"start":{"line":39,"column":16},"end":{"line":39,"column":null}},"13":{"start":{"line":8,"column":21},"end":{"line":8,"column":42}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"loc":{"start":{"line":11,"column":2},"end":{"line":35,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":37,"column":9},"end":{"line":37,"column":15}},"loc":{"start":{"line":37,"column":15},"end":{"line":41,"column":null}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":10},"end":{"line":39,"column":16}},"loc":{"start":{"line":39,"column":16},"end":{"line":39,"column":null}}}},"branchMap":{},"s":{"0":4,"1":4,"2":4,"3":4,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":8},"f":{"0":0,"1":0,"2":0},"b":{}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\addItemToCart.ts": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\addItemToCart.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"2":{"start":{"line":13,"column":38},"end":{"line":13,"column":68}},"3":{"start":{"line":18,"column":4},"end":{"line":18,"column":11}},"4":{"start":{"line":11,"column":13},"end":{"line":11,"column":30}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"loc":{"start":{"line":13,"column":68},"end":{"line":15,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":2},"end":{"line":17,"column":9}},"loc":{"start":{"line":17,"column":44},"end":{"line":19,"column":null}}}},"branchMap":{},"s":{"0":4,"1":4,"2":0,"3":0,"4":4},"f":{"0":0,"1":0},"b":{}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\getAllProduct.ts": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\getAllProduct.ts","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"1":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"2":{"start":{"line":13,"column":40},"end":{"line":13,"column":70}},"3":{"start":{"line":17,"column":4},"end":{"line":17,"column":11}},"4":{"start":{"line":11,"column":13},"end":{"line":11,"column":30}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"loc":{"start":{"line":13,"column":70},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":2},"end":{"line":16,"column":9}},"loc":{"start":{"line":16,"column":9},"end":{"line":18,"column":null}}}},"branchMap":{},"s":{"0":4,"1":4,"2":0,"3":0,"4":4},"f":{"0":0,"1":0},"b":{}}
,"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\getTotalCartItem.ts": {"path":"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\getTotalCartItem.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":null}},"1":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"2":{"start":{"line":12,"column":38},"end":{"line":12,"column":68}},"3":{"start":{"line":17,"column":4},"end":{"line":17,"column":11}},"4":{"start":{"line":10,"column":13},"end":{"line":10,"column":33}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"loc":{"start":{"line":12,"column":68},"end":{"line":14,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":2},"end":{"line":16,"column":9}},"loc":{"start":{"line":16,"column":9},"end":{"line":18,"column":null}}}},"branchMap":{},"s":{"0":4,"1":4,"2":0,"3":0,"4":4},"f":{"0":0,"1":0},"b":{}}
}
================================================
FILE: coverage/lcov-report/base.css
================================================
body, html {
margin:0; padding: 0;
height: 100%;
}
body {
font-family: Helvetica Neue, Helvetica, Arial;
font-size: 14px;
color:#333;
}
.small { font-size: 12px; }
*, *:after, *:before {
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
h1 { font-size: 20px; margin: 0;}
h2 { font-size: 14px; }
pre {
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
margin: 0;
padding: 0;
-moz-tab-size: 2;
-o-tab-size: 2;
tab-size: 2;
}
a { color:#0074D9; text-decoration:none; }
a:hover { text-decoration:underline; }
.strong { font-weight: bold; }
.space-top1 { padding: 10px 0 0 0; }
.pad2y { padding: 20px 0; }
.pad1y { padding: 10px 0; }
.pad2x { padding: 0 20px; }
.pad2 { padding: 20px; }
.pad1 { padding: 10px; }
.space-left2 { padding-left:55px; }
.space-right2 { padding-right:20px; }
.center { text-align:center; }
.clearfix { display:block; }
.clearfix:after {
content:'';
display:block;
height:0;
clear:both;
visibility:hidden;
}
.fl { float: left; }
@media only screen and (max-width:640px) {
.col3 { width:100%; max-width:100%; }
.hide-mobile { display:none!important; }
}
.quiet {
color: #7f7f7f;
color: rgba(0,0,0,0.5);
}
.quiet a { opacity: 0.7; }
.fraction {
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
font-size: 10px;
color: #555;
background: #E8E8E8;
padding: 4px 5px;
border-radius: 3px;
vertical-align: middle;
}
div.path a:link, div.path a:visited { color: #333; }
table.coverage {
border-collapse: collapse;
margin: 10px 0 0 0;
padding: 0;
}
table.coverage td {
margin: 0;
padding: 0;
vertical-align: top;
}
table.coverage td.line-count {
text-align: right;
padding: 0 5px 0 20px;
}
table.coverage td.line-coverage {
text-align: right;
padding-right: 10px;
min-width:20px;
}
table.coverage td span.cline-any {
display: inline-block;
padding: 0 5px;
width: 100%;
}
.missing-if-branch {
display: inline-block;
margin-right: 5px;
border-radius: 3px;
position: relative;
padding: 0 4px;
background: #333;
color: yellow;
}
.skip-if-branch {
display: none;
margin-right: 10px;
position: relative;
padding: 0 4px;
background: #ccc;
color: white;
}
.missing-if-branch .typ, .skip-if-branch .typ {
color: inherit !important;
}
.coverage-summary {
border-collapse: collapse;
width: 100%;
}
.coverage-summary tr { border-bottom: 1px solid #bbb; }
.keyline-all { border: 1px solid #ddd; }
.coverage-summary td, .coverage-summary th { padding: 10px; }
.coverage-summary tbody { border: 1px solid #bbb; }
.coverage-summary td { border-right: 1px solid #bbb; }
.coverage-summary td:last-child { border-right: none; }
.coverage-summary th {
text-align: left;
font-weight: normal;
white-space: nowrap;
}
.coverage-summary th.file { border-right: none !important; }
.coverage-summary th.pct { }
.coverage-summary th.pic,
.coverage-summary th.abs,
.coverage-summary td.pct,
.coverage-summary td.abs { text-align: right; }
.coverage-summary td.file { white-space: nowrap; }
.coverage-summary td.pic { min-width: 120px !important; }
.coverage-summary tfoot td { }
.coverage-summary .sorter {
height: 10px;
width: 7px;
display: inline-block;
margin-left: 0.5em;
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
}
.coverage-summary .sorted .sorter {
background-position: 0 -20px;
}
.coverage-summary .sorted-desc .sorter {
background-position: 0 -10px;
}
.status-line { height: 10px; }
/* yellow */
.cbranch-no { background: yellow !important; color: #111; }
/* dark red */
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
.low .chart { border:1px solid #C21F39 }
.highlighted,
.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
background: #C21F39 !important;
}
/* medium red */
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
/* light red */
.low, .cline-no { background:#FCE1E5 }
/* light green */
.high, .cline-yes { background:rgb(230,245,208) }
/* medium green */
.cstat-yes { background:rgb(161,215,106) }
/* dark green */
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
.high .chart { border:1px solid rgb(77,146,33) }
/* dark yellow (gold) */
.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
.medium .chart { border:1px solid #f9cd0b; }
/* light yellow */
.medium { background: #fff4c2; }
.cstat-skip { background: #ddd; color: #111; }
.fstat-skip { background: #ddd; color: #111 !important; }
.cbranch-skip { background: #ddd !important; color: #111; }
span.cline-neutral { background: #eaeaea; }
.coverage-summary td.empty {
opacity: .5;
padding-top: 4px;
padding-bottom: 4px;
line-height: 1;
color: #888;
}
.cover-fill, .cover-empty {
display:inline-block;
height: 12px;
}
.chart {
line-height: 0;
}
.cover-empty {
background: white;
}
.cover-full {
border-right: none !important;
}
pre.prettyprint {
border: none !important;
padding: 0 !important;
margin: 0 !important;
}
.com { color: #999 !important; }
.ignore-none { color: #999; font-weight: normal; }
.wrapper {
min-height: 100%;
height: auto !important;
height: 100%;
margin: 0 auto -48px;
}
.footer, .push {
height: 48px;
}
================================================
FILE: coverage/lcov-report/block-navigation.js
================================================
/* eslint-disable */
var jumpToCode = (function init() {
// Classes of code we would like to highlight in the file view
var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
// Elements to highlight in the file listing view
var fileListingElements = ['td.pct.low'];
// We don't want to select elements that are direct descendants of another match
var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
// Selecter that finds elements on the page to which we can jump
var selector =
fileListingElements.join(', ') +
', ' +
notSelector +
missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
// The NodeList of matching elements
var missingCoverageElements = document.querySelectorAll(selector);
var currentIndex;
function toggleClass(index) {
missingCoverageElements
.item(currentIndex)
.classList.remove('highlighted');
missingCoverageElements.item(index).classList.add('highlighted');
}
function makeCurrent(index) {
toggleClass(index);
currentIndex = index;
missingCoverageElements.item(index).scrollIntoView({
behavior: 'smooth',
block: 'center',
inline: 'center'
});
}
function goToPrevious() {
var nextIndex = 0;
if (typeof currentIndex !== 'number' || currentIndex === 0) {
nextIndex = missingCoverageElements.length - 1;
} else if (missingCoverageElements.length > 1) {
nextIndex = currentIndex - 1;
}
makeCurrent(nextIndex);
}
function goToNext() {
var nextIndex = 0;
if (
typeof currentIndex === 'number' &&
currentIndex < missingCoverageElements.length - 1
) {
nextIndex = currentIndex + 1;
}
makeCurrent(nextIndex);
}
return function jump(event) {
switch (event.which) {
case 78: // n
case 74: // j
goToNext();
break;
case 66: // b
case 75: // k
case 80: // p
goToPrevious();
break;
}
};
})();
window.addEventListener('keydown', jumpToCode);
================================================
FILE: coverage/lcov-report/index.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for All files</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>All files</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">73.39% </span>
<span class="quiet">Statements</span>
<span class='fraction'>80/109</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>2/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">35.48% </span>
<span class="quiet">Functions</span>
<span class='fraction'>11/31</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">72.73% </span>
<span class="quiet">Lines</span>
<span class='fraction'>72/99</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line medium'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file high" data-value="src"><a href="src\index.html">src</a></td>
<td data-value="100" class="pic high">
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="15" class="abs high">15/15</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="15" class="abs high">15/15</td>
</tr>
<tr>
<td class="file medium" data-value="src/app/components"><a href="src\app\components\index.html">src/app/components</a></td>
<td data-value="76.92" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 76%"></div><div class="cover-empty" style="width: 24%"></div></div>
</td>
<td data-value="76.92" class="pct medium">76.92%</td>
<td data-value="13" class="abs medium">10/13</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="66.67" class="pct medium">66.67%</td>
<td data-value="6" class="abs medium">4/6</td>
<td data-value="76.92" class="pct medium">76.92%</td>
<td data-value="13" class="abs medium">10/13</td>
</tr>
<tr>
<td class="file high" data-value="src/app/store"><a href="src\app\store\index.html">src/app/store</a></td>
<td data-value="90" class="pic high">
<div class="chart"><div class="cover-fill" style="width: 90%"></div><div class="cover-empty" style="width: 10%"></div></div>
</td>
<td data-value="90" class="pct high">90%</td>
<td data-value="40" class="abs high">36/40</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="2" class="abs high">2/2</td>
<td data-value="63.64" class="pct medium">63.64%</td>
<td data-value="11" class="abs medium">7/11</td>
<td data-value="91.67" class="pct high">91.67%</td>
<td data-value="36" class="abs high">33/36</td>
</tr>
<tr>
<td class="file low" data-value="src/data/inMemoryRepository"><a href="src\data\inMemoryRepository\index.html">src/data/inMemoryRepository</a></td>
<td data-value="38.46" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 38%"></div><div class="cover-empty" style="width: 62%"></div></div>
</td>
<td data-value="38.46" class="pct low">38.46%</td>
<td data-value="26" class="abs low">10/26</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="8" class="abs low">0/8</td>
<td data-value="34.78" class="pct low">34.78%</td>
<td data-value="23" class="abs low">8/23</td>
</tr>
<tr>
<td class="file medium" data-value="src/usecases/interactor"><a href="src\usecases\interactor\index.html">src/usecases/interactor</a></td>
<td data-value="60" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 60%"></div><div class="cover-empty" style="width: 40%"></div></div>
</td>
<td data-value="60" class="pct medium">60%</td>
<td data-value="15" class="abs medium">9/15</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="6" class="abs low">0/6</td>
<td data-value="50" class="pct medium">50%</td>
<td data-value="12" class="abs medium">6/12</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="sorter.js"></script>
<script src="block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/prettify.css
================================================
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
================================================
FILE: coverage/lcov-report/prettify.js
================================================
/* eslint-disable */
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
================================================
FILE: coverage/lcov-report/sorter.js
================================================
/* eslint-disable */
var addSorting = (function() {
'use strict';
var cols,
currentSort = {
index: 0,
desc: false
};
// returns the summary table element
function getTable() {
return document.querySelector('.coverage-summary');
}
// returns the thead element of the summary table
function getTableHeader() {
return getTable().querySelector('thead tr');
}
// returns the tbody element of the summary table
function getTableBody() {
return getTable().querySelector('tbody');
}
// returns the th element for nth column
function getNthColumn(n) {
return getTableHeader().querySelectorAll('th')[n];
}
// loads all columns
function loadColumns() {
var colNodes = getTableHeader().querySelectorAll('th'),
colNode,
cols = [],
col,
i;
for (i = 0; i < colNodes.length; i += 1) {
colNode = colNodes[i];
col = {
key: colNode.getAttribute('data-col'),
sortable: !colNode.getAttribute('data-nosort'),
type: colNode.getAttribute('data-type') || 'string'
};
cols.push(col);
if (col.sortable) {
col.defaultDescSort = col.type === 'number';
colNode.innerHTML =
colNode.innerHTML + '<span class="sorter"></span>';
}
}
return cols;
}
// attaches a data attribute to every tr element with an object
// of data values keyed by column name
function loadRowData(tableRow) {
var tableCols = tableRow.querySelectorAll('td'),
colNode,
col,
data = {},
i,
val;
for (i = 0; i < tableCols.length; i += 1) {
colNode = tableCols[i];
col = cols[i];
val = colNode.getAttribute('data-value');
if (col.type === 'number') {
val = Number(val);
}
data[col.key] = val;
}
return data;
}
// loads all row data
function loadData() {
var rows = getTableBody().querySelectorAll('tr'),
i;
for (i = 0; i < rows.length; i += 1) {
rows[i].data = loadRowData(rows[i]);
}
}
// sorts the table using the data for the ith column
function sortByIndex(index, desc) {
var key = cols[index].key,
sorter = function(a, b) {
a = a.data[key];
b = b.data[key];
return a < b ? -1 : a > b ? 1 : 0;
},
finalSorter = sorter,
tableBody = document.querySelector('.coverage-summary tbody'),
rowNodes = tableBody.querySelectorAll('tr'),
rows = [],
i;
if (desc) {
finalSorter = function(a, b) {
return -1 * sorter(a, b);
};
}
for (i = 0; i < rowNodes.length; i += 1) {
rows.push(rowNodes[i]);
tableBody.removeChild(rowNodes[i]);
}
rows.sort(finalSorter);
for (i = 0; i < rows.length; i += 1) {
tableBody.appendChild(rows[i]);
}
}
// removes sort indicators for current column being sorted
function removeSortIndicators() {
var col = getNthColumn(currentSort.index),
cls = col.className;
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
col.className = cls;
}
// adds sort indicators for current column being sorted
function addSortIndicators() {
getNthColumn(currentSort.index).className += currentSort.desc
? ' sorted-desc'
: ' sorted';
}
// adds event listeners for all sorter widgets
function enableUI() {
var i,
el,
ithSorter = function ithSorter(i) {
var col = cols[i];
return function() {
var desc = col.defaultDescSort;
if (currentSort.index === i) {
desc = !currentSort.desc;
}
sortByIndex(i, desc);
removeSortIndicators();
currentSort.index = i;
currentSort.desc = desc;
addSortIndicators();
};
};
for (i = 0; i < cols.length; i += 1) {
if (cols[i].sortable) {
// add the click event handler on the th so users
// dont have to click on those tiny arrows
el = getNthColumn(i).querySelector('.sorter').parentElement;
if (el.addEventListener) {
el.addEventListener('click', ithSorter(i));
} else {
el.attachEvent('onclick', ithSorter(i));
}
}
}
}
// adds sorting functionality to the UI
return function() {
if (!getTable()) {
return;
}
cols = loadColumns();
loadData();
addSortIndicators();
enableUI();
};
})();
window.addEventListener('load', addSorting);
================================================
FILE: coverage/lcov-report/src/app/components/Product.vue.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/app/components/Product.vue</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/app/components</a> Product.vue</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">50% </span>
<span class="quiet">Statements</span>
<span class='fraction'>3/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">33.33% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/3</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">50% </span>
<span class="quiet">Lines</span>
<span class='fraction'>3/6</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line medium'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><template>
<v-card hover outlined>
<v-card-text>
<v-img height="200"
:src="product.thumbnailUrl"/>
<p class="mt-6 mb-0 title success--text">{{ product.name }}</p>
<p class="pink--text body-1">${{ product.price.toLocaleString() }}</p>
<p>{{ product.description }}</p>
<v-btn block color="success" @click="addToCart" :loading="loading">Add to cart</v-btn>
</v-card-text>
</v-card>
</template>
<script lang="ts">
import Vue from 'vue'
import {cartStore} from "@/app/store";
export default Vue.extend({
props: {
product: {
type: Object
}
},
data() {
return {
loading: false,
}
},
methods: {
<span class="fstat-no" title="function not covered" > addToCart() {</span>
<span class="cstat-no" title="statement not covered" > this.loading = true;</span>
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" > cartStore.addProductToCart({product: this.product, quantity: 1})</span></span>
.finally(() => {
<span class="cstat-no" title="statement not covered" > this.loading = false</span>
})
}
}
})
</script></pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/app/components/ProductList.vue.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/app/components/ProductList.vue</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/app/components</a> ProductList.vue</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>7/7</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>3/3</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>7/7</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><template>
<div>
<v-row>
<v-col :key="idx" md="4" sm="6" v-for="(item ,idx) in products" xs="12">
<Product class="my-5" :key="idx" :product="item"></Product>
</v-col>
</v-row>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import ProductComponent from "@/app/components/Product.vue";
import { ProductStore } from "@/app/store/product";
import { getModule } from "vuex-module-decorators";
import { Product } from "@/domain/entity";
export default Vue.extend({
components: {
Product: ProductComponent
},
computed: {
productStore(): ProductStore {
return getModule(ProductStore, this.$store);
},
products(): Product[] {
return this.productStore.items;
}
},
data() {
return {
loading: false
};
}
});
</script></pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/app/components/index.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/app/components</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> src/app/components</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">76.92% </span>
<span class="quiet">Statements</span>
<span class='fraction'>10/13</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">66.67% </span>
<span class="quiet">Functions</span>
<span class='fraction'>4/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">76.92% </span>
<span class="quiet">Lines</span>
<span class='fraction'>10/13</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line medium'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file medium" data-value="Product.vue"><a href="Product.vue.html">Product.vue</a></td>
<td data-value="50" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 50%"></div><div class="cover-empty" style="width: 50%"></div></div>
</td>
<td data-value="50" class="pct medium">50%</td>
<td data-value="6" class="abs medium">3/6</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="33.33" class="pct low">33.33%</td>
<td data-value="3" class="abs low">1/3</td>
<td data-value="50" class="pct medium">50%</td>
<td data-value="6" class="abs medium">3/6</td>
</tr>
<tr>
<td class="file high" data-value="ProductList.vue"><a href="ProductList.vue.html">ProductList.vue</a></td>
<td data-value="100" class="pic high">
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="7" class="abs high">7/7</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="3" class="abs high">3/3</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="7" class="abs high">7/7</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/app/store/cart.ts.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/app/store/cart.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/app/store</a> cart.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">78.95% </span>
<span class="quiet">Statements</span>
<span class='fraction'>15/19</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>2/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">50% </span>
<span class="quiet">Functions</span>
<span class='fraction'>4/8</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">81.25% </span>
<span class="quiet">Lines</span>
<span class='fraction'>13/16</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line medium'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { lazyInject } from "@/di";
import { Action, Module, Mutation, VuexModule } from "vuex-module-decorators";
import { Cart, Product } from "@/domain/entity";
import { AddItemToCart } from "@/usecases/interactor/addItemToCart";
export interface CartState {
items: Cart[];
}
export interface AddProductToCartPayload {
product: Product;
quantity: number;
}
@Module({
name: "cart",
namespaced: true
})
export class CartStore extends VuexModule implements CartState {
public items: Cart[] = [];
@lazyInject("AddItemToCart") private addItemToCart!: AddItemToCart;
<span class="fstat-no" title="function not covered" > get t</span>otalCartItem(): number {
<span class="cstat-no" title="statement not covered" > return t</span>his.items.reduce(<span class="fstat-no" title="function not covered" >(a</span>cc, cart) => <span class="cstat-no" title="statement not covered" >acc + cart.quantity, 0</span>);
}
<span class="fstat-no" title="function not covered" > get t</span>otalAmount(): number {
<span class="cstat-no" title="statement not covered" > return t</span>his.items.reduce(
<span class="fstat-no" title="function not covered" > (a</span>cc, item) => <span class="cstat-no" title="statement not covered" >acc + item.quantity * item.product.price,</span>
0
);
}
@Mutation
addItem(cart: Cart) {
const idx = this.items.findIndex(c => c.product.id === cart.product.id);
if (idx >= 0) {
this.items[idx].quantity += cart.quantity;
} else {
this.items.push(cart);
}
}
@Action
async addProductToCart({ product, quantity }: AddProductToCartPayload) {
await this.addItemToCart.execute(product, quantity).toPromise();
this.addItem({
product: product,
quantity: quantity
} as Cart);
}
}
</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/app/store/index.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/app/store</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> src/app/store</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">90% </span>
<span class="quiet">Statements</span>
<span class='fraction'>36/40</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>2/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">63.64% </span>
<span class="quiet">Functions</span>
<span class='fraction'>7/11</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">91.67% </span>
<span class="quiet">Lines</span>
<span class='fraction'>33/36</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line high'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file medium" data-value="cart.ts"><a href="cart.ts.html">cart.ts</a></td>
<td data-value="78.95" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 78%"></div><div class="cover-empty" style="width: 22%"></div></div>
</td>
<td data-value="78.95" class="pct medium">78.95%</td>
<td data-value="19" class="abs medium">15/19</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="2" class="abs high">2/2</td>
<td data-value="50" class="pct medium">50%</td>
<td data-value="8" class="abs medium">4/8</td>
<td data-value="81.25" class="pct high">81.25%</td>
<td data-value="16" class="abs high">13/16</td>
</tr>
<tr>
<td class="file high" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
<td data-value="100" class="pic high">
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="10" class="abs high">10/10</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="10" class="abs high">10/10</td>
</tr>
<tr>
<td class="file high" data-value="product.ts"><a href="product.ts.html">product.ts</a></td>
<td data-value="100" class="pic high">
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="11" class="abs high">11/11</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="3" class="abs high">3/3</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="10" class="abs high">10/10</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/app/store/index.ts.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/app/store/index.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/app/store</a> index.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>10/10</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>10/10</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import Vue from "vue";
import Vuex from "vuex";
import {ProductState, ProductStore} from "./product";
import {CartState, CartStore} from "./cart";
import {getModule} from "vuex-module-decorators";
Vue.use(Vuex);
export interface RootState {
product: ProductState;
cart: CartState;
}
const store = new Vuex.Store<RootState>({
modules: {
product: ProductStore,
cart: CartStore
}
});
const productStore = getModule(ProductStore, store)
const cartStore = getModule(CartStore, store)
export {productStore, cartStore}
export default store;
</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/app/store/product.ts.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/app/store/product.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/app/store</a> product.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>11/11</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>3/3</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>10/10</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { lazyInject } from "@/di";
import { Action, Module, Mutation, VuexModule } from "vuex-module-decorators";
import { Product } from "@/domain/entity";
import { GetAllProduct } from "@/usecases/interactor/getAllProduct";
export interface ProductState {
items: Product[];
}
@Module({
name: "product",
namespaced: true
})
export class ProductStore extends VuexModule implements ProductState {
public items: Product[] = [];
@lazyInject("GetAllProduct") private getAllProduct!: GetAllProduct;
@Mutation
setItems(items: Product[]) {
this.items = items;
}
@Action
async fetchItems() {
const list = await this.getAllProduct.execute().toPromise();
this.setItems(list);
}
}
</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/data/inMemoryRepository/cartRepository.ts.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/data/inMemoryRepository/cartRepository.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/data/inMemoryRepository</a> cartRepository.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">41.67% </span>
<span class="quiet">Statements</span>
<span class='fraction'>5/12</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">36.36% </span>
<span class="quiet">Lines</span>
<span class='fraction'>4/11</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import {Observable, of} from "rxjs";
import {delay, map} from "rxjs/operators";
import {injectable} from "inversify";
import {Cart, Product} from "@/domain/entity";
@injectable()
<span class="fstat-no" title="function not covered" >export default class C</span>artRepositoryImpl {
private <span class="cstat-no" title="statement not covered" >_carts: Cart[] = [</span>];
public <span class="fstat-no" title="function not covered" >addItemToCart(</span>product: Product, quantity: number): Observable<void> {
<span class="cstat-no" title="statement not covered" > this._</span>carts.push({product, quantity});
<span class="cstat-no" title="statement not covered" > return o</span>f(1).pipe(
// delay(1000),
map(<span class="fstat-no" title="function not covered" >() => </span>{
<span class="cstat-no" title="statement not covered" > return;</span>
})
);
}
public <span class="fstat-no" title="function not covered" >getTotalCartItem(</span>): Observable<number> {
const val = <span class="cstat-no" title="statement not covered" >this._carts.length;</span>
<span class="cstat-no" title="statement not covered" > return o</span>f(null).pipe(
// delay(1000),
map(<span class="fstat-no" title="function not covered" >() => <span class="cstat-no" title="statement not covered" >v</span>al)</span>
);
}
}
</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/data/inMemoryRepository/index.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/data/inMemoryRepository</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> src/data/inMemoryRepository</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">38.46% </span>
<span class="quiet">Statements</span>
<span class='fraction'>10/26</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/8</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">34.78% </span>
<span class="quiet">Lines</span>
<span class='fraction'>8/23</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="cartRepository.ts"><a href="cartRepository.ts.html">cartRepository.ts</a></td>
<td data-value="41.67" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 41%"></div><div class="cover-empty" style="width: 59%"></div></div>
</td>
<td data-value="41.67" class="pct low">41.67%</td>
<td data-value="12" class="abs low">5/12</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="5" class="abs low">0/5</td>
<td data-value="36.36" class="pct low">36.36%</td>
<td data-value="11" class="abs low">4/11</td>
</tr>
<tr>
<td class="file low" data-value="productRepository.ts"><a href="productRepository.ts.html">productRepository.ts</a></td>
<td data-value="35.71" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 35%"></div><div class="cover-empty" style="width: 65%"></div></div>
</td>
<td data-value="35.71" class="pct low">35.71%</td>
<td data-value="14" class="abs low">5/14</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="3" class="abs low">0/3</td>
<td data-value="33.33" class="pct low">33.33%</td>
<td data-value="12" class="abs low">4/12</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/data/inMemoryRepository/productRepository.ts.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/data/inMemoryRepository/productRepository.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/data/inMemoryRepository</a> productRepository.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">35.71% </span>
<span class="quiet">Statements</span>
<span class='fraction'>5/14</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/3</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">33.33% </span>
<span class="quiet">Lines</span>
<span class='fraction'>4/12</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import {Observable, of} from "rxjs";
import {injectable} from "inversify";
import {Product} from "@/domain/entity";
import {map} from "rxjs/operators";
@injectable()
export default class ProductRepositoryImpl {
readonly _products: Product[];
<span class="fstat-no" title="function not covered" > constructor() {</span>
const _images = <span class="cstat-no" title="statement not covered" >[</span>
"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img1.jpg?raw=1",
"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img2.jpg?raw=1",
"https://www.dropbox.com/s/78fot6w894stu3n/img3.jpg?raw=1",
"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img4.jpg?raw=1",
"https://www.dropbox.com/s/d45c3pap1h4cu0y/img5.jpg?raw=1",
"https://www.dropbox.com/s/rjj1vtdx79xptu0/img6.jpeg?raw=1",
"https://www.dropbox.com/s/miym588nx2lscqt/img7.jpg?raw=1",
"https://www.dropbox.com/s/miym588nx2lscqt/img8.jpg?raw=1",
"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img9.jpg?raw=1",
]
<span class="cstat-no" title="statement not covered" > console.</span>log('hti')
const products = <span class="cstat-no" title="statement not covered" >[]</span>
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0; i</span> < 20; i++) {</span>
<span class="cstat-no" title="statement not covered" > products.</span>push({
id: `${i + 1}`,
name: `Product ${i + 1}`,
price: 2200,
thumbnailUrl: _images[Math.floor(Math.random() * (_images.length - 1))],
description: "3.0GHz Dual-core Haswell Intel Core i5 Turbo Boost up to 3.2 GHz, 3MB L3 cache 8GB (two 4GB SO-DIMMs..."
})
}
<span class="cstat-no" title="statement not covered" > this._</span>products = products
}
public <span class="fstat-no" title="function not covered" >getAll(</span>): Observable<Product[]> {
<span class="cstat-no" title="statement not covered" > return o</span>f(null).pipe(
map(<span class="fstat-no" title="function not covered" >() => <span class="cstat-no" title="statement not covered" >t</span>his._products)</span>
)
}
}
</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/di.ts.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/di.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\prettify.css" />
<link rel="stylesheet" href="..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\index.html">All files</a> / <a href="index.html">src</a> di.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>15/15</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>15/15</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import "reflect-metadata";
import {Container} from "inversify";
import getDecorators from "inversify-inject-decorators";
import CartRepository from "@/usecases/repository/cartRepository";
import ProductRepository from "@/usecases/repository/productRepository";
import CartRepositoryImpl from "@/data/inMemoryRepository/cartRepository";
import ProductRepositoryImpl from "@/data/inMemoryRepository/productRepository";
import {AddItemToCart, AddItemToCartImpl} from "@/usecases/interactor/addItemToCart";
import {GetAllProduct, GetAllProductImpl} from "@/usecases/interactor/getAllProduct";
import {GetTotalCartItem, GetTotalCartItemImpl} from "@/usecases/interactor/getTotalCartItem";
const container = new Container();
container
.bind<CartRepository>("CartRepository")
.to(CartRepositoryImpl)
.inSingletonScope();
container
.bind<ProductRepository>("ProductRepository")
.to(ProductRepositoryImpl)
.inSingletonScope();
container
.bind<AddItemToCart>("AddItemToCart")
.to(AddItemToCartImpl)
.inSingletonScope();
container
.bind<GetAllProduct>("GetAllProduct")
.to(GetAllProductImpl)
.inSingletonScope();
container
.bind<GetTotalCartItem>("GetTotalCartItem")
.to(GetTotalCartItemImpl)
.inSingletonScope();
const {lazyInject} = getDecorators(container);
export {lazyInject, container};
</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\sorter.js"></script>
<script src="..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/index.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\prettify.css" />
<link rel="stylesheet" href="..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\index.html">All files</a> src</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class='fraction'>15/15</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class='fraction'>15/15</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line high'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file high" data-value="di.ts"><a href="di.ts.html">di.ts</a></td>
<td data-value="100" class="pic high">
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="15" class="abs high">15/15</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="15" class="abs high">15/15</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\sorter.js"></script>
<script src="..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/usecases/interactor/addItemToCart.ts.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/usecases/interactor/addItemToCart.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/usecases/interactor</a> addItemToCart.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">60% </span>
<span class="quiet">Statements</span>
<span class='fraction'>3/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">50% </span>
<span class="quiet">Lines</span>
<span class='fraction'>2/4</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line medium'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import {Observable} from "rxjs";
import {inject, injectable} from "inversify";
import {Product} from "@/domain/entity";
import CartRepository from "@/usecases/repository/cartRepository";
export interface AddItemToCart {
execute(product: Product, quantity: number): Observable<void>;
}
@injectable()
export class AddItemToCartImpl implements AddItemToCart {
<span class="fstat-no" title="function not covered" > constructor(</span>
@inject("CartRepository") private <span class="cstat-no" title="statement not covered" >cartRepository: CartRepository</span>
) {
}
<span class="fstat-no" title="function not covered" > execute(</span>product: Product, quantity: number): Observable<void> {
<span class="cstat-no" title="statement not covered" > return t</span>his.cartRepository.addItemToCart(product, quantity);
}
}
</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/usecases/interactor/getAllProduct.ts.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/usecases/interactor/getAllProduct.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/usecases/interactor</a> getAllProduct.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">60% </span>
<span class="quiet">Statements</span>
<span class='fraction'>3/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">50% </span>
<span class="quiet">Lines</span>
<span class='fraction'>2/4</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line medium'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Product } from "@/domain/entity";
import { Observable, of } from "rxjs";
import { inject, injectable } from "inversify";
import ProductRepository from "@/usecases/repository/productRepository";
export interface GetAllProduct {
execute(): Observable<Product[]>;
}
@injectable()
export class GetAllProductImpl implements GetAllProduct {
<span class="fstat-no" title="function not covered" > constructor(</span>
@inject("ProductRepository") public <span class="cstat-no" title="statement not covered" >productRepo: ProductRepository</span>
) {}
<span class="fstat-no" title="function not covered" > execute(</span>): Observable<Product[]> {
<span class="cstat-no" title="statement not covered" > return t</span>his.productRepo.getAll();
}
}
</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/usecases/interactor/getTotalCartItem.ts.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/usecases/interactor/getTotalCartItem.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> / <a href="index.html">src/usecases/interactor</a> getTotalCartItem.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">60% </span>
<span class="quiet">Statements</span>
<span class='fraction'>3/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">50% </span>
<span class="quiet">Lines</span>
<span class='fraction'>2/4</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line medium'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import {Observable} from "rxjs";
import {inject, injectable} from "inversify";
import CartRepository from "@/usecases/repository/cartRepository";
export interface GetTotalCartItem {
execute(): Observable<number>;
}
@injectable()
export class GetTotalCartItemImpl implements GetTotalCartItem {
<span class="fstat-no" title="function not covered" > constructor(</span>
@inject("CartRepository") private <span class="cstat-no" title="statement not covered" >cartRepository: CartRepository</span>
) {
}
<span class="fstat-no" title="function not covered" > execute(</span>): Observable<number> {
<span class="cstat-no" title="statement not covered" > return t</span>his.cartRepository.getTotalCartItem()
}
}
</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov-report/src/usecases/interactor/index.html
================================================
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/usecases/interactor</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="..\..\..\prettify.css" />
<link rel="stylesheet" href="..\..\..\base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(..\..\..\sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="..\..\..\index.html">All files</a> src/usecases/interactor</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">60% </span>
<span class="quiet">Statements</span>
<span class='fraction'>9/15</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">50% </span>
<span class="quiet">Lines</span>
<span class='fraction'>6/12</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
</div>
<div class='status-line medium'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file medium" data-value="addItemToCart.ts"><a href="addItemToCart.ts.html">addItemToCart.ts</a></td>
<td data-value="60" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 60%"></div><div class="cover-empty" style="width: 40%"></div></div>
</td>
<td data-value="60" class="pct medium">60%</td>
<td data-value="5" class="abs medium">3/5</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="2" class="abs low">0/2</td>
<td data-value="50" class="pct medium">50%</td>
<td data-value="4" class="abs medium">2/4</td>
</tr>
<tr>
<td class="file medium" data-value="getAllProduct.ts"><a href="getAllProduct.ts.html">getAllProduct.ts</a></td>
<td data-value="60" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 60%"></div><div class="cover-empty" style="width: 40%"></div></div>
</td>
<td data-value="60" class="pct medium">60%</td>
<td data-value="5" class="abs medium">3/5</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="2" class="abs low">0/2</td>
<td data-value="50" class="pct medium">50%</td>
<td data-value="4" class="abs medium">2/4</td>
</tr>
<tr>
<td class="file medium" data-value="getTotalCartItem.ts"><a href="getTotalCartItem.ts.html">getTotalCartItem.ts</a></td>
<td data-value="60" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 60%"></div><div class="cover-empty" style="width: 40%"></div></div>
</td>
<td data-value="60" class="pct medium">60%</td>
<td data-value="5" class="abs medium">3/5</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="2" class="abs low">0/2</td>
<td data-value="50" class="pct medium">50%</td>
<td data-value="4" class="abs medium">2/4</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)
</div>
</div>
<script src="..\..\..\prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="..\..\..\sorter.js"></script>
<script src="..\..\..\block-navigation.js"></script>
</body>
</html>
================================================
FILE: coverage/lcov.info
================================================
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\di.ts
FNF:0
FNH:0
DA:1,4
DA:2,4
DA:3,4
DA:6,4
DA:7,4
DA:8,4
DA:9,4
DA:10,4
DA:12,4
DA:14,4
DA:18,4
DA:23,4
DA:27,4
DA:31,4
DA:36,4
LF:15
LH:15
BRF:0
BRH:0
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\components\Product.vue
FN:29,(anonymous_1)
FN:36,(anonymous_2)
FN:38,(anonymous_3)
FNF:3
FNH:1
FNDA:3,(anonymous_1)
FNDA:0,(anonymous_2)
FNDA:0,(anonymous_3)
DA:19,2
DA:20,2
DA:30,3
DA:37,0
DA:38,0
DA:40,0
LF:6
LH:3
BRF:0
BRH:0
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\components\ProductList.vue
FN:23,(anonymous_1)
FN:27,(anonymous_2)
FN:32,(anonymous_3)
FNF:3
FNH:3
FNDA:1,(anonymous_1)
FNDA:1,(anonymous_2)
FNDA:1,(anonymous_3)
DA:11,1
DA:12,1
DA:13,1
DA:14,1
DA:24,1
DA:28,1
DA:33,1
LF:7
LH:7
BRF:0
BRH:0
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\store\cart.ts
FN:19,(anonymous_0)
FN:23,(anonymous_1)
FN:24,(anonymous_2)
FN:27,(anonymous_3)
FN:29,(anonymous_4)
FN:35,(anonymous_5)
FN:36,(anonymous_6)
FN:45,(anonymous_7)
FNF:8
FNH:4
FNDA:3,(anonymous_0)
FNDA:0,(anonymous_1)
FNDA:0,(anonymous_2)
FNDA:0,(anonymous_3)
FNDA:0,(anonymous_4)
FNDA:4,(anonymous_5)
FNDA:2,(anonymous_6)
FNDA:4,(anonymous_7)
DA:1,3
DA:2,3
DA:19,3
DA:20,3
DA:21,3
DA:24,0
DA:28,0
DA:29,0
DA:35,3
DA:36,4
DA:37,4
DA:38,1
DA:40,3
DA:45,3
DA:46,4
DA:47,4
LF:16
LH:13
BRDA:37,0,0,1
BRDA:37,0,1,3
BRF:2
BRH:2
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\store\index.ts
FNF:0
FNH:0
DA:1,2
DA:2,2
DA:3,2
DA:4,2
DA:5,2
DA:7,2
DA:14,2
DA:21,2
DA:22,2
DA:24,2
LF:10
LH:10
BRF:0
BRH:0
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\app\store\product.ts
FN:15,(anonymous_0)
FN:21,(anonymous_1)
FN:26,(anonymous_2)
FNF:3
FNH:3
FNDA:3,(anonymous_0)
FNDA:4,(anonymous_1)
FNDA:2,(anonymous_2)
DA:1,3
DA:3,3
DA:15,3
DA:16,3
DA:18,3
DA:21,3
DA:22,4
DA:26,3
DA:27,2
DA:28,2
LF:10
LH:10
BRF:0
BRH:0
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\data\inMemoryRepository\cartRepository.ts
FN:7,(anonymous_0)
FN:10,(anonymous_1)
FN:14,(anonymous_2)
FN:20,(anonymous_3)
FN:24,(anonymous_4)
FNF:5
FNH:0
FNDA:0,(anonymous_0)
FNDA:0,(anonymous_1)
FNDA:0,(anonymous_2)
FNDA:0,(anonymous_3)
FNDA:0,(anonymous_4)
DA:1,4
DA:2,4
DA:3,4
DA:7,8
DA:8,0
DA:11,0
DA:12,0
DA:15,0
DA:21,0
DA:22,0
DA:24,0
LF:11
LH:4
BRF:0
BRH:0
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\data\inMemoryRepository\productRepository.ts
FN:11,(anonymous_0)
FN:37,(anonymous_1)
FN:39,(anonymous_2)
FNF:3
FNH:0
FNDA:0,(anonymous_0)
FNDA:0,(anonymous_1)
FNDA:0,(anonymous_2)
DA:1,4
DA:3,4
DA:5,4
DA:8,8
DA:12,0
DA:23,0
DA:24,0
DA:25,0
DA:26,0
DA:34,0
DA:38,0
DA:39,0
LF:12
LH:4
BRF:0
BRH:0
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\usecases\interactor\addItemToCart.ts
FN:12,(anonymous_0)
FN:17,(anonymous_1)
FNF:2
FNH:0
FNDA:0,(anonymous_0)
FNDA:0,(anonymous_1)
DA:2,4
DA:11,4
DA:13,0
DA:18,0
LF:4
LH:2
BRF:0
BRH:0
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\usecases\interactor\getAllProduct.ts
FN:12,(anonymous_0)
FN:16,(anonymous_1)
FNF:2
FNH:0
FNDA:0,(anonymous_0)
FNDA:0,(anonymous_1)
DA:3,4
DA:11,4
DA:13,0
DA:17,0
LF:4
LH:2
BRF:0
BRH:0
end_of_record
TN:
SF:C:\Users\B7911\Desktop\vue-shopping-clean-architecture\src\usecases\interactor\getTotalCartItem.ts
FN:11,(anonymous_0)
FN:16,(anonymous_1)
FNF:2
FNH:0
FNDA:0,(anonymous_0)
FNDA:0,(anonymous_1)
DA:2,4
DA:10,4
DA:12,0
DA:17,0
LF:4
LH:2
BRF:0
BRH:0
end_of_record
================================================
FILE: cypress.json
================================================
{
"pluginsFile": "tests/e2e/plugins/index.js"
}
================================================
FILE: jest.config.js
================================================
module.exports = {
preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel'
}
================================================
FILE: package.json
================================================
{
"name": "vue-shopping-clean-architecture",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit",
"test:e2e": "vue-cli-service test:e2e",
"lint": "vue-cli-service lint"
},
"dependencies": {
"@types/lodash": "^4.14.149",
"@types/sinon": "^7.5.2",
"core-js": "^3.6.4",
"inversify": "^5.0.1",
"inversify-inject-decorators": "^3.1.0",
"lodash": "^4.17.15",
"reflect-metadata": "^0.1.13",
"register-service-worker": "^1.6.2",
"sinon": "^9.0.0",
"vue": "^2.6.11",
"vue-property-decorator": "^8.4.0",
"vue-router": "^3.1.5",
"vuetify": "^2.2.11",
"vuex": "^3.1.2",
"vuex-module-decorators": "^0.16.1"
},
"devDependencies": {
"@types/jest": "^24.0.19",
"@typescript-eslint/eslint-plugin": "^2.18.0",
"@typescript-eslint/parser": "^2.18.0",
"@vue/cli-plugin-babel": "~4.2.0",
"@vue/cli-plugin-e2e-cypress": "~4.2.0",
"@vue/cli-plugin-eslint": "~4.2.0",
"@vue/cli-plugin-pwa": "~4.2.0",
"@vue/cli-plugin-router": "~4.2.0",
"@vue/cli-plugin-typescript": "~4.2.0",
"@vue/cli-plugin-unit-jest": "~4.2.0",
"@vue/cli-plugin-vuex": "~4.2.0",
"@vue/cli-service": "~4.2.0",
"@vue/eslint-config-typescript": "^5.0.1",
"@vue/test-utils": "1.0.0-beta.31",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.1.2",
"sass": "^1.19.0",
"sass-loader": "^8.0.0",
"typescript": "~3.7.5",
"vue-cli-plugin-vuetify": "~2.0.5",
"vue-template-compiler": "^2.6.11",
"vuetify-loader": "^1.3.0"
}
}
================================================
FILE: public/index.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css">
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
================================================
FILE: public/robots.txt
================================================
User-agent: *
Disallow:
================================================
FILE: src/app/App.vue
================================================
<template>
<v-app>
<NavBar></NavBar>
<v-content>
<v-container fluid>
<router-view></router-view>
</v-container>
</v-content>
</v-app>
</template>
<script lang="ts">
import Vue from 'vue';
import NavBar from './components/NavBar.vue'
export default Vue.extend({
name: 'App',
components: {NavBar},
data: () => ({
//
}),
});
</script>
================================================
FILE: src/app/assets/app.css
================================================
* {
font-family: '-apple-system', 'HelveticaNeue', sans-serif;
}
================================================
FILE: src/app/components/CartPreview.vue
================================================
<template>
<v-menu offset-y>
<template v-slot:activator="{on}">
<v-btn color="success" v-on="on">
Checkout
<v-badge v-if="totalItem > 0" :content="totalItem" inline>
</v-badge>
</v-btn>
</template>
<v-card width="400">
<v-list>
<v-list-item>
<v-list-item-content>
<v-list-item-title class="headline font-weight-bold">Cart</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
<v-divider></v-divider>
<v-card-text v-if="carts.length > 0">
<v-list>
<v-list-item v-for="(item, idx) in carts" :key="idx">
<v-list-item-avatar>
<img :src="item.thumbnail">
</v-list-item-avatar>
<v-list-item-content>
<v-list-item-title>{{ item.name }}</v-list-item-title>
<v-list-item-subtitle>{{ item.quantity }} item{{ item.quantity > 1 ? 's' : '' }}</v-list-item-subtitle>
</v-list-item-content>
<v-list-item-action>
<v-btn icon small>
<v-icon>mdi-delete</v-icon>
</v-btn>
</v-list-item-action>
</v-list-item>
</v-list>
<v-card-actions>
<v-btn block color="primary" rounded @click="$route.name !== 'Checkout' && $router.push({name: 'Checkout'})">
Proceed to checkout
</v-btn>
</v-card-actions>
</v-card-text>
<v-card-text v-else>
<p>No item</p>
</v-card-text>
</v-card>
</v-menu>
</template>
<script lang="ts">
import Vue from 'vue'
import {getModule} from "vuex-module-decorators";
import {CartStore} from "@/app/store/cart";
import {Component} from "vue-property-decorator";
@Component
export default class CartPreview extends Vue {
get cartStore(): CartStore {
return getModule(CartStore, this.$store)
}
get totalItem() {
return this.cartStore.totalCartItem || 0;
}
get carts() {
return this.cartStore.items.map(cart => ({
thumbnail: cart.product.thumbnailUrl,
name: cart.product.name,
description: cart.product.description,
price: cart.product.price.toLocaleString(),
quantity: cart.quantity,
subtotal: (cart.quantity * cart.product.price).toLocaleString()
}))
}
}
</script>
================================================
FILE: src/app/components/NavBar.vue
================================================
<template>
<v-app-bar
app
color="blue-grey darken-2"
dark
elevation="1"
>
<v-toolbar-title>Vue shopping</v-toolbar-title>
<div class="mr-3"></div>
<v-btn @click="$route.name!=='Home' && $router.push({name: 'Home'})" text>Home</v-btn>
<v-spacer/>
<CartPreview></CartPreview>
</v-app-bar>
</template>
<script lang="ts">
import Vue from 'vue'
import CartPreview from "@/app/components/CartPreview.vue";
export default Vue.extend({
components: {CartPreview}
})
</script>
================================================
FILE: src/app/components/Product.vue
================================================
<template>
<v-card hover outlined>
<v-card-text>
<v-img height="200"
:src="product.thumbnailUrl"/>
<p class="mt-6 mb-0 title success--text">{{ product.name }}</p>
<p class="pink--text body-1">${{ product.price.toLocaleString() }}</p>
<p>{{ product.description }}</p>
<v-btn block color="success" @click="addToCart" :loading="loading">Add to cart</v-btn>
</v-card-text>
</v-card>
</template>
<script lang="ts">
import Vue from 'vue'
import {CartStore} from "@/app/store/cart";
import {getModule} from "vuex-module-decorators";
import {Component, Prop} from "vue-property-decorator";
import {Product} from "@/domain/entity";
@Component
export default class ProductComponent extends Vue {
@Prop({required: true}) product!: Product
loading = false
get cartStore(): CartStore {
return getModule(CartStore, this.$store)
}
addToCart() {
this.loading = true;
this.cartStore.addProductToCart({product: this.product, quantity: 1})
.finally(() => {
this.loading = false
})
}
}
</script>
================================================
FILE: src/app/components/ProductList.vue
================================================
<template>
<div>
<v-row>
<v-col :key="idx" md="4" sm="6" v-for="(item ,idx) in products" xs="12">
<Product class="my-5" :key="idx" :product="item"></Product>
</v-col>
</v-row>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import ProductComponent from "@/app/components/Product.vue";
import {ProductStore} from "@/app/store/product";
import {getModule} from "vuex-module-decorators";
import {Product} from "@/domain/entity";
import {Component} from "vue-property-decorator";
import {CartStore} from "@/app/store/cart";
@Component({
components: {
Product: ProductComponent
}
})
export default class ProductListComponent extends Vue {
loading = false
get productStore(): ProductStore {
return getModule(ProductStore, this.$store)
}
get products(): Product[] {
return this.productStore.items;
}
}
</script>
================================================
FILE: src/app/main.ts
================================================
import Vue from 'vue'
import App from './App.vue'
import './registerServiceWorker'
import router from './router'
import store from './store'
import vuetify from './plugins/vuetify';
import "./assets/app.css"
Vue.config.productionTip = false
new Vue({
router,
store,
// @ts-ignore
vuetify,
render: h => h(App)
}).$mount('#app')
================================================
FILE: src/app/plugins/vuetify.ts
================================================
import Vue from 'vue';
import Vuetify from 'vuetify/lib';
import 'vuetify/dist/vuetify.min.css'
Vue.use(Vuetify);
export default new Vuetify({});
================================================
FILE: src/app/registerServiceWorker.ts
================================================
/* eslint-disable no-console */
import {register} from 'register-service-worker'
if (process.env.NODE_ENV === 'production') {
register(`${process.env.BASE_URL}service-worker.js`, {
ready() {
console.log(
'App is being served from cache by a service worker.\n' +
'For more details, visit https://goo.gl/AFskqB'
)
},
registered() {
console.log('Service worker has been registered.')
},
cached() {
console.log('Content has been cached for offline use.')
},
updatefound() {
console.log('New content is downloading.')
},
updated() {
console.log('New content is available; please refresh.')
},
offline() {
console.log('No internet connection found. App is running in offline mode.')
},
error(error) {
console.error('Error during service worker registration:', error)
}
})
}
================================================
FILE: src/app/router/index.ts
================================================
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import Checkout from "@/app/views/Checkout.vue";
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/checkout',
name: 'Checkout',
component: Checkout
},
{
path: '/about',
name: 'About',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
================================================
FILE: src/app/shims-tsx.d.ts
================================================
import Vue, {VNode} from 'vue'
declare global {
namespace JSX {
// tslint:disable no-empty-interface
interface Element extends VNode {
}
// tslint:disable no-empty-interface
interface ElementClass extends Vue {
}
interface IntrinsicElements {
[elem: string]: any;
}
}
}
================================================
FILE: src/app/shims-vue.d.ts
================================================
declare module '*.vue' {
import Vue from 'vue'
export default Vue
}
declare module 'vuetify/lib'
================================================
FILE: src/app/store/cart.ts
================================================
import {lazyInject} from "@/di";
import {Action, Module, Mutation, VuexModule} from "vuex-module-decorators";
import {Cart, Product} from "@/domain/entity";
import {AddItemToCart} from "@/usecases/interactor/addItemToCart";
import {ProceedCheckout} from "@/usecases/interactor/proceedCheckout";
export interface CartState {
items: Cart[];
}
export interface AddProductToCartPayload {
product: Product;
quantity: number;
}
@Module({
name: "cart",
namespaced: true
})
export class CartStore extends VuexModule implements CartState {
public items: Cart[] = [];
@lazyInject("AddItemToCart") private addItemToCart!: AddItemToCart;
@lazyInject("ProceedCheckout") private proceedCheckout!: ProceedCheckout;
get totalCartItem(): number {
return this.items.reduce((acc, cart) => acc + cart.quantity, 0);
}
get totalAmount(): number {
return this.items.reduce(
(acc, item) => acc + item.quantity * item.product.price,
0
);
}
@Mutation
clearCart() {
this.items = []
}
@Mutation
addItem(cart: Cart) {
const idx = this.items.findIndex(c => c.product.id === cart.product.id);
if (idx >= 0) {
this.items[idx].quantity += cart.quantity;
} else {
this.items.push(cart);
}
}
@Action
async addProductToCart({product, quantity}: AddProductToCartPayload) {
await this.addItemToCart.execute(product, quantity).toPromise();
this.addItem({
product: product,
quantity: quantity
} as Cart);
}
@Action
async checkout() {
await this.proceedCheckout.execute().toPromise();
this.clearCart()
}
}
================================================
FILE: src/app/store/index.ts
================================================
import Vue from "vue";
import Vuex from "vuex";
import {ProductState, ProductStore} from "./product";
import {CartState, CartStore} from "./cart";
import {getModule} from "vuex-module-decorators";
Vue.use(Vuex);
export interface RootState {
product: ProductState;
cart: CartState;
}
const store = new Vuex.Store<RootState>({
modules: {
product: ProductStore,
cart: CartStore
}
});
export default store;
================================================
FILE: src/app/store/product.ts
================================================
import { lazyInject } from "@/di";
import { Action, Module, Mutation, VuexModule } from "vuex-module-decorators";
import { Product } from "@/domain/entity";
import { GetAllProduct } from "@/usecases/interactor/getAllProduct";
export interface ProductState {
items: Product[];
}
@Module({
name: "product",
namespaced: true
})
export class ProductStore extends VuexModule implements ProductState {
public items: Product[] = [];
@lazyInject("GetAllProduct") private getAllProduct!: GetAllProduct;
@Mutation
setItems(items: Product[]) {
this.items = items;
}
@Action
async fetchItems() {
const list = await this.getAllProduct.execute().toPromise();
this.setItems(list);
}
}
================================================
FILE: src/app/views/About.vue
================================================
<template>
<div class="about">
<h1>This is an about page</h1>
</div>
</template>
================================================
FILE: src/app/views/Checkout.vue
================================================
<template>
<div>
<v-card v-if="!success">
<v-data-table
:items="carts"
:headers="headers"
hide-default-footer
>
<template v-slot:item.thumbnailUrl="{item}">
<v-img width="60" :src="item.thumbnailUrl"></v-img>
</template>
<template v-slot:item.product="{item}">
<div class="d-flex flex-column py-3 ">
<span class="title success--text">{{ item.product }}</span>
<span class="subtitle-2">{{ item.description }}</span>
</div>
</template>
</v-data-table>
<v-card-actions class="pa-4">
<v-btn @click="$router.push({name: 'Home'})">Continue shopping</v-btn>
<v-spacer/>
<v-btn class="px-4" color="primary" @click="checkout">Confirm</v-btn>
</v-card-actions>
</v-card>
<p class="text-center" v-else>Your order has been made and will be proceeded soon.</p>
</div>
</template>
<script lang="ts">
import {CartStore} from "@/app/store/cart";
import {getModule} from "vuex-module-decorators";
import {Component, Vue} from "vue-property-decorator";
@Component
export default class Checkout extends Vue {
headers = [
{value: "thumbnailUrl", width: 50, class: "title"},
{value: "product", text: "Product", width: 300, class: "header"},
{value: "quantity", text: "Quantity", class: "header"},
{value: "price", text: "Price", class: "header"},
{value: "subtotal", text: "Subtotal", class: "header"},
]
success = false
get cartStore(): CartStore {
return getModule(CartStore, this.$store)
}
get carts() {
return this.cartStore.items.map(item => ({
thumbnailUrl: item.product.thumbnailUrl,
product: item.product.name,
description: item.product.description,
quantity: item.quantity,
price: `$${item.product.price.toLocaleString()}`,
subtotal: `$${(item.quantity * item.product.price).toLocaleString()}`,
}))
}
async checkout() {
await this.cartStore.checkout()
this.success = true
}
}
</script>
<style>
.header {
font-size: 0.9em !important;
}
</style>
================================================
FILE: src/app/views/Home.vue
================================================
<template>
<div class="home">
<ProductList></ProductList>
</div>
</template>
<script lang="ts">
import ProductList from "@/app/components/ProductList.vue" ;
import {ProductStore} from "@/app/store/product";
import {getModule} from "vuex-module-decorators";
import {Component, Vue} from "vue-property-decorator";
@Component({
components: {ProductList}
})
export default class Home extends Vue {
get productStore(): ProductStore {
return getModule(ProductStore, this.$store)
}
created() {
this.productStore.fetchItems()
}
}
</script>
================================================
FILE: src/data/inMemoryRepository/cartRepository.ts
================================================
import {Observable, of} from "rxjs";
import {tap, map} from "rxjs/operators";
import {injectable} from "inversify";
import {Cart, Product} from "@/domain/entity";
import CartRepository from "@/usecases/repository/cartRepository";
@injectable()
export default class CartRepositoryImpl implements CartRepository {
private _carts: Cart[] = [];
public addItemToCart(product: Product, quantity: number): Observable<void> {
this._carts.push({product, quantity});
return of(1).pipe(
// delay(1000),
map(() => {
return;
})
);
}
public getTotalCartItem(): Observable<number> {
const val = this._carts.length;
return of(null).pipe(
// delay(1000),
map(() => val)
);
}
proceedCheckout(): Observable<void> {
return of(null).pipe(
tap(() => {
this._carts = []
}),
map(() => {
return
})
);
}
}
================================================
FILE: src/data/inMemoryRepository/productRepository.ts
================================================
import {Observable, of} from "rxjs";
import {injectable} from "inversify";
import {Product} from "@/domain/entity";
import {map} from "rxjs/operators";
@injectable()
export default class ProductRepositoryImpl {
readonly _products: Product[];
constructor() {
const _images = [
"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img1.jpg?raw=1",
"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img2.jpg?raw=1",
"https://www.dropbox.com/s/78fot6w894stu3n/img3.jpg?raw=1",
"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img4.jpg?raw=1",
"https://www.dropbox.com/s/d45c3pap1h4cu0y/img5.jpg?raw=1",
"https://www.dropbox.com/s/rjj1vtdx79xptu0/img6.jpeg?raw=1",
"https://www.dropbox.com/s/miym588nx2lscqt/img7.jpg?raw=1",
"https://www.dropbox.com/s/miym588nx2lscqt/img8.jpg?raw=1",
"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img9.jpg?raw=1",
]
const products = []
for (let i = 0; i < 20; i++) {
products.push({
id: `${i + 1}`,
name: `Product ${i + 1}`,
price: 2200,
thumbnailUrl: _images[Math.floor(Math.random() * (_images.length - 1))],
description: "3.0GHz Dual-core Haswell Intel Core i5 Turbo Boost up to 3.2 GHz, 3MB L3 cache 8GB (two 4GB SO-DIMMs..."
})
}
this._products = products
}
public getAll(): Observable<Product[]> {
return of(null).pipe(
map(() => this._products)
)
}
}
================================================
FILE: src/di.ts
================================================
import "reflect-metadata";
import {Container} from "inversify";
import getDecorators from "inversify-inject-decorators";
import CartRepository from "@/usecases/repository/cartRepository";
import ProductRepository from "@/usecases/repository/productRepository";
import CartRepositoryImpl from "@/data/inMemoryRepository/cartRepository";
import ProductRepositoryImpl from "@/data/inMemoryRepository/productRepository";
import {AddItemToCart, AddItemToCartImpl} from "@/usecases/interactor/addItemToCart";
import {GetAllProduct, GetAllProductImpl} from "@/usecases/interactor/getAllProduct";
import {GetTotalCartItem, GetTotalCartItemImpl} from "@/usecases/interactor/getTotalCartItem";
import {ProceedCheckout, ProceedCheckoutImpl} from "@/usecases/interactor/proceedCheckout";
import {ProductStore} from "@/app/store/product";
import {getModule} from "vuex-module-decorators";
const container = new Container();
container
.bind<CartRepository>("CartRepository")
.to(CartRepositoryImpl)
.inSingletonScope();
container
.bind<ProductRepository>("ProductRepository")
.to(ProductRepositoryImpl)
.inSingletonScope();
container
.bind<AddItemToCart>("AddItemToCart")
.to(AddItemToCartImpl)
.inSingletonScope();
container
.bind<GetAllProduct>("GetAllProduct")
.to(GetAllProductImpl)
.inSingletonScope();
container
.bind<GetTotalCartItem>("GetTotalCartItem")
.to(GetTotalCartItemImpl)
.inSingletonScope();
container
.bind<ProceedCheckout>("ProceedCheckout")
.to(ProceedCheckoutImpl)
.inSingletonScope();
const {lazyInject} = getDecorators(container);
export {lazyInject, container};
================================================
FILE: s
gitextract_4fmq2k0l/ ├── .browserslistrc ├── .eslintrc.js ├── .gitignore ├── .travis.yml ├── README.md ├── babel.config.js ├── coverage/ │ ├── clover.xml │ ├── coverage-final.json │ ├── lcov-report/ │ │ ├── base.css │ │ ├── block-navigation.js │ │ ├── index.html │ │ ├── prettify.css │ │ ├── prettify.js │ │ ├── sorter.js │ │ └── src/ │ │ ├── app/ │ │ │ ├── components/ │ │ │ │ ├── Product.vue.html │ │ │ │ ├── ProductList.vue.html │ │ │ │ └── index.html │ │ │ └── store/ │ │ │ ├── cart.ts.html │ │ │ ├── index.html │ │ │ ├── index.ts.html │ │ │ └── product.ts.html │ │ ├── data/ │ │ │ └── inMemoryRepository/ │ │ │ ├── cartRepository.ts.html │ │ │ ├── index.html │ │ │ └── productRepository.ts.html │ │ ├── di.ts.html │ │ ├── index.html │ │ └── usecases/ │ │ └── interactor/ │ │ ├── addItemToCart.ts.html │ │ ├── getAllProduct.ts.html │ │ ├── getTotalCartItem.ts.html │ │ └── index.html │ └── lcov.info ├── cypress.json ├── jest.config.js ├── package.json ├── public/ │ ├── index.html │ └── robots.txt ├── src/ │ ├── app/ │ │ ├── App.vue │ │ ├── assets/ │ │ │ └── app.css │ │ ├── components/ │ │ │ ├── CartPreview.vue │ │ │ ├── NavBar.vue │ │ │ ├── Product.vue │ │ │ └── ProductList.vue │ │ ├── main.ts │ │ ├── plugins/ │ │ │ └── vuetify.ts │ │ ├── registerServiceWorker.ts │ │ ├── router/ │ │ │ └── index.ts │ │ ├── shims-tsx.d.ts │ │ ├── shims-vue.d.ts │ │ ├── store/ │ │ │ ├── cart.ts │ │ │ ├── index.ts │ │ │ └── product.ts │ │ └── views/ │ │ ├── About.vue │ │ ├── Checkout.vue │ │ └── Home.vue │ ├── data/ │ │ └── inMemoryRepository/ │ │ ├── cartRepository.ts │ │ └── productRepository.ts │ ├── di.ts │ ├── domain/ │ │ └── entity/ │ │ └── index.ts │ ├── main.ts │ └── usecases/ │ ├── interactor/ │ │ ├── addItemToCart.ts │ │ ├── getAllProduct.ts │ │ ├── getTotalCartItem.ts │ │ └── proceedCheckout.ts │ └── repository/ │ ├── cartRepository.ts │ └── productRepository.ts ├── tests/ │ ├── e2e/ │ │ ├── .eslintrc.js │ │ ├── plugins/ │ │ │ └── index.js │ │ ├── specs/ │ │ │ └── test.js │ │ └── support/ │ │ ├── commands.js │ │ └── index.js │ └── unit/ │ ├── components/ │ │ ├── Product.spec.ts │ │ └── ProductList.spec.ts │ └── store/ │ ├── cart.spec.ts │ └── product.spec.ts ├── tsconfig.json └── vue.config.js
SYMBOL INDEX (82 symbols across 19 files)
FILE: coverage/lcov-report/block-navigation.js
function toggleClass (line 24) | function toggleClass(index) {
function makeCurrent (line 31) | function makeCurrent(index) {
function goToPrevious (line 41) | function goToPrevious() {
function goToNext (line 52) | function goToNext() {
FILE: coverage/lcov-report/prettify.js
function k (line 2) | function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V...
function a (line 2) | function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];v...
function B (line 2) | function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T....
function o (line 2) | function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){...
function g (line 2) | function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];...
function i (line 2) | function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\...
function Q (line 2) | function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac...
function D (line 2) | function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;...
function c (line 2) | function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnPrope...
function q (line 2) | function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default...
function d (line 2) | function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.so...
function y (line 2) | function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U...
function b (line 2) | function b(ad){function Y(af){return document.getElementsByTagName(af)}v...
FILE: coverage/lcov-report/sorter.js
function getTable (line 11) | function getTable() {
function getTableHeader (line 15) | function getTableHeader() {
function getTableBody (line 19) | function getTableBody() {
function getNthColumn (line 23) | function getNthColumn(n) {
function loadColumns (line 28) | function loadColumns() {
function loadRowData (line 53) | function loadRowData(tableRow) {
function loadData (line 72) | function loadData() {
function sortByIndex (line 81) | function sortByIndex(index, desc) {
function removeSortIndicators (line 112) | function removeSortIndicators() {
function addSortIndicators (line 120) | function addSortIndicators() {
function enableUI (line 126) | function enableUI() {
FILE: src/app/registerServiceWorker.ts
method ready (line 7) | ready() {
method registered (line 13) | registered() {
method cached (line 16) | cached() {
method updatefound (line 19) | updatefound() {
method updated (line 22) | updated() {
method offline (line 25) | offline() {
method error (line 28) | error(error) {
FILE: src/app/shims-tsx.d.ts
type Element (line 6) | interface Element extends VNode {
type ElementClass (line 10) | interface ElementClass extends Vue {
type IntrinsicElements (line 13) | interface IntrinsicElements {
FILE: src/app/store/cart.ts
type CartState (line 7) | interface CartState {
type AddProductToCartPayload (line 11) | interface AddProductToCartPayload {
class CartStore (line 20) | class CartStore extends VuexModule implements CartState {
method totalCartItem (line 25) | get totalCartItem(): number {
method totalAmount (line 29) | get totalAmount(): number {
method clearCart (line 37) | clearCart() {
method addItem (line 42) | addItem(cart: Cart) {
method addProductToCart (line 52) | async addProductToCart({product, quantity}: AddProductToCartPayload) {
method checkout (line 61) | async checkout() {
FILE: src/app/store/index.ts
type RootState (line 9) | interface RootState {
FILE: src/app/store/product.ts
type ProductState (line 7) | interface ProductState {
class ProductStore (line 15) | class ProductStore extends VuexModule implements ProductState {
method setItems (line 21) | setItems(items: Product[]) {
method fetchItems (line 26) | async fetchItems() {
FILE: src/data/inMemoryRepository/cartRepository.ts
class CartRepositoryImpl (line 8) | class CartRepositoryImpl implements CartRepository {
method addItemToCart (line 11) | public addItemToCart(product: Product, quantity: number): Observable<v...
method getTotalCartItem (line 21) | public getTotalCartItem(): Observable<number> {
method proceedCheckout (line 29) | proceedCheckout(): Observable<void> {
FILE: src/data/inMemoryRepository/productRepository.ts
class ProductRepositoryImpl (line 8) | class ProductRepositoryImpl {
method constructor (line 11) | constructor() {
method getAll (line 36) | public getAll(): Observable<Product[]> {
FILE: src/domain/entity/index.ts
type Product (line 1) | interface Product {
type Cart (line 9) | interface Cart {
FILE: src/usecases/interactor/addItemToCart.ts
type AddItemToCart (line 6) | interface AddItemToCart {
class AddItemToCartImpl (line 11) | class AddItemToCartImpl implements AddItemToCart {
method constructor (line 12) | constructor(
method execute (line 17) | execute(product: Product, quantity: number): Observable<void> {
FILE: src/usecases/interactor/getAllProduct.ts
type GetAllProduct (line 6) | interface GetAllProduct {
class GetAllProductImpl (line 11) | class GetAllProductImpl implements GetAllProduct {
method constructor (line 12) | constructor(
method execute (line 16) | execute(): Observable<Product[]> {
FILE: src/usecases/interactor/getTotalCartItem.ts
type GetTotalCartItem (line 5) | interface GetTotalCartItem {
class GetTotalCartItemImpl (line 10) | class GetTotalCartItemImpl implements GetTotalCartItem {
method constructor (line 11) | constructor(
method execute (line 16) | execute(): Observable<number> {
FILE: src/usecases/interactor/proceedCheckout.ts
type ProceedCheckout (line 5) | interface ProceedCheckout {
class ProceedCheckoutImpl (line 10) | class ProceedCheckoutImpl implements ProceedCheckout {
method constructor (line 11) | constructor(
method execute (line 16) | execute(): Observable<void> {
FILE: src/usecases/repository/cartRepository.ts
type CartRepository (line 4) | interface CartRepository {
FILE: src/usecases/repository/productRepository.ts
type ProductRepository (line 4) | interface ProductRepository {
FILE: tests/unit/store/cart.spec.ts
class MockAddItemToCart (line 15) | @injectable()
FILE: tests/unit/store/product.spec.ts
class MockGetAllProduct (line 14) | @injectable()
method execute (line 16) | execute(): import("rxjs").Observable<
Condensed preview — 76 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (226K chars).
[
{
"path": ".browserslistrc",
"chars": 21,
"preview": "> 1%\nlast 2 versions\n"
},
{
"path": ".eslintrc.js",
"chars": 709,
"preview": "module.exports = {\n root: true,\n env: {\n node: true\n },\n 'extends': [\n 'plugin:vue/essential',\n 'eslint:rec"
},
{
"path": ".gitignore",
"chars": 258,
"preview": ".DS_Store\nnode_modules\n/dist\n\n/tests/e2e/videos/\n/tests/e2e/screenshots/\n\n# local env files\n.env.local\n.env.*.local\n\n# L"
},
{
"path": ".travis.yml",
"chars": 92,
"preview": "language: node_js\nnode_js:\n - 12\n\ninstall: yarn\n\nscript:\n - yarn build\n - yarn test:unit\n"
},
{
"path": "README.md",
"chars": 1371,
"preview": "# Clean Architecture VueJS\n\nClean architecture with vue, shopping cart demo\n\n[Demo](https://thanhchungbtc.github.io/vue-"
},
{
"path": "babel.config.js",
"chars": 73,
"preview": "module.exports = {\n presets: [\n '@vue/cli-plugin-babel/preset'\n ]\n}\n"
},
{
"path": "coverage/clover.xml",
"chars": 8964,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<coverage generated=\"1582785406033\" clover=\"3.2.0\">\n <project timestamp=\"1582785"
},
{
"path": "coverage/coverage-final.json",
"chars": 16752,
"preview": "{\"C:\\\\Users\\\\B7911\\\\Desktop\\\\vue-shopping-clean-architecture\\\\src\\\\di.ts\": {\"path\":\"C:\\\\Users\\\\B7911\\\\Desktop\\\\vue-shopp"
},
{
"path": "coverage/lcov-report/base.css",
"chars": 5394,
"preview": "body, html {\n margin:0; padding: 0;\n height: 100%;\n}\nbody {\n font-family: Helvetica Neue, Helvetica, Arial;\n fon"
},
{
"path": "coverage/lcov-report/block-navigation.js",
"chars": 2387,
"preview": "/* eslint-disable */\nvar jumpToCode = (function init() {\n // Classes of code we would like to highlight in the file v"
},
{
"path": "coverage/lcov-report/index.html",
"chars": 6953,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for All files</title>\n <meta charset=\"utf-8"
},
{
"path": "coverage/lcov-report/prettify.css",
"chars": 676,
"preview": ".pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,"
},
{
"path": "coverage/lcov-report/prettify.js",
"chars": 17590,
"preview": "/* eslint-disable */\nwindow.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=[\"break,continue,do,else,for,if,return,whi"
},
{
"path": "coverage/lcov-report/sorter.js",
"chars": 5278,
"preview": "/* eslint-disable */\nvar addSorting = (function() {\n 'use strict';\n var cols,\n currentSort = {\n "
},
{
"path": "coverage/lcov-report/src/app/components/Product.vue.html",
"chars": 8289,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/app/components/Product.vue</title>\n "
},
{
"path": "coverage/lcov-report/src/app/components/ProductList.vue.html",
"chars": 7148,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/app/components/ProductList.vue</title>"
},
{
"path": "coverage/lcov-report/src/app/components/index.html",
"chars": 4917,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/app/components</title>\n <meta chars"
},
{
"path": "coverage/lcov-report/src/app/store/cart.ts.html",
"chars": 9392,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/app/store/cart.ts</title>\n <meta ch"
},
{
"path": "coverage/lcov-report/src/app/store/index.html",
"chars": 5569,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/app/store</title>\n <meta charset=\"u"
},
{
"path": "coverage/lcov-report/src/app/store/index.ts.html",
"chars": 5589,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/app/store/index.ts</title>\n <meta c"
},
{
"path": "coverage/lcov-report/src/app/store/product.ts.html",
"chars": 6307,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/app/store/product.ts</title>\n <meta"
},
{
"path": "coverage/lcov-report/src/data/inMemoryRepository/cartRepository.ts.html",
"chars": 6746,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/data/inMemoryRepository/cartRepository"
},
{
"path": "coverage/lcov-report/src/data/inMemoryRepository/index.html",
"chars": 4944,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/data/inMemoryRepository</title>\n <m"
},
{
"path": "coverage/lcov-report/src/data/inMemoryRepository/productRepository.ts.html",
"chars": 8927,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/data/inMemoryRepository/productReposit"
},
{
"path": "coverage/lcov-report/src/di.ts.html",
"chars": 7463,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/di.ts</title>\n <meta charset=\"utf-8"
},
{
"path": "coverage/lcov-report/src/index.html",
"chars": 4142,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src</title>\n <meta charset=\"utf-8\" />\n "
},
{
"path": "coverage/lcov-report/src/usecases/interactor/addItemToCart.ts.html",
"chars": 5586,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/usecases/interactor/addItemToCart.ts</"
},
{
"path": "coverage/lcov-report/src/usecases/interactor/getAllProduct.ts.html",
"chars": 5424,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/usecases/interactor/getAllProduct.ts</"
},
{
"path": "coverage/lcov-report/src/usecases/interactor/getTotalCartItem.ts.html",
"chars": 5389,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/usecases/interactor/getTotalCartItem.t"
},
{
"path": "coverage/lcov-report/src/usecases/interactor/index.html",
"chars": 5602,
"preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n <title>Code coverage report for src/usecases/interactor</title>\n <meta "
},
{
"path": "coverage/lcov.info",
"chars": 3648,
"preview": "TN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\di.ts\nFNF:0\nFNH:0\nDA:1,4\nDA:2,4\nDA:3,4\nDA:6,4\nDA:7,4\nD"
},
{
"path": "cypress.json",
"chars": 50,
"preview": "{\n \"pluginsFile\": \"tests/e2e/plugins/index.js\"\n}\n"
},
{
"path": "jest.config.js",
"chars": 88,
"preview": "module.exports = {\n preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel'\n}\n"
},
{
"path": "package.json",
"chars": 1650,
"preview": "{\n \"name\": \"vue-shopping-clean-architecture\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"scripts\": {\n \"serve\": \"vue"
},
{
"path": "public/index.html",
"chars": 832,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "public/robots.txt",
"chars": 24,
"preview": "User-agent: *\nDisallow:\n"
},
{
"path": "src/app/App.vue",
"chars": 403,
"preview": "<template>\n <v-app>\n <NavBar></NavBar>\n <v-content>\n <v-container fluid>\n <router-view></router-view>"
},
{
"path": "src/app/assets/app.css",
"chars": 68,
"preview": "* {\n font-family: '-apple-system', 'HelveticaNeue', sans-serif;\n}"
},
{
"path": "src/app/components/CartPreview.vue",
"chars": 2398,
"preview": "<template>\n <v-menu offset-y>\n <template v-slot:activator=\"{on}\">\n <v-btn color=\"success\" v-on=\"on\">\n Ch"
},
{
"path": "src/app/components/NavBar.vue",
"chars": 535,
"preview": "<template>\n <v-app-bar\n app\n color=\"blue-grey darken-2\"\n dark\n elevation=\"1\"\n >\n\n <v-toolbar-ti"
},
{
"path": "src/app/components/Product.vue",
"chars": 1124,
"preview": "<template>\n <v-card hover outlined>\n <v-card-text>\n\n <v-img height=\"200\"\n :src=\"product.thumbnailUr"
},
{
"path": "src/app/components/ProductList.vue",
"chars": 921,
"preview": "<template>\n <div>\n <v-row>\n <v-col :key=\"idx\" md=\"4\" sm=\"6\" v-for=\"(item ,idx) in products\" xs=\"12\">\n <P"
},
{
"path": "src/app/main.ts",
"chars": 339,
"preview": "import Vue from 'vue'\nimport App from './App.vue'\nimport './registerServiceWorker'\nimport router from './router'\nimport "
},
{
"path": "src/app/plugins/vuetify.ts",
"chars": 148,
"preview": "import Vue from 'vue';\nimport Vuetify from 'vuetify/lib';\nimport 'vuetify/dist/vuetify.min.css'\n\nVue.use(Vuetify);\n\nexpo"
},
{
"path": "src/app/registerServiceWorker.ts",
"chars": 894,
"preview": "/* eslint-disable no-console */\n\nimport {register} from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'product"
},
{
"path": "src/app/router/index.ts",
"chars": 729,
"preview": "import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport Home from '../views/Home.vue'\nimport Checkout from \"@/ap"
},
{
"path": "src/app/shims-tsx.d.ts",
"chars": 315,
"preview": "import Vue, {VNode} from 'vue'\n\ndeclare global {\n namespace JSX {\n // tslint:disable no-empty-interface\n interfac"
},
{
"path": "src/app/shims-vue.d.ts",
"chars": 100,
"preview": "declare module '*.vue' {\n import Vue from 'vue'\n export default Vue\n}\ndeclare module 'vuetify/lib'"
},
{
"path": "src/app/store/cart.ts",
"chars": 1675,
"preview": "import {lazyInject} from \"@/di\";\r\nimport {Action, Module, Mutation, VuexModule} from \"vuex-module-decorators\";\r\nimport {"
},
{
"path": "src/app/store/index.ts",
"chars": 444,
"preview": "import Vue from \"vue\";\r\nimport Vuex from \"vuex\";\r\nimport {ProductState, ProductStore} from \"./product\";\r\nimport {CartSta"
},
{
"path": "src/app/store/product.ts",
"chars": 740,
"preview": "import { lazyInject } from \"@/di\";\r\n\r\nimport { Action, Module, Mutation, VuexModule } from \"vuex-module-decorators\";\r\nim"
},
{
"path": "src/app/views/About.vue",
"chars": 89,
"preview": "<template>\n <div class=\"about\">\n <h1>This is an about page</h1>\n </div>\n</template>\n"
},
{
"path": "src/app/views/Checkout.vue",
"chars": 2191,
"preview": "<template>\n <div>\n\n <v-card v-if=\"!success\">\n <v-data-table\n :items=\"carts\"\n :headers=\"header"
},
{
"path": "src/app/views/Home.vue",
"chars": 591,
"preview": "<template>\n <div class=\"home\">\n <ProductList></ProductList>\n </div>\n</template>\n\n<script lang=\"ts\">\n import Produc"
},
{
"path": "src/data/inMemoryRepository/cartRepository.ts",
"chars": 947,
"preview": "import {Observable, of} from \"rxjs\";\r\nimport {tap, map} from \"rxjs/operators\";\r\nimport {injectable} from \"inversify\";\r\ni"
},
{
"path": "src/data/inMemoryRepository/productRepository.ts",
"chars": 1460,
"preview": "import {Observable, of} from \"rxjs\";\r\n\r\nimport {injectable} from \"inversify\";\r\nimport {Product} from \"@/domain/entity\";\r"
},
{
"path": "src/di.ts",
"chars": 1656,
"preview": "import \"reflect-metadata\";\r\nimport {Container} from \"inversify\";\r\nimport getDecorators from \"inversify-inject-decorators"
},
{
"path": "src/domain/entity/index.ts",
"chars": 203,
"preview": "export interface Product {\r\n id?: string;\r\n name: string;\r\n price: number;\r\n description?: string;\r\n thumbnailUrl?:"
},
{
"path": "src/main.ts",
"chars": 19,
"preview": "import \"./app/main\""
},
{
"path": "src/usecases/interactor/addItemToCart.ts",
"chars": 613,
"preview": "import {Observable} from \"rxjs\";\r\nimport {inject, injectable} from \"inversify\";\r\nimport {Product} from \"@/domain/entity\""
},
{
"path": "src/usecases/interactor/getAllProduct.ts",
"chars": 542,
"preview": "import { Product } from \"@/domain/entity\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { inject, injectable } from \""
},
{
"path": "src/usecases/interactor/getTotalCartItem.ts",
"chars": 501,
"preview": "import {Observable} from \"rxjs\";\r\nimport {inject, injectable} from \"inversify\";\r\nimport CartRepository from \"@/usecases/"
},
{
"path": "src/usecases/interactor/proceedCheckout.ts",
"chars": 475,
"preview": "import {Observable} from \"rxjs\";\nimport {inject, injectable} from \"inversify\";\nimport CartRepository from \"@/usecases/re"
},
{
"path": "src/usecases/repository/cartRepository.ts",
"chars": 283,
"preview": "import {Observable} from \"rxjs\";\r\nimport {Product} from \"@/domain/entity\";\r\n\r\nexport default interface CartRepository {\r"
},
{
"path": "src/usecases/repository/productRepository.ts",
"chars": 163,
"preview": "import {Product} from \"@/domain/entity\";\r\nimport {Observable} from \"rxjs\";\r\n\r\nexport default interface ProductRepository"
},
{
"path": "tests/e2e/.eslintrc.js",
"chars": 145,
"preview": "module.exports = {\n plugins: [\n 'cypress'\n ],\n env: {\n mocha: true,\n 'cypress/globals': true\n },\n rules: {"
},
{
"path": "tests/e2e/plugins/index.js",
"chars": 906,
"preview": "/* eslint-disable arrow-body-style */\n// https://docs.cypress.io/guides/guides/plugins-guide.html\n\n// if you need a cust"
},
{
"path": "tests/e2e/specs/test.js",
"chars": 219,
"preview": "// https://docs.cypress.io/api/introduction/api.html\n\ndescribe('My First Test', () => {\n it('Visits the app root url', "
},
{
"path": "tests/e2e/support/commands.js",
"chars": 841,
"preview": "// ***********************************************\n// This example commands.js shows you how to\n// create various custom"
},
{
"path": "tests/e2e/support/index.js",
"chars": 670,
"preview": "// ***********************************************************\n// This example support/index.js is processed and\n// load"
},
{
"path": "tests/unit/components/Product.spec.ts",
"chars": 626,
"preview": "import ProductComponent from \"@/app/components/Product.vue\";\nimport Vue from 'vue'\n\nimport { shallowMount, mount, create"
},
{
"path": "tests/unit/components/ProductList.spec.ts",
"chars": 1316,
"preview": "import ProductComponent from '@/app/components/Product.vue';\nimport ProductList from \"@/app/components/ProductList.vue\";"
},
{
"path": "tests/unit/store/cart.spec.ts",
"chars": 2653,
"preview": "import Vuex from \"vuex\";\nimport { createLocalVue } from \"@vue/test-utils\";\nimport { getModule } from \"vuex-module-decora"
},
{
"path": "tests/unit/store/product.spec.ts",
"chars": 2781,
"preview": "import { ProductStore } from \"./../../../src/app/store/product\";\nimport Vuex from \"vuex\";\nimport { createLocalVue } from"
},
{
"path": "tsconfig.json",
"chars": 758,
"preview": "{\n \"compilerOptions\": {\n \"experimentalDecorators\": true,\n \"target\": \"esnext\",\n \"module\": \"esnext\",\n \"strict"
},
{
"path": "vue.config.js",
"chars": 147,
"preview": "module.exports = {\n \"publicPath\": process.env.NODE_ENV === \"production\" ? \"/vue-shopping\" : \"/\",\n \"transpileDependenci"
}
]
About this extraction
This page contains the full source code of the thanhchungbtc/vue-shopping-clean-architecture GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 76 files (201.0 KB), approximately 64.9k tokens, and a symbol index with 82 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.