[
  {
    "path": ".browserslistrc",
    "content": "> 1%\nlast 2 versions\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  root: true,\n  env: {\n    node: true\n  },\n  'extends': [\n    'plugin:vue/essential',\n    'eslint:recommended',\n    '@vue/typescript/recommended'\n  ],\n  parserOptions: {\n    ecmaVersion: 2020\n  },\n  rules: {\n    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',\n    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',\n    '@typescript-eslint/ban-ts-ignore': 'off',\n    '@typescript-eslint/no-unused-vars': 'off',\n    '@typescript-eslint/no-empty-function': 'off',\n  },\n  overrides: [\n    {\n      files: [\n        '**/__tests__/*.{j,t}s?(x)',\n        '**/tests/unit/**/*.spec.{j,t}s?(x)'\n      ],\n      env: {\n        mocha: true\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".gitignore",
    "content": ".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# Log files\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Editor directories and files\n.idea\n.vscode\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - 12\n\ninstall: yarn\n\nscript:\n  - yarn build\n  - yarn test:unit\n"
  },
  {
    "path": "README.md",
    "content": "# Clean Architecture VueJS\n\nClean architecture with vue, shopping cart demo\n\n[Demo](https://thanhchungbtc.github.io/vue-shopping)\n\n![](https://travis-ci.org/thanhchungbtc/vue-shopping-clean-architecture.svg?branch=master)\n\n\n![](./github/screenshot1.png)\n![](./github/screenshot2.png)\n\n## Development\n```sh\nyarn serve\n```\n\n## Production\n```sh\nyarn build\n```\n\n## Unit test\n```sh\nyarn test:unit\n```\n\n## Description\nThis is an example of implementation of Clean Architecture in Vue\n\nIt has major of 4 layers:\n- Entity layer \n- Repository layer \n- Usecase layer\n- Application layer - where the ui happend\n\n ![](./github/clean-architecture.jpg)\n \n \n## Tools used\n- `inversify`\\\nDependency injection for typescript\n```ts\ncontainer\n  .bind<CartRepository>(\"CartRepository\")\n  .to(CartRepositoryImpl)\n  .inSingletonScope();\n```\nUsage\n```ts\nconstructor(\n    @inject(\"CartRepository\") private cartRepository: CartRepository\n) {}\n```\n\n- `vuetify`\\\nMaterial design ui library\n\n- `vuex-module-decorators`\\\nAccess `vuex` store in a type-safety way\n\nInstead of writing as\n```ts\nthis.$store.dispatch('cart/addProductToCart', {product: this.product, quantity: 1})\n```\nWe write\n```ts\nconst cartStore = getModule(CartStore, this.$store)\ncartStore.addProductToCart({product: this.product, quantity: 1})\n```\n\n \n\n## TODO\n- [x] In memory repository\n- [ ] Use pouchDB to persist user's cart data\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  presets: [\n    '@vue/cli-plugin-babel/preset'\n  ]\n}\n"
  },
  {
    "path": "coverage/clover.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<coverage generated=\"1582785406033\" clover=\"3.2.0\">\n  <project timestamp=\"1582785406034\" name=\"All files\">\n    <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\"/>\n    <package name=\"src\">\n      <metrics statements=\"15\" coveredstatements=\"15\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"0\" coveredmethods=\"0\"/>\n      <file name=\"di.ts\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\di.ts\">\n        <metrics statements=\"15\" coveredstatements=\"15\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"0\" coveredmethods=\"0\"/>\n        <line num=\"1\" count=\"4\" type=\"stmt\"/>\n        <line num=\"2\" count=\"4\" type=\"stmt\"/>\n        <line num=\"3\" count=\"4\" type=\"stmt\"/>\n        <line num=\"6\" count=\"4\" type=\"stmt\"/>\n        <line num=\"7\" count=\"4\" type=\"stmt\"/>\n        <line num=\"8\" count=\"4\" type=\"stmt\"/>\n        <line num=\"9\" count=\"4\" type=\"stmt\"/>\n        <line num=\"10\" count=\"4\" type=\"stmt\"/>\n        <line num=\"12\" count=\"4\" type=\"stmt\"/>\n        <line num=\"14\" count=\"4\" type=\"stmt\"/>\n        <line num=\"18\" count=\"4\" type=\"stmt\"/>\n        <line num=\"23\" count=\"4\" type=\"stmt\"/>\n        <line num=\"27\" count=\"4\" type=\"stmt\"/>\n        <line num=\"31\" count=\"4\" type=\"stmt\"/>\n        <line num=\"36\" count=\"4\" type=\"stmt\"/>\n      </file>\n    </package>\n    <package name=\"src.app.components\">\n      <metrics statements=\"13\" coveredstatements=\"10\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"6\" coveredmethods=\"4\"/>\n      <file name=\"Product.vue\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\components\\Product.vue\">\n        <metrics statements=\"6\" coveredstatements=\"3\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"3\" coveredmethods=\"1\"/>\n        <line num=\"19\" count=\"2\" type=\"stmt\"/>\n        <line num=\"20\" count=\"2\" type=\"stmt\"/>\n        <line num=\"30\" count=\"3\" type=\"stmt\"/>\n        <line num=\"37\" count=\"0\" type=\"stmt\"/>\n        <line num=\"38\" count=\"0\" type=\"stmt\"/>\n        <line num=\"40\" count=\"0\" type=\"stmt\"/>\n      </file>\n      <file name=\"ProductList.vue\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\components\\ProductList.vue\">\n        <metrics statements=\"7\" coveredstatements=\"7\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"3\" coveredmethods=\"3\"/>\n        <line num=\"11\" count=\"1\" type=\"stmt\"/>\n        <line num=\"12\" count=\"1\" type=\"stmt\"/>\n        <line num=\"13\" count=\"1\" type=\"stmt\"/>\n        <line num=\"14\" count=\"1\" type=\"stmt\"/>\n        <line num=\"24\" count=\"1\" type=\"stmt\"/>\n        <line num=\"28\" count=\"1\" type=\"stmt\"/>\n        <line num=\"33\" count=\"1\" type=\"stmt\"/>\n      </file>\n    </package>\n    <package name=\"src.app.store\">\n      <metrics statements=\"36\" coveredstatements=\"33\" conditionals=\"2\" coveredconditionals=\"2\" methods=\"11\" coveredmethods=\"7\"/>\n      <file name=\"cart.ts\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\cart.ts\">\n        <metrics statements=\"16\" coveredstatements=\"13\" conditionals=\"2\" coveredconditionals=\"2\" methods=\"8\" coveredmethods=\"4\"/>\n        <line num=\"1\" count=\"3\" type=\"stmt\"/>\n        <line num=\"2\" count=\"3\" type=\"stmt\"/>\n        <line num=\"19\" count=\"3\" type=\"stmt\"/>\n        <line num=\"20\" count=\"3\" type=\"stmt\"/>\n        <line num=\"21\" count=\"3\" type=\"stmt\"/>\n        <line num=\"24\" count=\"0\" type=\"stmt\"/>\n        <line num=\"28\" count=\"0\" type=\"stmt\"/>\n        <line num=\"29\" count=\"0\" type=\"stmt\"/>\n        <line num=\"35\" count=\"3\" type=\"stmt\"/>\n        <line num=\"36\" count=\"4\" type=\"stmt\"/>\n        <line num=\"37\" count=\"4\" type=\"cond\" truecount=\"2\" falsecount=\"0\"/>\n        <line num=\"38\" count=\"1\" type=\"stmt\"/>\n        <line num=\"40\" count=\"3\" type=\"stmt\"/>\n        <line num=\"45\" count=\"3\" type=\"stmt\"/>\n        <line num=\"46\" count=\"4\" type=\"stmt\"/>\n        <line num=\"47\" count=\"4\" type=\"stmt\"/>\n      </file>\n      <file name=\"index.ts\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\index.ts\">\n        <metrics statements=\"10\" coveredstatements=\"10\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"0\" coveredmethods=\"0\"/>\n        <line num=\"1\" count=\"2\" type=\"stmt\"/>\n        <line num=\"2\" count=\"2\" type=\"stmt\"/>\n        <line num=\"3\" count=\"2\" type=\"stmt\"/>\n        <line num=\"4\" count=\"2\" type=\"stmt\"/>\n        <line num=\"5\" count=\"2\" type=\"stmt\"/>\n        <line num=\"7\" count=\"2\" type=\"stmt\"/>\n        <line num=\"14\" count=\"2\" type=\"stmt\"/>\n        <line num=\"21\" count=\"2\" type=\"stmt\"/>\n        <line num=\"22\" count=\"2\" type=\"stmt\"/>\n        <line num=\"24\" count=\"2\" type=\"stmt\"/>\n      </file>\n      <file name=\"product.ts\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\product.ts\">\n        <metrics statements=\"10\" coveredstatements=\"10\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"3\" coveredmethods=\"3\"/>\n        <line num=\"1\" count=\"3\" type=\"stmt\"/>\n        <line num=\"3\" count=\"3\" type=\"stmt\"/>\n        <line num=\"15\" count=\"3\" type=\"stmt\"/>\n        <line num=\"16\" count=\"3\" type=\"stmt\"/>\n        <line num=\"18\" count=\"3\" type=\"stmt\"/>\n        <line num=\"21\" count=\"3\" type=\"stmt\"/>\n        <line num=\"22\" count=\"4\" type=\"stmt\"/>\n        <line num=\"26\" count=\"3\" type=\"stmt\"/>\n        <line num=\"27\" count=\"2\" type=\"stmt\"/>\n        <line num=\"28\" count=\"2\" type=\"stmt\"/>\n      </file>\n    </package>\n    <package name=\"src.data.inMemoryRepository\">\n      <metrics statements=\"23\" coveredstatements=\"8\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"8\" coveredmethods=\"0\"/>\n      <file name=\"cartRepository.ts\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\data\\inMemoryRepository\\cartRepository.ts\">\n        <metrics statements=\"11\" coveredstatements=\"4\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"5\" coveredmethods=\"0\"/>\n        <line num=\"1\" count=\"4\" type=\"stmt\"/>\n        <line num=\"2\" count=\"4\" type=\"stmt\"/>\n        <line num=\"3\" count=\"4\" type=\"stmt\"/>\n        <line num=\"7\" count=\"8\" type=\"stmt\"/>\n        <line num=\"8\" count=\"0\" type=\"stmt\"/>\n        <line num=\"11\" count=\"0\" type=\"stmt\"/>\n        <line num=\"12\" count=\"0\" type=\"stmt\"/>\n        <line num=\"15\" count=\"0\" type=\"stmt\"/>\n        <line num=\"21\" count=\"0\" type=\"stmt\"/>\n        <line num=\"22\" count=\"0\" type=\"stmt\"/>\n        <line num=\"24\" count=\"0\" type=\"stmt\"/>\n      </file>\n      <file name=\"productRepository.ts\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\data\\inMemoryRepository\\productRepository.ts\">\n        <metrics statements=\"12\" coveredstatements=\"4\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"3\" coveredmethods=\"0\"/>\n        <line num=\"1\" count=\"4\" type=\"stmt\"/>\n        <line num=\"3\" count=\"4\" type=\"stmt\"/>\n        <line num=\"5\" count=\"4\" type=\"stmt\"/>\n        <line num=\"8\" count=\"8\" type=\"stmt\"/>\n        <line num=\"12\" count=\"0\" type=\"stmt\"/>\n        <line num=\"23\" count=\"0\" type=\"stmt\"/>\n        <line num=\"24\" count=\"0\" type=\"stmt\"/>\n        <line num=\"25\" count=\"0\" type=\"stmt\"/>\n        <line num=\"26\" count=\"0\" type=\"stmt\"/>\n        <line num=\"34\" count=\"0\" type=\"stmt\"/>\n        <line num=\"38\" count=\"0\" type=\"stmt\"/>\n        <line num=\"39\" count=\"0\" type=\"stmt\"/>\n      </file>\n    </package>\n    <package name=\"src.usecases.interactor\">\n      <metrics statements=\"12\" coveredstatements=\"6\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"6\" coveredmethods=\"0\"/>\n      <file name=\"addItemToCart.ts\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\addItemToCart.ts\">\n        <metrics statements=\"4\" coveredstatements=\"2\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"2\" coveredmethods=\"0\"/>\n        <line num=\"2\" count=\"4\" type=\"stmt\"/>\n        <line num=\"11\" count=\"4\" type=\"stmt\"/>\n        <line num=\"13\" count=\"0\" type=\"stmt\"/>\n        <line num=\"18\" count=\"0\" type=\"stmt\"/>\n      </file>\n      <file name=\"getAllProduct.ts\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\getAllProduct.ts\">\n        <metrics statements=\"4\" coveredstatements=\"2\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"2\" coveredmethods=\"0\"/>\n        <line num=\"3\" count=\"4\" type=\"stmt\"/>\n        <line num=\"11\" count=\"4\" type=\"stmt\"/>\n        <line num=\"13\" count=\"0\" type=\"stmt\"/>\n        <line num=\"17\" count=\"0\" type=\"stmt\"/>\n      </file>\n      <file name=\"getTotalCartItem.ts\" path=\"C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\getTotalCartItem.ts\">\n        <metrics statements=\"4\" coveredstatements=\"2\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"2\" coveredmethods=\"0\"/>\n        <line num=\"2\" count=\"4\" type=\"stmt\"/>\n        <line num=\"10\" count=\"4\" type=\"stmt\"/>\n        <line num=\"12\" count=\"0\" type=\"stmt\"/>\n        <line num=\"17\" count=\"0\" type=\"stmt\"/>\n      </file>\n    </package>\n  </project>\n</coverage>\n"
  },
  {
    "path": "coverage/coverage-final.json",
    "content": "{\"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\":{}}\n,\"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\":{}}\n,\"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\":{}}\n,\"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]}}\n,\"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\":{}}\n,\"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\":{}}\n,\"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\":{}}\n,\"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\":{}}\n,\"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\":{}}\n,\"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\":{}}\n,\"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\":{}}\n}\n"
  },
  {
    "path": "coverage/lcov-report/base.css",
    "content": "body, html {\n  margin:0; padding: 0;\n  height: 100%;\n}\nbody {\n    font-family: Helvetica Neue, Helvetica, Arial;\n    font-size: 14px;\n    color:#333;\n}\n.small { font-size: 12px; }\n*, *:after, *:before {\n  -webkit-box-sizing:border-box;\n     -moz-box-sizing:border-box;\n          box-sizing:border-box;\n  }\nh1 { font-size: 20px; margin: 0;}\nh2 { font-size: 14px; }\npre {\n    font: 12px/1.4 Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n    margin: 0;\n    padding: 0;\n    -moz-tab-size: 2;\n    -o-tab-size:  2;\n    tab-size: 2;\n}\na { color:#0074D9; text-decoration:none; }\na:hover { text-decoration:underline; }\n.strong { font-weight: bold; }\n.space-top1 { padding: 10px 0 0 0; }\n.pad2y { padding: 20px 0; }\n.pad1y { padding: 10px 0; }\n.pad2x { padding: 0 20px; }\n.pad2 { padding: 20px; }\n.pad1 { padding: 10px; }\n.space-left2 { padding-left:55px; }\n.space-right2 { padding-right:20px; }\n.center { text-align:center; }\n.clearfix { display:block; }\n.clearfix:after {\n  content:'';\n  display:block;\n  height:0;\n  clear:both;\n  visibility:hidden;\n  }\n.fl { float: left; }\n@media only screen and (max-width:640px) {\n  .col3 { width:100%; max-width:100%; }\n  .hide-mobile { display:none!important; }\n}\n\n.quiet {\n  color: #7f7f7f;\n  color: rgba(0,0,0,0.5);\n}\n.quiet a { opacity: 0.7; }\n\n.fraction {\n  font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n  font-size: 10px;\n  color: #555;\n  background: #E8E8E8;\n  padding: 4px 5px;\n  border-radius: 3px;\n  vertical-align: middle;\n}\n\ndiv.path a:link, div.path a:visited { color: #333; }\ntable.coverage {\n  border-collapse: collapse;\n  margin: 10px 0 0 0;\n  padding: 0;\n}\n\ntable.coverage td {\n  margin: 0;\n  padding: 0;\n  vertical-align: top;\n}\ntable.coverage td.line-count {\n    text-align: right;\n    padding: 0 5px 0 20px;\n}\ntable.coverage td.line-coverage {\n    text-align: right;\n    padding-right: 10px;\n    min-width:20px;\n}\n\ntable.coverage td span.cline-any {\n    display: inline-block;\n    padding: 0 5px;\n    width: 100%;\n}\n.missing-if-branch {\n    display: inline-block;\n    margin-right: 5px;\n    border-radius: 3px;\n    position: relative;\n    padding: 0 4px;\n    background: #333;\n    color: yellow;\n}\n\n.skip-if-branch {\n    display: none;\n    margin-right: 10px;\n    position: relative;\n    padding: 0 4px;\n    background: #ccc;\n    color: white;\n}\n.missing-if-branch .typ, .skip-if-branch .typ {\n    color: inherit !important;\n}\n.coverage-summary {\n  border-collapse: collapse;\n  width: 100%;\n}\n.coverage-summary tr { border-bottom: 1px solid #bbb; }\n.keyline-all { border: 1px solid #ddd; }\n.coverage-summary td, .coverage-summary th { padding: 10px; }\n.coverage-summary tbody { border: 1px solid #bbb; }\n.coverage-summary td { border-right: 1px solid #bbb; }\n.coverage-summary td:last-child { border-right: none; }\n.coverage-summary th {\n  text-align: left;\n  font-weight: normal;\n  white-space: nowrap;\n}\n.coverage-summary th.file { border-right: none !important; }\n.coverage-summary th.pct { }\n.coverage-summary th.pic,\n.coverage-summary th.abs,\n.coverage-summary td.pct,\n.coverage-summary td.abs { text-align: right; }\n.coverage-summary td.file { white-space: nowrap;  }\n.coverage-summary td.pic { min-width: 120px !important;  }\n.coverage-summary tfoot td { }\n\n.coverage-summary .sorter {\n    height: 10px;\n    width: 7px;\n    display: inline-block;\n    margin-left: 0.5em;\n    background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;\n}\n.coverage-summary .sorted .sorter {\n    background-position: 0 -20px;\n}\n.coverage-summary .sorted-desc .sorter {\n    background-position: 0 -10px;\n}\n.status-line {  height: 10px; }\n/* yellow */\n.cbranch-no { background: yellow !important; color: #111; }\n/* dark red */\n.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }\n.low .chart { border:1px solid #C21F39 }\n.highlighted,\n.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{\n  background: #C21F39 !important;\n}\n/* medium red */\n.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }\n/* light red */\n.low, .cline-no { background:#FCE1E5 }\n/* light green */\n.high, .cline-yes { background:rgb(230,245,208) }\n/* medium green */\n.cstat-yes { background:rgb(161,215,106) }\n/* dark green */\n.status-line.high, .high .cover-fill { background:rgb(77,146,33) }\n.high .chart { border:1px solid rgb(77,146,33) }\n/* dark yellow (gold) */\n.status-line.medium, .medium .cover-fill { background: #f9cd0b; }\n.medium .chart { border:1px solid #f9cd0b; }\n/* light yellow */\n.medium { background: #fff4c2; }\n\n.cstat-skip { background: #ddd; color: #111; }\n.fstat-skip { background: #ddd; color: #111 !important; }\n.cbranch-skip { background: #ddd !important; color: #111; }\n\nspan.cline-neutral { background: #eaeaea; }\n\n.coverage-summary td.empty {\n    opacity: .5;\n    padding-top: 4px;\n    padding-bottom: 4px;\n    line-height: 1;\n    color: #888;\n}\n\n.cover-fill, .cover-empty {\n  display:inline-block;\n  height: 12px;\n}\n.chart {\n  line-height: 0;\n}\n.cover-empty {\n    background: white;\n}\n.cover-full {\n    border-right: none !important;\n}\npre.prettyprint {\n    border: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n.com { color: #999 !important; }\n.ignore-none { color: #999; font-weight: normal; }\n\n.wrapper {\n  min-height: 100%;\n  height: auto !important;\n  height: 100%;\n  margin: 0 auto -48px;\n}\n.footer, .push {\n  height: 48px;\n}\n"
  },
  {
    "path": "coverage/lcov-report/block-navigation.js",
    "content": "/* eslint-disable */\nvar jumpToCode = (function init() {\n    // Classes of code we would like to highlight in the file view\n    var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];\n\n    // Elements to highlight in the file listing view\n    var fileListingElements = ['td.pct.low'];\n\n    // We don't want to select elements that are direct descendants of another match\n    var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `\n\n    // Selecter that finds elements on the page to which we can jump\n    var selector =\n        fileListingElements.join(', ') +\n        ', ' +\n        notSelector +\n        missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`\n\n    // The NodeList of matching elements\n    var missingCoverageElements = document.querySelectorAll(selector);\n\n    var currentIndex;\n\n    function toggleClass(index) {\n        missingCoverageElements\n            .item(currentIndex)\n            .classList.remove('highlighted');\n        missingCoverageElements.item(index).classList.add('highlighted');\n    }\n\n    function makeCurrent(index) {\n        toggleClass(index);\n        currentIndex = index;\n        missingCoverageElements.item(index).scrollIntoView({\n            behavior: 'smooth',\n            block: 'center',\n            inline: 'center'\n        });\n    }\n\n    function goToPrevious() {\n        var nextIndex = 0;\n        if (typeof currentIndex !== 'number' || currentIndex === 0) {\n            nextIndex = missingCoverageElements.length - 1;\n        } else if (missingCoverageElements.length > 1) {\n            nextIndex = currentIndex - 1;\n        }\n\n        makeCurrent(nextIndex);\n    }\n\n    function goToNext() {\n        var nextIndex = 0;\n\n        if (\n            typeof currentIndex === 'number' &&\n            currentIndex < missingCoverageElements.length - 1\n        ) {\n            nextIndex = currentIndex + 1;\n        }\n\n        makeCurrent(nextIndex);\n    }\n\n    return function jump(event) {\n        switch (event.which) {\n            case 78: // n\n            case 74: // j\n                goToNext();\n                break;\n            case 66: // b\n            case 75: // k\n            case 80: // p\n                goToPrevious();\n                break;\n        }\n    };\n})();\nwindow.addEventListener('keydown', jumpToCode);\n"
  },
  {
    "path": "coverage/lcov-report/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for All files</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"prettify.css\" />\n    <link rel=\"stylesheet\" href=\"base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1>All files</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">73.39% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>80/109</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>2/2</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">35.48% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>11/31</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">72.73% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>72/99</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line medium'></div>\n    <div class=\"pad1\">\n<table class=\"coverage-summary\">\n<thead>\n<tr>\n   <th data-col=\"file\" data-fmt=\"html\" data-html=\"true\" class=\"file\">File</th>\n   <th data-col=\"pic\" data-type=\"number\" data-fmt=\"html\" data-html=\"true\" class=\"pic\"></th>\n   <th data-col=\"statements\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Statements</th>\n   <th data-col=\"statements_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"branches\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Branches</th>\n   <th data-col=\"branches_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"functions\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Functions</th>\n   <th data-col=\"functions_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"lines\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Lines</th>\n   <th data-col=\"lines_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n</tr>\n</thead>\n<tbody><tr>\n\t<td class=\"file high\" data-value=\"src\"><a href=\"src\\index.html\">src</a></td>\n\t<td data-value=\"100\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill cover-full\" style=\"width: 100%\"></div><div class=\"cover-empty\" style=\"width: 0%\"></div></div>\n\t</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"15\" class=\"abs high\">15/15</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"15\" class=\"abs high\">15/15</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file medium\" data-value=\"src/app/components\"><a href=\"src\\app\\components\\index.html\">src/app/components</a></td>\n\t<td data-value=\"76.92\" class=\"pic medium\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 76%\"></div><div class=\"cover-empty\" style=\"width: 24%\"></div></div>\n\t</td>\n\t<td data-value=\"76.92\" class=\"pct medium\">76.92%</td>\n\t<td data-value=\"13\" class=\"abs medium\">10/13</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"66.67\" class=\"pct medium\">66.67%</td>\n\t<td data-value=\"6\" class=\"abs medium\">4/6</td>\n\t<td data-value=\"76.92\" class=\"pct medium\">76.92%</td>\n\t<td data-value=\"13\" class=\"abs medium\">10/13</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file high\" data-value=\"src/app/store\"><a href=\"src\\app\\store\\index.html\">src/app/store</a></td>\n\t<td data-value=\"90\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 90%\"></div><div class=\"cover-empty\" style=\"width: 10%\"></div></div>\n\t</td>\n\t<td data-value=\"90\" class=\"pct high\">90%</td>\n\t<td data-value=\"40\" class=\"abs high\">36/40</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"2\" class=\"abs high\">2/2</td>\n\t<td data-value=\"63.64\" class=\"pct medium\">63.64%</td>\n\t<td data-value=\"11\" class=\"abs medium\">7/11</td>\n\t<td data-value=\"91.67\" class=\"pct high\">91.67%</td>\n\t<td data-value=\"36\" class=\"abs high\">33/36</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file low\" data-value=\"src/data/inMemoryRepository\"><a href=\"src\\data\\inMemoryRepository\\index.html\">src/data/inMemoryRepository</a></td>\n\t<td data-value=\"38.46\" class=\"pic low\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 38%\"></div><div class=\"cover-empty\" style=\"width: 62%\"></div></div>\n\t</td>\n\t<td data-value=\"38.46\" class=\"pct low\">38.46%</td>\n\t<td data-value=\"26\" class=\"abs low\">10/26</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"0\" class=\"pct low\">0%</td>\n\t<td data-value=\"8\" class=\"abs low\">0/8</td>\n\t<td data-value=\"34.78\" class=\"pct low\">34.78%</td>\n\t<td data-value=\"23\" class=\"abs low\">8/23</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file medium\" data-value=\"src/usecases/interactor\"><a href=\"src\\usecases\\interactor\\index.html\">src/usecases/interactor</a></td>\n\t<td data-value=\"60\" class=\"pic medium\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 60%\"></div><div class=\"cover-empty\" style=\"width: 40%\"></div></div>\n\t</td>\n\t<td data-value=\"60\" class=\"pct medium\">60%</td>\n\t<td data-value=\"15\" class=\"abs medium\">9/15</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"0\" class=\"pct low\">0%</td>\n\t<td data-value=\"6\" class=\"abs low\">0/6</td>\n\t<td data-value=\"50\" class=\"pct medium\">50%</td>\n\t<td data-value=\"12\" class=\"abs medium\">6/12</td>\n\t</tr>\n\n</tbody>\n</table>\n</div>\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"sorter.js\"></script>\n        <script src=\"block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/prettify.css",
    "content": ".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}\n"
  },
  {
    "path": "coverage/lcov-report/prettify.js",
    "content": "/* eslint-disable */\nwindow.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\"]);\n"
  },
  {
    "path": "coverage/lcov-report/sorter.js",
    "content": "/* eslint-disable */\nvar addSorting = (function() {\n    'use strict';\n    var cols,\n        currentSort = {\n            index: 0,\n            desc: false\n        };\n\n    // returns the summary table element\n    function getTable() {\n        return document.querySelector('.coverage-summary');\n    }\n    // returns the thead element of the summary table\n    function getTableHeader() {\n        return getTable().querySelector('thead tr');\n    }\n    // returns the tbody element of the summary table\n    function getTableBody() {\n        return getTable().querySelector('tbody');\n    }\n    // returns the th element for nth column\n    function getNthColumn(n) {\n        return getTableHeader().querySelectorAll('th')[n];\n    }\n\n    // loads all columns\n    function loadColumns() {\n        var colNodes = getTableHeader().querySelectorAll('th'),\n            colNode,\n            cols = [],\n            col,\n            i;\n\n        for (i = 0; i < colNodes.length; i += 1) {\n            colNode = colNodes[i];\n            col = {\n                key: colNode.getAttribute('data-col'),\n                sortable: !colNode.getAttribute('data-nosort'),\n                type: colNode.getAttribute('data-type') || 'string'\n            };\n            cols.push(col);\n            if (col.sortable) {\n                col.defaultDescSort = col.type === 'number';\n                colNode.innerHTML =\n                    colNode.innerHTML + '<span class=\"sorter\"></span>';\n            }\n        }\n        return cols;\n    }\n    // attaches a data attribute to every tr element with an object\n    // of data values keyed by column name\n    function loadRowData(tableRow) {\n        var tableCols = tableRow.querySelectorAll('td'),\n            colNode,\n            col,\n            data = {},\n            i,\n            val;\n        for (i = 0; i < tableCols.length; i += 1) {\n            colNode = tableCols[i];\n            col = cols[i];\n            val = colNode.getAttribute('data-value');\n            if (col.type === 'number') {\n                val = Number(val);\n            }\n            data[col.key] = val;\n        }\n        return data;\n    }\n    // loads all row data\n    function loadData() {\n        var rows = getTableBody().querySelectorAll('tr'),\n            i;\n\n        for (i = 0; i < rows.length; i += 1) {\n            rows[i].data = loadRowData(rows[i]);\n        }\n    }\n    // sorts the table using the data for the ith column\n    function sortByIndex(index, desc) {\n        var key = cols[index].key,\n            sorter = function(a, b) {\n                a = a.data[key];\n                b = b.data[key];\n                return a < b ? -1 : a > b ? 1 : 0;\n            },\n            finalSorter = sorter,\n            tableBody = document.querySelector('.coverage-summary tbody'),\n            rowNodes = tableBody.querySelectorAll('tr'),\n            rows = [],\n            i;\n\n        if (desc) {\n            finalSorter = function(a, b) {\n                return -1 * sorter(a, b);\n            };\n        }\n\n        for (i = 0; i < rowNodes.length; i += 1) {\n            rows.push(rowNodes[i]);\n            tableBody.removeChild(rowNodes[i]);\n        }\n\n        rows.sort(finalSorter);\n\n        for (i = 0; i < rows.length; i += 1) {\n            tableBody.appendChild(rows[i]);\n        }\n    }\n    // removes sort indicators for current column being sorted\n    function removeSortIndicators() {\n        var col = getNthColumn(currentSort.index),\n            cls = col.className;\n\n        cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');\n        col.className = cls;\n    }\n    // adds sort indicators for current column being sorted\n    function addSortIndicators() {\n        getNthColumn(currentSort.index).className += currentSort.desc\n            ? ' sorted-desc'\n            : ' sorted';\n    }\n    // adds event listeners for all sorter widgets\n    function enableUI() {\n        var i,\n            el,\n            ithSorter = function ithSorter(i) {\n                var col = cols[i];\n\n                return function() {\n                    var desc = col.defaultDescSort;\n\n                    if (currentSort.index === i) {\n                        desc = !currentSort.desc;\n                    }\n                    sortByIndex(i, desc);\n                    removeSortIndicators();\n                    currentSort.index = i;\n                    currentSort.desc = desc;\n                    addSortIndicators();\n                };\n            };\n        for (i = 0; i < cols.length; i += 1) {\n            if (cols[i].sortable) {\n                // add the click event handler on the th so users\n                // dont have to click on those tiny arrows\n                el = getNthColumn(i).querySelector('.sorter').parentElement;\n                if (el.addEventListener) {\n                    el.addEventListener('click', ithSorter(i));\n                } else {\n                    el.attachEvent('onclick', ithSorter(i));\n                }\n            }\n        }\n    }\n    // adds sorting functionality to the UI\n    return function() {\n        if (!getTable()) {\n            return;\n        }\n        cols = loadColumns();\n        loadData();\n        addSortIndicators();\n        enableUI();\n    };\n})();\n\nwindow.addEventListener('load', addSorting);\n"
  },
  {
    "path": "coverage/lcov-report/src/app/components/Product.vue.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/app/components/Product.vue</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/app/components</a> Product.vue</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">50% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>3/6</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">33.33% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>1/3</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">50% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>3/6</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line medium'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a>\n<a name='L32'></a><a href='#L32'>32</a>\n<a name='L33'></a><a href='#L33'>33</a>\n<a name='L34'></a><a href='#L34'>34</a>\n<a name='L35'></a><a href='#L35'>35</a>\n<a name='L36'></a><a href='#L36'>36</a>\n<a name='L37'></a><a href='#L37'>37</a>\n<a name='L38'></a><a href='#L38'>38</a>\n<a name='L39'></a><a href='#L39'>39</a>\n<a name='L40'></a><a href='#L40'>40</a>\n<a name='L41'></a><a href='#L41'>41</a>\n<a name='L42'></a><a href='#L42'>42</a>\n<a name='L43'></a><a href='#L43'>43</a>\n<a name='L44'></a><a href='#L44'>44</a>\n<a name='L45'></a><a href='#L45'>45</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">&lt;template&gt;\n  &lt;v-card hover outlined&gt;\n    &lt;v-card-text&gt;\n&nbsp;\n      &lt;v-img height=\"200\"\n             :src=\"product.thumbnailUrl\"/&gt;\n&nbsp;\n      &lt;p class=\"mt-6 mb-0 title success--text\"&gt;{{ product.name }}&lt;/p&gt;\n&nbsp;\n      &lt;p class=\"pink--text body-1\"&gt;${{ product.price.toLocaleString() }}&lt;/p&gt;\n      &lt;p&gt;{{ product.description }}&lt;/p&gt;\n&nbsp;\n      &lt;v-btn block color=\"success\" @click=\"addToCart\" :loading=\"loading\"&gt;Add to cart&lt;/v-btn&gt;\n&nbsp;\n    &lt;/v-card-text&gt;\n  &lt;/v-card&gt;\n&lt;/template&gt;\n&lt;script lang=\"ts\"&gt;\n  import Vue from 'vue'\n  import {cartStore} from \"@/app/store\";\n&nbsp;\n  export default Vue.extend({\n    props: {\n      product: {\n        type: Object\n      }\n    },\n&nbsp;\n    data() {\n      return {\n        loading: false,\n      }\n    },\n&nbsp;\n    methods: {\n<span class=\"fstat-no\" title=\"function not covered\" >      addToCart() {</span>\n<span class=\"cstat-no\" title=\"statement not covered\" >        this.loading = true;</span>\n<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>\n          .finally(() =&gt; {\n<span class=\"cstat-no\" title=\"statement not covered\" >            this.loading = false</span>\n          })\n      }\n    }\n  })\n&lt;/script&gt;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/app/components/ProductList.vue.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/app/components/ProductList.vue</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/app/components</a> ProductList.vue</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>7/7</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>3/3</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>7/7</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a>\n<a name='L32'></a><a href='#L32'>32</a>\n<a name='L33'></a><a href='#L33'>33</a>\n<a name='L34'></a><a href='#L34'>34</a>\n<a name='L35'></a><a href='#L35'>35</a>\n<a name='L36'></a><a href='#L36'>36</a>\n<a name='L37'></a><a href='#L37'>37</a>\n<a name='L38'></a><a href='#L38'>38</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">&lt;template&gt;\n  &lt;div&gt;\n    &lt;v-row&gt;\n      &lt;v-col :key=\"idx\" md=\"4\" sm=\"6\" v-for=\"(item ,idx) in products\" xs=\"12\"&gt;\n        &lt;Product class=\"my-5\" :key=\"idx\" :product=\"item\"&gt;&lt;/Product&gt;\n      &lt;/v-col&gt;\n    &lt;/v-row&gt;\n  &lt;/div&gt;\n&lt;/template&gt;\n&lt;script lang=\"ts\"&gt;\nimport Vue from \"vue\";\nimport ProductComponent from \"@/app/components/Product.vue\";\nimport { ProductStore } from \"@/app/store/product\";\nimport { getModule } from \"vuex-module-decorators\";\nimport { Product } from \"@/domain/entity\";\n&nbsp;\nexport default Vue.extend({\n  components: {\n    Product: ProductComponent\n  },\n&nbsp;\n  computed: {\n    productStore(): ProductStore {\n      return getModule(ProductStore, this.$store);\n    },\n&nbsp;\n    products(): Product[] {\n      return this.productStore.items;\n    }\n  },\n&nbsp;\n  data() {\n    return {\n      loading: false\n    };\n  }\n});\n&lt;/script&gt;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/app/components/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/app/components</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> src/app/components</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">76.92% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>10/13</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">66.67% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>4/6</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">76.92% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>10/13</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line medium'></div>\n    <div class=\"pad1\">\n<table class=\"coverage-summary\">\n<thead>\n<tr>\n   <th data-col=\"file\" data-fmt=\"html\" data-html=\"true\" class=\"file\">File</th>\n   <th data-col=\"pic\" data-type=\"number\" data-fmt=\"html\" data-html=\"true\" class=\"pic\"></th>\n   <th data-col=\"statements\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Statements</th>\n   <th data-col=\"statements_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"branches\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Branches</th>\n   <th data-col=\"branches_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"functions\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Functions</th>\n   <th data-col=\"functions_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"lines\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Lines</th>\n   <th data-col=\"lines_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n</tr>\n</thead>\n<tbody><tr>\n\t<td class=\"file medium\" data-value=\"Product.vue\"><a href=\"Product.vue.html\">Product.vue</a></td>\n\t<td data-value=\"50\" class=\"pic medium\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 50%\"></div><div class=\"cover-empty\" style=\"width: 50%\"></div></div>\n\t</td>\n\t<td data-value=\"50\" class=\"pct medium\">50%</td>\n\t<td data-value=\"6\" class=\"abs medium\">3/6</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"33.33\" class=\"pct low\">33.33%</td>\n\t<td data-value=\"3\" class=\"abs low\">1/3</td>\n\t<td data-value=\"50\" class=\"pct medium\">50%</td>\n\t<td data-value=\"6\" class=\"abs medium\">3/6</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file high\" data-value=\"ProductList.vue\"><a href=\"ProductList.vue.html\">ProductList.vue</a></td>\n\t<td data-value=\"100\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill cover-full\" style=\"width: 100%\"></div><div class=\"cover-empty\" style=\"width: 0%\"></div></div>\n\t</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"7\" class=\"abs high\">7/7</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"3\" class=\"abs high\">3/3</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"7\" class=\"abs high\">7/7</td>\n\t</tr>\n\n</tbody>\n</table>\n</div>\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/app/store/cart.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/app/store/cart.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/app/store</a> cart.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">78.95% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>15/19</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>2/2</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">50% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>4/8</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">81.25% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>13/16</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line medium'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a>\n<a name='L32'></a><a href='#L32'>32</a>\n<a name='L33'></a><a href='#L33'>33</a>\n<a name='L34'></a><a href='#L34'>34</a>\n<a name='L35'></a><a href='#L35'>35</a>\n<a name='L36'></a><a href='#L36'>36</a>\n<a name='L37'></a><a href='#L37'>37</a>\n<a name='L38'></a><a href='#L38'>38</a>\n<a name='L39'></a><a href='#L39'>39</a>\n<a name='L40'></a><a href='#L40'>40</a>\n<a name='L41'></a><a href='#L41'>41</a>\n<a name='L42'></a><a href='#L42'>42</a>\n<a name='L43'></a><a href='#L43'>43</a>\n<a name='L44'></a><a href='#L44'>44</a>\n<a name='L45'></a><a href='#L45'>45</a>\n<a name='L46'></a><a href='#L46'>46</a>\n<a name='L47'></a><a href='#L47'>47</a>\n<a name='L48'></a><a href='#L48'>48</a>\n<a name='L49'></a><a href='#L49'>49</a>\n<a name='L50'></a><a href='#L50'>50</a>\n<a name='L51'></a><a href='#L51'>51</a>\n<a name='L52'></a><a href='#L52'>52</a>\n<a name='L53'></a><a href='#L53'>53</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import { lazyInject } from \"@/di\";\nimport { Action, Module, Mutation, VuexModule } from \"vuex-module-decorators\";\nimport { Cart, Product } from \"@/domain/entity\";\nimport { AddItemToCart } from \"@/usecases/interactor/addItemToCart\";\n&nbsp;\nexport interface CartState {\n  items: Cart[];\n}\n&nbsp;\nexport interface AddProductToCartPayload {\n  product: Product;\n  quantity: number;\n}\n&nbsp;\n@Module({\n  name: \"cart\",\n  namespaced: true\n})\nexport class CartStore extends VuexModule implements CartState {\n  public items: Cart[] = [];\n  @lazyInject(\"AddItemToCart\") private addItemToCart!: AddItemToCart;\n&nbsp;\n<span class=\"fstat-no\" title=\"function not covered\" >  get t</span>otalCartItem(): number {\n<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) =&gt; <span class=\"cstat-no\" title=\"statement not covered\" >acc + cart.quantity, 0</span>);\n  }\n&nbsp;\n<span class=\"fstat-no\" title=\"function not covered\" >  get t</span>otalAmount(): number {\n<span class=\"cstat-no\" title=\"statement not covered\" >    return t</span>his.items.reduce(\n<span class=\"fstat-no\" title=\"function not covered\" >      (a</span>cc, item) =&gt; <span class=\"cstat-no\" title=\"statement not covered\" >acc + item.quantity * item.product.price,</span>\n      0\n    );\n  }\n&nbsp;\n  @Mutation\n  addItem(cart: Cart) {\n    const idx = this.items.findIndex(c =&gt; c.product.id === cart.product.id);\n    if (idx &gt;= 0) {\n      this.items[idx].quantity += cart.quantity;\n    } else {\n      this.items.push(cart);\n    }\n  }\n&nbsp;\n  @Action\n  async addProductToCart({ product, quantity }: AddProductToCartPayload) {\n    await this.addItemToCart.execute(product, quantity).toPromise();\n    this.addItem({\n      product: product,\n      quantity: quantity\n    } as Cart);\n  }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/app/store/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/app/store</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> src/app/store</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">90% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>36/40</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>2/2</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">63.64% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>7/11</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">91.67% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>33/36</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <div class=\"pad1\">\n<table class=\"coverage-summary\">\n<thead>\n<tr>\n   <th data-col=\"file\" data-fmt=\"html\" data-html=\"true\" class=\"file\">File</th>\n   <th data-col=\"pic\" data-type=\"number\" data-fmt=\"html\" data-html=\"true\" class=\"pic\"></th>\n   <th data-col=\"statements\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Statements</th>\n   <th data-col=\"statements_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"branches\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Branches</th>\n   <th data-col=\"branches_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"functions\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Functions</th>\n   <th data-col=\"functions_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"lines\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Lines</th>\n   <th data-col=\"lines_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n</tr>\n</thead>\n<tbody><tr>\n\t<td class=\"file medium\" data-value=\"cart.ts\"><a href=\"cart.ts.html\">cart.ts</a></td>\n\t<td data-value=\"78.95\" class=\"pic medium\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 78%\"></div><div class=\"cover-empty\" style=\"width: 22%\"></div></div>\n\t</td>\n\t<td data-value=\"78.95\" class=\"pct medium\">78.95%</td>\n\t<td data-value=\"19\" class=\"abs medium\">15/19</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"2\" class=\"abs high\">2/2</td>\n\t<td data-value=\"50\" class=\"pct medium\">50%</td>\n\t<td data-value=\"8\" class=\"abs medium\">4/8</td>\n\t<td data-value=\"81.25\" class=\"pct high\">81.25%</td>\n\t<td data-value=\"16\" class=\"abs high\">13/16</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file high\" data-value=\"index.ts\"><a href=\"index.ts.html\">index.ts</a></td>\n\t<td data-value=\"100\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill cover-full\" style=\"width: 100%\"></div><div class=\"cover-empty\" style=\"width: 0%\"></div></div>\n\t</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"10\" class=\"abs high\">10/10</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"10\" class=\"abs high\">10/10</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file high\" data-value=\"product.ts\"><a href=\"product.ts.html\">product.ts</a></td>\n\t<td data-value=\"100\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill cover-full\" style=\"width: 100%\"></div><div class=\"cover-empty\" style=\"width: 0%\"></div></div>\n\t</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"11\" class=\"abs high\">11/11</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"3\" class=\"abs high\">3/3</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"10\" class=\"abs high\">10/10</td>\n\t</tr>\n\n</tbody>\n</table>\n</div>\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/app/store/index.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/app/store/index.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/app/store</a> index.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>10/10</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>10/10</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport {ProductState, ProductStore} from \"./product\";\nimport {CartState, CartStore} from \"./cart\";\nimport {getModule} from \"vuex-module-decorators\";\n&nbsp;\nVue.use(Vuex);\n&nbsp;\nexport interface RootState {\n  product: ProductState;\n  cart: CartState;\n}\n&nbsp;\nconst store = new Vuex.Store&lt;RootState&gt;({\n  modules: {\n    product: ProductStore,\n    cart: CartStore\n  }\n});\n&nbsp;\nconst productStore = getModule(ProductStore, store)\nconst cartStore = getModule(CartStore, store)\nexport {productStore, cartStore}\nexport default store;\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/app/store/product.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/app/store/product.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/app/store</a> product.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>11/11</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>3/3</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>10/10</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import { lazyInject } from \"@/di\";\n&nbsp;\nimport { Action, Module, Mutation, VuexModule } from \"vuex-module-decorators\";\nimport { Product } from \"@/domain/entity\";\nimport { GetAllProduct } from \"@/usecases/interactor/getAllProduct\";\n&nbsp;\nexport interface ProductState {\n  items: Product[];\n}\n&nbsp;\n@Module({\n  name: \"product\",\n  namespaced: true\n})\nexport class ProductStore extends VuexModule implements ProductState {\n  public items: Product[] = [];\n&nbsp;\n  @lazyInject(\"GetAllProduct\") private getAllProduct!: GetAllProduct;\n&nbsp;\n  @Mutation\n  setItems(items: Product[]) {\n    this.items = items;\n  }\n&nbsp;\n  @Action\n  async fetchItems() {\n    const list = await this.getAllProduct.execute().toPromise();\n    this.setItems(list);\n  }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/data/inMemoryRepository/cartRepository.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/data/inMemoryRepository/cartRepository.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/data/inMemoryRepository</a> cartRepository.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">41.67% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>5/12</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">0% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/5</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">36.36% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>4/11</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line low'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">8x</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import {Observable, of} from \"rxjs\";\nimport {delay, map} from \"rxjs/operators\";\nimport {injectable} from \"inversify\";\nimport {Cart, Product} from \"@/domain/entity\";\n&nbsp;\n@injectable()\n<span class=\"fstat-no\" title=\"function not covered\" >export default class C</span>artRepositoryImpl {\n  private <span class=\"cstat-no\" title=\"statement not covered\" >_carts: Cart[] = [</span>];\n&nbsp;\n  public <span class=\"fstat-no\" title=\"function not covered\" >addItemToCart(</span>product: Product, quantity: number): Observable&lt;void&gt; {\n<span class=\"cstat-no\" title=\"statement not covered\" >    this._</span>carts.push({product, quantity});\n<span class=\"cstat-no\" title=\"statement not covered\" >    return o</span>f(1).pipe(\n      // delay(1000),\n      map(<span class=\"fstat-no\" title=\"function not covered\" >() =&gt; </span>{\n<span class=\"cstat-no\" title=\"statement not covered\" >        return;</span>\n      })\n    );\n  }\n&nbsp;\n  public <span class=\"fstat-no\" title=\"function not covered\" >getTotalCartItem(</span>): Observable&lt;number&gt; {\n    const val = <span class=\"cstat-no\" title=\"statement not covered\" >this._carts.length;</span>\n<span class=\"cstat-no\" title=\"statement not covered\" >    return o</span>f(null).pipe(\n      // delay(1000),\n      map(<span class=\"fstat-no\" title=\"function not covered\" >() =&gt; <span class=\"cstat-no\" title=\"statement not covered\" >v</span>al)</span>\n    );\n  }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/data/inMemoryRepository/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/data/inMemoryRepository</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> src/data/inMemoryRepository</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">38.46% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>10/26</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">0% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/8</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">34.78% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>8/23</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line low'></div>\n    <div class=\"pad1\">\n<table class=\"coverage-summary\">\n<thead>\n<tr>\n   <th data-col=\"file\" data-fmt=\"html\" data-html=\"true\" class=\"file\">File</th>\n   <th data-col=\"pic\" data-type=\"number\" data-fmt=\"html\" data-html=\"true\" class=\"pic\"></th>\n   <th data-col=\"statements\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Statements</th>\n   <th data-col=\"statements_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"branches\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Branches</th>\n   <th data-col=\"branches_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"functions\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Functions</th>\n   <th data-col=\"functions_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"lines\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Lines</th>\n   <th data-col=\"lines_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n</tr>\n</thead>\n<tbody><tr>\n\t<td class=\"file low\" data-value=\"cartRepository.ts\"><a href=\"cartRepository.ts.html\">cartRepository.ts</a></td>\n\t<td data-value=\"41.67\" class=\"pic low\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 41%\"></div><div class=\"cover-empty\" style=\"width: 59%\"></div></div>\n\t</td>\n\t<td data-value=\"41.67\" class=\"pct low\">41.67%</td>\n\t<td data-value=\"12\" class=\"abs low\">5/12</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"0\" class=\"pct low\">0%</td>\n\t<td data-value=\"5\" class=\"abs low\">0/5</td>\n\t<td data-value=\"36.36\" class=\"pct low\">36.36%</td>\n\t<td data-value=\"11\" class=\"abs low\">4/11</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file low\" data-value=\"productRepository.ts\"><a href=\"productRepository.ts.html\">productRepository.ts</a></td>\n\t<td data-value=\"35.71\" class=\"pic low\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 35%\"></div><div class=\"cover-empty\" style=\"width: 65%\"></div></div>\n\t</td>\n\t<td data-value=\"35.71\" class=\"pct low\">35.71%</td>\n\t<td data-value=\"14\" class=\"abs low\">5/14</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"0\" class=\"pct low\">0%</td>\n\t<td data-value=\"3\" class=\"abs low\">0/3</td>\n\t<td data-value=\"33.33\" class=\"pct low\">33.33%</td>\n\t<td data-value=\"12\" class=\"abs low\">4/12</td>\n\t</tr>\n\n</tbody>\n</table>\n</div>\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/data/inMemoryRepository/productRepository.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/data/inMemoryRepository/productRepository.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/data/inMemoryRepository</a> productRepository.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">35.71% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>5/14</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">0% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/3</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">33.33% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>4/12</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line low'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a>\n<a name='L32'></a><a href='#L32'>32</a>\n<a name='L33'></a><a href='#L33'>33</a>\n<a name='L34'></a><a href='#L34'>34</a>\n<a name='L35'></a><a href='#L35'>35</a>\n<a name='L36'></a><a href='#L36'>36</a>\n<a name='L37'></a><a href='#L37'>37</a>\n<a name='L38'></a><a href='#L38'>38</a>\n<a name='L39'></a><a href='#L39'>39</a>\n<a name='L40'></a><a href='#L40'>40</a>\n<a name='L41'></a><a href='#L41'>41</a>\n<a name='L42'></a><a href='#L42'>42</a>\n<a name='L43'></a><a href='#L43'>43</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">8x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import {Observable, of} from \"rxjs\";\n&nbsp;\nimport {injectable} from \"inversify\";\nimport {Product} from \"@/domain/entity\";\nimport {map} from \"rxjs/operators\";\n&nbsp;\n@injectable()\nexport default class ProductRepositoryImpl {\n  readonly _products: Product[];\n&nbsp;\n<span class=\"fstat-no\" title=\"function not covered\" >  constructor() {</span>\n    const _images = <span class=\"cstat-no\" title=\"statement not covered\" >[</span>\n      \"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img1.jpg?raw=1\",\n      \"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img2.jpg?raw=1\",\n      \"https://www.dropbox.com/s/78fot6w894stu3n/img3.jpg?raw=1\",\n      \"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img4.jpg?raw=1\",\n      \"https://www.dropbox.com/s/d45c3pap1h4cu0y/img5.jpg?raw=1\",\n      \"https://www.dropbox.com/s/rjj1vtdx79xptu0/img6.jpeg?raw=1\",\n      \"https://www.dropbox.com/s/miym588nx2lscqt/img7.jpg?raw=1\",\n      \"https://www.dropbox.com/s/miym588nx2lscqt/img8.jpg?raw=1\",\n      \"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img9.jpg?raw=1\",\n    ]\n<span class=\"cstat-no\" title=\"statement not covered\" >    console.</span>log('hti')\n    const products = <span class=\"cstat-no\" title=\"statement not covered\" >[]</span>\n<span class=\"cstat-no\" title=\"statement not covered\" >    for (let i = <span class=\"cstat-no\" title=\"statement not covered\" >0; i</span> &lt; 20; i++) {</span>\n<span class=\"cstat-no\" title=\"statement not covered\" >      products.</span>push({\n        id: `${i + 1}`,\n        name: `Product ${i + 1}`,\n        price: 2200,\n        thumbnailUrl: _images[Math.floor(Math.random() * (_images.length - 1))],\n        description: \"3.0GHz Dual-core Haswell Intel Core i5 Turbo Boost up to 3.2 GHz, 3MB L3 cache 8GB (two 4GB SO-DIMMs...\"\n      })\n    }\n<span class=\"cstat-no\" title=\"statement not covered\" >    this._</span>products = products\n  }\n&nbsp;\n  public <span class=\"fstat-no\" title=\"function not covered\" >getAll(</span>): Observable&lt;Product[]&gt; {\n<span class=\"cstat-no\" title=\"statement not covered\" >    return o</span>f(null).pipe(\n      map(<span class=\"fstat-no\" title=\"function not covered\" >() =&gt; <span class=\"cstat-no\" title=\"statement not covered\" >t</span>his._products)</span>\n    )\n  }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/di.ts.html",
    "content": "\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\" />\n    <link rel=\"stylesheet\" href=\"..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\index.html\">All files</a> / <a href=\"index.html\">src</a> di.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>15/15</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>15/15</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a>\n<a name='L32'></a><a href='#L32'>32</a>\n<a name='L33'></a><a href='#L33'>33</a>\n<a name='L34'></a><a href='#L34'>34</a>\n<a name='L35'></a><a href='#L35'>35</a>\n<a name='L36'></a><a href='#L36'>36</a>\n<a name='L37'></a><a href='#L37'>37</a>\n<a name='L38'></a><a href='#L38'>38</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import \"reflect-metadata\";\nimport {Container} from \"inversify\";\nimport getDecorators from \"inversify-inject-decorators\";\nimport CartRepository from \"@/usecases/repository/cartRepository\";\nimport ProductRepository from \"@/usecases/repository/productRepository\";\nimport CartRepositoryImpl from \"@/data/inMemoryRepository/cartRepository\";\nimport ProductRepositoryImpl from \"@/data/inMemoryRepository/productRepository\";\nimport {AddItemToCart, AddItemToCartImpl} from \"@/usecases/interactor/addItemToCart\";\nimport {GetAllProduct, GetAllProductImpl} from \"@/usecases/interactor/getAllProduct\";\nimport {GetTotalCartItem, GetTotalCartItemImpl} from \"@/usecases/interactor/getTotalCartItem\";\n&nbsp;\nconst container = new Container();\n&nbsp;\ncontainer\n  .bind&lt;CartRepository&gt;(\"CartRepository\")\n  .to(CartRepositoryImpl)\n  .inSingletonScope();\ncontainer\n  .bind&lt;ProductRepository&gt;(\"ProductRepository\")\n  .to(ProductRepositoryImpl)\n  .inSingletonScope();\n&nbsp;\ncontainer\n  .bind&lt;AddItemToCart&gt;(\"AddItemToCart\")\n  .to(AddItemToCartImpl)\n  .inSingletonScope();\ncontainer\n  .bind&lt;GetAllProduct&gt;(\"GetAllProduct\")\n  .to(GetAllProductImpl)\n  .inSingletonScope();\ncontainer\n  .bind&lt;GetTotalCartItem&gt;(\"GetTotalCartItem\")\n  .to(GetTotalCartItemImpl)\n  .inSingletonScope();\n&nbsp;\nconst {lazyInject} = getDecorators(container);\nexport {lazyInject, container};\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\sorter.js\"></script>\n        <script src=\"..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\index.html\">All files</a> src</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>15/15</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>15/15</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <div class=\"pad1\">\n<table class=\"coverage-summary\">\n<thead>\n<tr>\n   <th data-col=\"file\" data-fmt=\"html\" data-html=\"true\" class=\"file\">File</th>\n   <th data-col=\"pic\" data-type=\"number\" data-fmt=\"html\" data-html=\"true\" class=\"pic\"></th>\n   <th data-col=\"statements\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Statements</th>\n   <th data-col=\"statements_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"branches\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Branches</th>\n   <th data-col=\"branches_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"functions\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Functions</th>\n   <th data-col=\"functions_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"lines\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Lines</th>\n   <th data-col=\"lines_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n</tr>\n</thead>\n<tbody><tr>\n\t<td class=\"file high\" data-value=\"di.ts\"><a href=\"di.ts.html\">di.ts</a></td>\n\t<td data-value=\"100\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill cover-full\" style=\"width: 100%\"></div><div class=\"cover-empty\" style=\"width: 0%\"></div></div>\n\t</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"15\" class=\"abs high\">15/15</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"15\" class=\"abs high\">15/15</td>\n\t</tr>\n\n</tbody>\n</table>\n</div>\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\sorter.js\"></script>\n        <script src=\"..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/usecases/interactor/addItemToCart.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/usecases/interactor/addItemToCart.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/usecases/interactor</a> addItemToCart.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">60% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>3/5</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">0% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/2</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">50% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>2/4</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line medium'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import {Observable} from \"rxjs\";\nimport {inject, injectable} from \"inversify\";\nimport {Product} from \"@/domain/entity\";\nimport CartRepository from \"@/usecases/repository/cartRepository\";\n&nbsp;\nexport interface AddItemToCart {\n  execute(product: Product, quantity: number): Observable&lt;void&gt;;\n}\n&nbsp;\n@injectable()\nexport class AddItemToCartImpl implements AddItemToCart {\n<span class=\"fstat-no\" title=\"function not covered\" >  constructor(</span>\n    @inject(\"CartRepository\") private <span class=\"cstat-no\" title=\"statement not covered\" >cartRepository: CartRepository</span>\n  ) {\n  }\n&nbsp;\n<span class=\"fstat-no\" title=\"function not covered\" >  execute(</span>product: Product, quantity: number): Observable&lt;void&gt; {\n<span class=\"cstat-no\" title=\"statement not covered\" >    return t</span>his.cartRepository.addItemToCart(product, quantity);\n  }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/usecases/interactor/getAllProduct.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/usecases/interactor/getAllProduct.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/usecases/interactor</a> getAllProduct.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">60% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>3/5</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">0% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/2</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">50% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>2/4</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line medium'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import { Product } from \"@/domain/entity\";\nimport { Observable, of } from \"rxjs\";\nimport { inject, injectable } from \"inversify\";\nimport ProductRepository from \"@/usecases/repository/productRepository\";\n&nbsp;\nexport interface GetAllProduct {\n  execute(): Observable&lt;Product[]&gt;;\n}\n&nbsp;\n@injectable()\nexport class GetAllProductImpl implements GetAllProduct {\n<span class=\"fstat-no\" title=\"function not covered\" >  constructor(</span>\n    @inject(\"ProductRepository\") public <span class=\"cstat-no\" title=\"statement not covered\" >productRepo: ProductRepository</span>\n  ) {}\n&nbsp;\n<span class=\"fstat-no\" title=\"function not covered\" >  execute(</span>): Observable&lt;Product[]&gt; {\n<span class=\"cstat-no\" title=\"statement not covered\" >    return t</span>his.productRepo.getAll();\n  }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/usecases/interactor/getTotalCartItem.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/usecases/interactor/getTotalCartItem.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> / <a href=\"index.html\">src/usecases/interactor</a> getTotalCartItem.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">60% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>3/5</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">0% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/2</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">50% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>2/4</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line medium'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-no\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import {Observable} from \"rxjs\";\nimport {inject, injectable} from \"inversify\";\nimport CartRepository from \"@/usecases/repository/cartRepository\";\n&nbsp;\nexport interface GetTotalCartItem {\n  execute(): Observable&lt;number&gt;;\n}\n&nbsp;\n@injectable()\nexport class GetTotalCartItemImpl implements GetTotalCartItem {\n<span class=\"fstat-no\" title=\"function not covered\" >  constructor(</span>\n    @inject(\"CartRepository\") private <span class=\"cstat-no\" title=\"statement not covered\" >cartRepository: CartRepository</span>\n  ) {\n  }\n&nbsp;\n<span class=\"fstat-no\" title=\"function not covered\" >  execute(</span>): Observable&lt;number&gt; {\n<span class=\"cstat-no\" title=\"statement not covered\" >    return t</span>his.cartRepository.getTotalCartItem()\n  }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/src/usecases/interactor/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for src/usecases/interactor</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\prettify.css\" />\n    <link rel=\"stylesheet\" href=\"..\\..\\..\\base.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(..\\..\\..\\sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"..\\..\\..\\index.html\">All files</a> src/usecases/interactor</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">60% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>9/15</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>0/0</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">0% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>0/6</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">50% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>6/12</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            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.\n        </p>\n    </div>\n    <div class='status-line medium'></div>\n    <div class=\"pad1\">\n<table class=\"coverage-summary\">\n<thead>\n<tr>\n   <th data-col=\"file\" data-fmt=\"html\" data-html=\"true\" class=\"file\">File</th>\n   <th data-col=\"pic\" data-type=\"number\" data-fmt=\"html\" data-html=\"true\" class=\"pic\"></th>\n   <th data-col=\"statements\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Statements</th>\n   <th data-col=\"statements_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"branches\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Branches</th>\n   <th data-col=\"branches_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"functions\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Functions</th>\n   <th data-col=\"functions_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"lines\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Lines</th>\n   <th data-col=\"lines_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n</tr>\n</thead>\n<tbody><tr>\n\t<td class=\"file medium\" data-value=\"addItemToCart.ts\"><a href=\"addItemToCart.ts.html\">addItemToCart.ts</a></td>\n\t<td data-value=\"60\" class=\"pic medium\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 60%\"></div><div class=\"cover-empty\" style=\"width: 40%\"></div></div>\n\t</td>\n\t<td data-value=\"60\" class=\"pct medium\">60%</td>\n\t<td data-value=\"5\" class=\"abs medium\">3/5</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"0\" class=\"pct low\">0%</td>\n\t<td data-value=\"2\" class=\"abs low\">0/2</td>\n\t<td data-value=\"50\" class=\"pct medium\">50%</td>\n\t<td data-value=\"4\" class=\"abs medium\">2/4</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file medium\" data-value=\"getAllProduct.ts\"><a href=\"getAllProduct.ts.html\">getAllProduct.ts</a></td>\n\t<td data-value=\"60\" class=\"pic medium\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 60%\"></div><div class=\"cover-empty\" style=\"width: 40%\"></div></div>\n\t</td>\n\t<td data-value=\"60\" class=\"pct medium\">60%</td>\n\t<td data-value=\"5\" class=\"abs medium\">3/5</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"0\" class=\"pct low\">0%</td>\n\t<td data-value=\"2\" class=\"abs low\">0/2</td>\n\t<td data-value=\"50\" class=\"pct medium\">50%</td>\n\t<td data-value=\"4\" class=\"abs medium\">2/4</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file medium\" data-value=\"getTotalCartItem.ts\"><a href=\"getTotalCartItem.ts.html\">getTotalCartItem.ts</a></td>\n\t<td data-value=\"60\" class=\"pic medium\">\n\t<div class=\"chart\"><div class=\"cover-fill\" style=\"width: 60%\"></div><div class=\"cover-empty\" style=\"width: 40%\"></div></div>\n\t</td>\n\t<td data-value=\"60\" class=\"pct medium\">60%</td>\n\t<td data-value=\"5\" class=\"abs medium\">3/5</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"0\" class=\"abs high\">0/0</td>\n\t<td data-value=\"0\" class=\"pct low\">0%</td>\n\t<td data-value=\"2\" class=\"abs low\">0/2</td>\n\t<td data-value=\"50\" class=\"pct medium\">50%</td>\n\t<td data-value=\"4\" class=\"abs medium\">2/4</td>\n\t</tr>\n\n</tbody>\n</table>\n</div>\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Thu Feb 27 2020 15:36:45 GMT+0900 (GMT+09:00)\n            </div>\n        </div>\n        <script src=\"..\\..\\..\\prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"..\\..\\..\\sorter.js\"></script>\n        <script src=\"..\\..\\..\\block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov.info",
    "content": "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\nDA:8,4\nDA:9,4\nDA:10,4\nDA:12,4\nDA:14,4\nDA:18,4\nDA:23,4\nDA:27,4\nDA:31,4\nDA:36,4\nLF:15\nLH:15\nBRF:0\nBRH:0\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\components\\Product.vue\nFN:29,(anonymous_1)\nFN:36,(anonymous_2)\nFN:38,(anonymous_3)\nFNF:3\nFNH:1\nFNDA:3,(anonymous_1)\nFNDA:0,(anonymous_2)\nFNDA:0,(anonymous_3)\nDA:19,2\nDA:20,2\nDA:30,3\nDA:37,0\nDA:38,0\nDA:40,0\nLF:6\nLH:3\nBRF:0\nBRH:0\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\components\\ProductList.vue\nFN:23,(anonymous_1)\nFN:27,(anonymous_2)\nFN:32,(anonymous_3)\nFNF:3\nFNH:3\nFNDA:1,(anonymous_1)\nFNDA:1,(anonymous_2)\nFNDA:1,(anonymous_3)\nDA:11,1\nDA:12,1\nDA:13,1\nDA:14,1\nDA:24,1\nDA:28,1\nDA:33,1\nLF:7\nLH:7\nBRF:0\nBRH:0\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\cart.ts\nFN:19,(anonymous_0)\nFN:23,(anonymous_1)\nFN:24,(anonymous_2)\nFN:27,(anonymous_3)\nFN:29,(anonymous_4)\nFN:35,(anonymous_5)\nFN:36,(anonymous_6)\nFN:45,(anonymous_7)\nFNF:8\nFNH:4\nFNDA:3,(anonymous_0)\nFNDA:0,(anonymous_1)\nFNDA:0,(anonymous_2)\nFNDA:0,(anonymous_3)\nFNDA:0,(anonymous_4)\nFNDA:4,(anonymous_5)\nFNDA:2,(anonymous_6)\nFNDA:4,(anonymous_7)\nDA:1,3\nDA:2,3\nDA:19,3\nDA:20,3\nDA:21,3\nDA:24,0\nDA:28,0\nDA:29,0\nDA:35,3\nDA:36,4\nDA:37,4\nDA:38,1\nDA:40,3\nDA:45,3\nDA:46,4\nDA:47,4\nLF:16\nLH:13\nBRDA:37,0,0,1\nBRDA:37,0,1,3\nBRF:2\nBRH:2\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\index.ts\nFNF:0\nFNH:0\nDA:1,2\nDA:2,2\nDA:3,2\nDA:4,2\nDA:5,2\nDA:7,2\nDA:14,2\nDA:21,2\nDA:22,2\nDA:24,2\nLF:10\nLH:10\nBRF:0\nBRH:0\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\app\\store\\product.ts\nFN:15,(anonymous_0)\nFN:21,(anonymous_1)\nFN:26,(anonymous_2)\nFNF:3\nFNH:3\nFNDA:3,(anonymous_0)\nFNDA:4,(anonymous_1)\nFNDA:2,(anonymous_2)\nDA:1,3\nDA:3,3\nDA:15,3\nDA:16,3\nDA:18,3\nDA:21,3\nDA:22,4\nDA:26,3\nDA:27,2\nDA:28,2\nLF:10\nLH:10\nBRF:0\nBRH:0\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\data\\inMemoryRepository\\cartRepository.ts\nFN:7,(anonymous_0)\nFN:10,(anonymous_1)\nFN:14,(anonymous_2)\nFN:20,(anonymous_3)\nFN:24,(anonymous_4)\nFNF:5\nFNH:0\nFNDA:0,(anonymous_0)\nFNDA:0,(anonymous_1)\nFNDA:0,(anonymous_2)\nFNDA:0,(anonymous_3)\nFNDA:0,(anonymous_4)\nDA:1,4\nDA:2,4\nDA:3,4\nDA:7,8\nDA:8,0\nDA:11,0\nDA:12,0\nDA:15,0\nDA:21,0\nDA:22,0\nDA:24,0\nLF:11\nLH:4\nBRF:0\nBRH:0\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\data\\inMemoryRepository\\productRepository.ts\nFN:11,(anonymous_0)\nFN:37,(anonymous_1)\nFN:39,(anonymous_2)\nFNF:3\nFNH:0\nFNDA:0,(anonymous_0)\nFNDA:0,(anonymous_1)\nFNDA:0,(anonymous_2)\nDA:1,4\nDA:3,4\nDA:5,4\nDA:8,8\nDA:12,0\nDA:23,0\nDA:24,0\nDA:25,0\nDA:26,0\nDA:34,0\nDA:38,0\nDA:39,0\nLF:12\nLH:4\nBRF:0\nBRH:0\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\addItemToCart.ts\nFN:12,(anonymous_0)\nFN:17,(anonymous_1)\nFNF:2\nFNH:0\nFNDA:0,(anonymous_0)\nFNDA:0,(anonymous_1)\nDA:2,4\nDA:11,4\nDA:13,0\nDA:18,0\nLF:4\nLH:2\nBRF:0\nBRH:0\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\getAllProduct.ts\nFN:12,(anonymous_0)\nFN:16,(anonymous_1)\nFNF:2\nFNH:0\nFNDA:0,(anonymous_0)\nFNDA:0,(anonymous_1)\nDA:3,4\nDA:11,4\nDA:13,0\nDA:17,0\nLF:4\nLH:2\nBRF:0\nBRH:0\nend_of_record\nTN:\nSF:C:\\Users\\B7911\\Desktop\\vue-shopping-clean-architecture\\src\\usecases\\interactor\\getTotalCartItem.ts\nFN:11,(anonymous_0)\nFN:16,(anonymous_1)\nFNF:2\nFNH:0\nFNDA:0,(anonymous_0)\nFNDA:0,(anonymous_1)\nDA:2,4\nDA:10,4\nDA:12,0\nDA:17,0\nLF:4\nLH:2\nBRF:0\nBRH:0\nend_of_record\n"
  },
  {
    "path": "cypress.json",
    "content": "{\n  \"pluginsFile\": \"tests/e2e/plugins/index.js\"\n}\n"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel'\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"vue-shopping-clean-architecture\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"serve\": \"vue-cli-service serve\",\n    \"build\": \"vue-cli-service build\",\n    \"test:unit\": \"vue-cli-service test:unit\",\n    \"test:e2e\": \"vue-cli-service test:e2e\",\n    \"lint\": \"vue-cli-service lint\"\n  },\n  \"dependencies\": {\n    \"@types/lodash\": \"^4.14.149\",\n    \"@types/sinon\": \"^7.5.2\",\n    \"core-js\": \"^3.6.4\",\n    \"inversify\": \"^5.0.1\",\n    \"inversify-inject-decorators\": \"^3.1.0\",\n    \"lodash\": \"^4.17.15\",\n    \"reflect-metadata\": \"^0.1.13\",\n    \"register-service-worker\": \"^1.6.2\",\n    \"sinon\": \"^9.0.0\",\n    \"vue\": \"^2.6.11\",\n    \"vue-property-decorator\": \"^8.4.0\",\n    \"vue-router\": \"^3.1.5\",\n    \"vuetify\": \"^2.2.11\",\n    \"vuex\": \"^3.1.2\",\n    \"vuex-module-decorators\": \"^0.16.1\"\n  },\n  \"devDependencies\": {\n    \"@types/jest\": \"^24.0.19\",\n    \"@typescript-eslint/eslint-plugin\": \"^2.18.0\",\n    \"@typescript-eslint/parser\": \"^2.18.0\",\n    \"@vue/cli-plugin-babel\": \"~4.2.0\",\n    \"@vue/cli-plugin-e2e-cypress\": \"~4.2.0\",\n    \"@vue/cli-plugin-eslint\": \"~4.2.0\",\n    \"@vue/cli-plugin-pwa\": \"~4.2.0\",\n    \"@vue/cli-plugin-router\": \"~4.2.0\",\n    \"@vue/cli-plugin-typescript\": \"~4.2.0\",\n    \"@vue/cli-plugin-unit-jest\": \"~4.2.0\",\n    \"@vue/cli-plugin-vuex\": \"~4.2.0\",\n    \"@vue/cli-service\": \"~4.2.0\",\n    \"@vue/eslint-config-typescript\": \"^5.0.1\",\n    \"@vue/test-utils\": \"1.0.0-beta.31\",\n    \"eslint\": \"^6.7.2\",\n    \"eslint-plugin-vue\": \"^6.1.2\",\n    \"sass\": \"^1.19.0\",\n    \"sass-loader\": \"^8.0.0\",\n    \"typescript\": \"~3.7.5\",\n    \"vue-cli-plugin-vuetify\": \"~2.0.5\",\n    \"vue-template-compiler\": \"^2.6.11\",\n    \"vuetify-loader\": \"^1.3.0\"\n  }\n}\n"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n    <link rel=\"icon\" href=\"<%= BASE_URL %>favicon.ico\">\n    <title><%= htmlWebpackPlugin.options.title %></title>\n    <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900\">\n    <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css\">\n  </head>\n  <body>\n    <noscript>\n      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>\n    </noscript>\n    <div id=\"app\"></div>\n    <!-- built files will be auto injected -->\n  </body>\n</html>\n"
  },
  {
    "path": "public/robots.txt",
    "content": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "src/app/App.vue",
    "content": "<template>\n  <v-app>\n    <NavBar></NavBar>\n    <v-content>\n      <v-container fluid>\n        <router-view></router-view>\n      </v-container>\n    </v-content>\n  </v-app>\n</template>\n\n<script lang=\"ts\">\n  import Vue from 'vue';\n\n  import NavBar from './components/NavBar.vue'\n\n  export default Vue.extend({\n    name: 'App',\n\n    components: {NavBar},\n\n    data: () => ({\n      //\n    }),\n  });\n</script>\n"
  },
  {
    "path": "src/app/assets/app.css",
    "content": "* {\n    font-family: '-apple-system', 'HelveticaNeue', sans-serif;\n}"
  },
  {
    "path": "src/app/components/CartPreview.vue",
    "content": "<template>\n  <v-menu offset-y>\n    <template v-slot:activator=\"{on}\">\n      <v-btn color=\"success\" v-on=\"on\">\n        Checkout\n        <v-badge v-if=\"totalItem > 0\" :content=\"totalItem\" inline>\n        </v-badge>\n\n      </v-btn>\n    </template>\n    <v-card width=\"400\">\n      <v-list>\n        <v-list-item>\n\n          <v-list-item-content>\n            <v-list-item-title class=\"headline font-weight-bold\">Cart</v-list-item-title>\n          </v-list-item-content>\n\n        </v-list-item>\n      </v-list>\n\n      <v-divider></v-divider>\n      <v-card-text v-if=\"carts.length > 0\">\n\n        <v-list>\n\n          <v-list-item v-for=\"(item, idx) in carts\" :key=\"idx\">\n            <v-list-item-avatar>\n              <img :src=\"item.thumbnail\">\n            </v-list-item-avatar>\n\n            <v-list-item-content>\n              <v-list-item-title>{{ item.name }}</v-list-item-title>\n              <v-list-item-subtitle>{{ item.quantity }} item{{ item.quantity > 1 ? 's' : '' }}</v-list-item-subtitle>\n            </v-list-item-content>\n\n            <v-list-item-action>\n              <v-btn icon small>\n                <v-icon>mdi-delete</v-icon>\n              </v-btn>\n            </v-list-item-action>\n          </v-list-item>\n\n\n        </v-list>\n\n        <v-card-actions>\n          <v-btn block color=\"primary\" rounded @click=\"$route.name !== 'Checkout' && $router.push({name: 'Checkout'})\">\n            Proceed to checkout\n          </v-btn>\n        </v-card-actions>\n      </v-card-text>\n\n      <v-card-text v-else>\n        <p>No item</p>\n      </v-card-text>\n\n    </v-card>\n  </v-menu>\n\n</template>\n<script lang=\"ts\">\n  import Vue from 'vue'\n  import {getModule} from \"vuex-module-decorators\";\n  import {CartStore} from \"@/app/store/cart\";\n  import {Component} from \"vue-property-decorator\";\n\n\n  @Component\n  export default class CartPreview extends Vue {\n    get cartStore(): CartStore {\n      return getModule(CartStore, this.$store)\n    }\n\n    get totalItem() {\n      return this.cartStore.totalCartItem || 0;\n    }\n\n    get carts() {\n      return this.cartStore.items.map(cart => ({\n        thumbnail: cart.product.thumbnailUrl,\n        name: cart.product.name,\n        description: cart.product.description,\n        price: cart.product.price.toLocaleString(),\n        quantity: cart.quantity,\n        subtotal: (cart.quantity * cart.product.price).toLocaleString()\n      }))\n    }\n\n  }\n\n</script>"
  },
  {
    "path": "src/app/components/NavBar.vue",
    "content": "<template>\n  <v-app-bar\n      app\n      color=\"blue-grey darken-2\"\n      dark\n      elevation=\"1\"\n  >\n\n    <v-toolbar-title>Vue shopping</v-toolbar-title>\n\n    <div class=\"mr-3\"></div>\n\n    <v-btn @click=\"$route.name!=='Home' && $router.push({name: 'Home'})\" text>Home</v-btn>\n    <v-spacer/>\n\n    <CartPreview></CartPreview>\n\n  </v-app-bar>\n\n</template>\n<script lang=\"ts\">\n  import Vue from 'vue'\n  import CartPreview from \"@/app/components/CartPreview.vue\";\n\n  export default Vue.extend({\n    components: {CartPreview}\n  })\n</script>"
  },
  {
    "path": "src/app/components/Product.vue",
    "content": "<template>\n  <v-card hover outlined>\n    <v-card-text>\n\n      <v-img height=\"200\"\n             :src=\"product.thumbnailUrl\"/>\n\n      <p class=\"mt-6 mb-0 title success--text\">{{ product.name }}</p>\n\n      <p class=\"pink--text body-1\">${{ product.price.toLocaleString() }}</p>\n      <p>{{ product.description }}</p>\n\n      <v-btn block color=\"success\" @click=\"addToCart\" :loading=\"loading\">Add to cart</v-btn>\n\n    </v-card-text>\n  </v-card>\n</template>\n<script lang=\"ts\">\n  import Vue from 'vue'\n  import {CartStore} from \"@/app/store/cart\";\n  import {getModule} from \"vuex-module-decorators\";\n  import {Component, Prop} from \"vue-property-decorator\";\n  import {Product} from \"@/domain/entity\";\n\n\n  @Component\n  export default class ProductComponent extends Vue {\n    @Prop({required: true}) product!: Product\n\n    loading = false\n\n    get cartStore(): CartStore {\n      return getModule(CartStore, this.$store)\n    }\n\n    addToCart() {\n      this.loading = true;\n      this.cartStore.addProductToCart({product: this.product, quantity: 1})\n        .finally(() => {\n          this.loading = false\n        })\n    }\n  }\n</script>"
  },
  {
    "path": "src/app/components/ProductList.vue",
    "content": "<template>\n  <div>\n    <v-row>\n      <v-col :key=\"idx\" md=\"4\" sm=\"6\" v-for=\"(item ,idx) in products\" xs=\"12\">\n        <Product class=\"my-5\" :key=\"idx\" :product=\"item\"></Product>\n      </v-col>\n    </v-row>\n  </div>\n</template>\n<script lang=\"ts\">\n  import Vue from \"vue\";\n  import ProductComponent from \"@/app/components/Product.vue\";\n  import {ProductStore} from \"@/app/store/product\";\n  import {getModule} from \"vuex-module-decorators\";\n  import {Product} from \"@/domain/entity\";\n  import {Component} from \"vue-property-decorator\";\n  import {CartStore} from \"@/app/store/cart\";\n\n  @Component({\n    components: {\n      Product: ProductComponent\n    }\n  })\n  export default class ProductListComponent extends Vue {\n    loading = false\n\n    get productStore(): ProductStore {\n      return getModule(ProductStore, this.$store)\n    }\n\n    get products(): Product[] {\n      return this.productStore.items;\n    }\n\n  }\n</script>"
  },
  {
    "path": "src/app/main.ts",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\nimport './registerServiceWorker'\nimport router from './router'\nimport store from './store'\nimport vuetify from './plugins/vuetify';\nimport \"./assets/app.css\"\n\nVue.config.productionTip = false\n\nnew Vue({\n  router,\n  store,\n  // @ts-ignore\n  vuetify,\n  render: h => h(App)\n}).$mount('#app')\n"
  },
  {
    "path": "src/app/plugins/vuetify.ts",
    "content": "import Vue from 'vue';\nimport Vuetify from 'vuetify/lib';\nimport 'vuetify/dist/vuetify.min.css'\n\nVue.use(Vuetify);\n\nexport default new Vuetify({});\n"
  },
  {
    "path": "src/app/registerServiceWorker.ts",
    "content": "/* eslint-disable no-console */\n\nimport {register} from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'production') {\n  register(`${process.env.BASE_URL}service-worker.js`, {\n    ready() {\n      console.log(\n        'App is being served from cache by a service worker.\\n' +\n        'For more details, visit https://goo.gl/AFskqB'\n      )\n    },\n    registered() {\n      console.log('Service worker has been registered.')\n    },\n    cached() {\n      console.log('Content has been cached for offline use.')\n    },\n    updatefound() {\n      console.log('New content is downloading.')\n    },\n    updated() {\n      console.log('New content is available; please refresh.')\n    },\n    offline() {\n      console.log('No internet connection found. App is running in offline mode.')\n    },\n    error(error) {\n      console.error('Error during service worker registration:', error)\n    }\n  })\n}\n"
  },
  {
    "path": "src/app/router/index.ts",
    "content": "import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport Home from '../views/Home.vue'\nimport Checkout from \"@/app/views/Checkout.vue\";\n\nVue.use(VueRouter)\n\nconst routes = [\n  {\n    path: '/',\n    name: 'Home',\n    component: Home\n  },\n  {\n    path: '/checkout',\n    name: 'Checkout',\n    component: Checkout\n  },\n  {\n    path: '/about',\n    name: 'About',\n    // route level code-splitting\n    // this generates a separate chunk (about.[hash].js) for this route\n    // which is lazy-loaded when the route is visited.\n    component: () => import(/* webpackChunkName: \"about\" */ '../views/About.vue')\n  }\n]\n\nconst router = new VueRouter({\n  mode: 'history',\n  base: process.env.BASE_URL,\n  routes\n})\n\nexport default router\n"
  },
  {
    "path": "src/app/shims-tsx.d.ts",
    "content": "import Vue, {VNode} from 'vue'\n\ndeclare global {\n  namespace JSX {\n    // tslint:disable no-empty-interface\n    interface Element extends VNode {\n    }\n\n    // tslint:disable no-empty-interface\n    interface ElementClass extends Vue {\n    }\n\n    interface IntrinsicElements {\n      [elem: string]: any;\n    }\n  }\n}\n"
  },
  {
    "path": "src/app/shims-vue.d.ts",
    "content": "declare module '*.vue' {\n  import Vue from 'vue'\n  export default Vue\n}\ndeclare module 'vuetify/lib'"
  },
  {
    "path": "src/app/store/cart.ts",
    "content": "import {lazyInject} from \"@/di\";\r\nimport {Action, Module, Mutation, VuexModule} from \"vuex-module-decorators\";\r\nimport {Cart, Product} from \"@/domain/entity\";\r\nimport {AddItemToCart} from \"@/usecases/interactor/addItemToCart\";\r\nimport {ProceedCheckout} from \"@/usecases/interactor/proceedCheckout\";\r\n\r\nexport interface CartState {\r\n  items: Cart[];\r\n}\r\n\r\nexport interface AddProductToCartPayload {\r\n  product: Product;\r\n  quantity: number;\r\n}\r\n\r\n@Module({\r\n  name: \"cart\",\r\n  namespaced: true\r\n})\r\nexport class CartStore extends VuexModule implements CartState {\r\n  public items: Cart[] = [];\r\n  @lazyInject(\"AddItemToCart\") private addItemToCart!: AddItemToCart;\r\n  @lazyInject(\"ProceedCheckout\") private proceedCheckout!: ProceedCheckout;\r\n\r\n  get totalCartItem(): number {\r\n    return this.items.reduce((acc, cart) => acc + cart.quantity, 0);\r\n  }\r\n\r\n  get totalAmount(): number {\r\n    return this.items.reduce(\r\n      (acc, item) => acc + item.quantity * item.product.price,\r\n      0\r\n    );\r\n  }\r\n\r\n  @Mutation\r\n  clearCart() {\r\n    this.items = []\r\n  }\r\n\r\n  @Mutation\r\n  addItem(cart: Cart) {\r\n    const idx = this.items.findIndex(c => c.product.id === cart.product.id);\r\n    if (idx >= 0) {\r\n      this.items[idx].quantity += cart.quantity;\r\n    } else {\r\n      this.items.push(cart);\r\n    }\r\n  }\r\n\r\n  @Action\r\n  async addProductToCart({product, quantity}: AddProductToCartPayload) {\r\n    await this.addItemToCart.execute(product, quantity).toPromise();\r\n    this.addItem({\r\n      product: product,\r\n      quantity: quantity\r\n    } as Cart);\r\n  }\r\n\r\n  @Action\r\n  async checkout() {\r\n    await this.proceedCheckout.execute().toPromise();\r\n    this.clearCart()\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/app/store/index.ts",
    "content": "import Vue from \"vue\";\r\nimport Vuex from \"vuex\";\r\nimport {ProductState, ProductStore} from \"./product\";\r\nimport {CartState, CartStore} from \"./cart\";\r\nimport {getModule} from \"vuex-module-decorators\";\r\n\r\nVue.use(Vuex);\r\n\r\nexport interface RootState {\r\n  product: ProductState;\r\n  cart: CartState;\r\n}\r\n\r\nconst store = new Vuex.Store<RootState>({\r\n  modules: {\r\n    product: ProductStore,\r\n    cart: CartStore\r\n  }\r\n});\r\n\r\nexport default store;\r\n"
  },
  {
    "path": "src/app/store/product.ts",
    "content": "import { lazyInject } from \"@/di\";\r\n\r\nimport { Action, Module, Mutation, VuexModule } from \"vuex-module-decorators\";\r\nimport { Product } from \"@/domain/entity\";\r\nimport { GetAllProduct } from \"@/usecases/interactor/getAllProduct\";\r\n\r\nexport interface ProductState {\r\n  items: Product[];\r\n}\r\n\r\n@Module({\r\n  name: \"product\",\r\n  namespaced: true\r\n})\r\nexport class ProductStore extends VuexModule implements ProductState {\r\n  public items: Product[] = [];\r\n\r\n  @lazyInject(\"GetAllProduct\") private getAllProduct!: GetAllProduct;\r\n\r\n  @Mutation\r\n  setItems(items: Product[]) {\r\n    this.items = items;\r\n  }\r\n\r\n  @Action\r\n  async fetchItems() {\r\n    const list = await this.getAllProduct.execute().toPromise();\r\n    this.setItems(list);\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/app/views/About.vue",
    "content": "<template>\n  <div class=\"about\">\n    <h1>This is an about page</h1>\n  </div>\n</template>\n"
  },
  {
    "path": "src/app/views/Checkout.vue",
    "content": "<template>\n  <div>\n\n    <v-card v-if=\"!success\">\n      <v-data-table\n          :items=\"carts\"\n          :headers=\"headers\"\n          hide-default-footer\n      >\n        <template v-slot:item.thumbnailUrl=\"{item}\">\n          <v-img width=\"60\" :src=\"item.thumbnailUrl\"></v-img>\n        </template>\n        <template v-slot:item.product=\"{item}\">\n          <div class=\"d-flex flex-column py-3 \">\n            <span class=\"title success--text\">{{ item.product }}</span>\n            <span class=\"subtitle-2\">{{ item.description }}</span>\n          </div>\n        </template>\n      </v-data-table>\n      <v-card-actions class=\"pa-4\">\n        <v-btn @click=\"$router.push({name: 'Home'})\">Continue shopping</v-btn>\n        <v-spacer/>\n        <v-btn class=\"px-4\" color=\"primary\" @click=\"checkout\">Confirm</v-btn>\n      </v-card-actions>\n    </v-card>\n    <p class=\"text-center\" v-else>Your order has been made and will be proceeded soon.</p>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import {CartStore} from \"@/app/store/cart\";\n  import {getModule} from \"vuex-module-decorators\";\n  import {Component, Vue} from \"vue-property-decorator\";\n\n\n  @Component\n  export default class Checkout extends Vue {\n\n    headers = [\n      {value: \"thumbnailUrl\", width: 50, class: \"title\"},\n      {value: \"product\", text: \"Product\", width: 300, class: \"header\"},\n      {value: \"quantity\", text: \"Quantity\", class: \"header\"},\n      {value: \"price\", text: \"Price\", class: \"header\"},\n      {value: \"subtotal\", text: \"Subtotal\", class: \"header\"},\n\n    ]\n    success = false\n\n    get cartStore(): CartStore {\n      return getModule(CartStore, this.$store)\n    }\n\n    get carts() {\n      return this.cartStore.items.map(item => ({\n        thumbnailUrl: item.product.thumbnailUrl,\n        product: item.product.name,\n        description: item.product.description,\n        quantity: item.quantity,\n        price: `$${item.product.price.toLocaleString()}`,\n        subtotal: `$${(item.quantity * item.product.price).toLocaleString()}`,\n      }))\n    }\n\n    async checkout() {\n      await this.cartStore.checkout()\n      this.success = true\n    }\n  }\n</script>\n\n<style>\n  .header {\n    font-size: 0.9em !important;\n  }\n</style>"
  },
  {
    "path": "src/app/views/Home.vue",
    "content": "<template>\n  <div class=\"home\">\n    <ProductList></ProductList>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import ProductList from \"@/app/components/ProductList.vue\" ;\n  import {ProductStore} from \"@/app/store/product\";\n  import {getModule} from \"vuex-module-decorators\";\n  import {Component, Vue} from \"vue-property-decorator\";\n\n  @Component({\n    components: {ProductList}\n  })\n  export default class Home extends Vue {\n    get productStore(): ProductStore {\n      return getModule(ProductStore, this.$store)\n    }\n\n    created() {\n      this.productStore.fetchItems()\n    }\n  }\n</script>\n"
  },
  {
    "path": "src/data/inMemoryRepository/cartRepository.ts",
    "content": "import {Observable, of} from \"rxjs\";\r\nimport {tap, map} from \"rxjs/operators\";\r\nimport {injectable} from \"inversify\";\r\nimport {Cart, Product} from \"@/domain/entity\";\r\nimport CartRepository from \"@/usecases/repository/cartRepository\";\r\n\r\n@injectable()\r\nexport default class CartRepositoryImpl implements CartRepository {\r\n  private _carts: Cart[] = [];\r\n\r\n  public addItemToCart(product: Product, quantity: number): Observable<void> {\r\n    this._carts.push({product, quantity});\r\n    return of(1).pipe(\r\n      // delay(1000),\r\n      map(() => {\r\n        return;\r\n      })\r\n    );\r\n  }\r\n\r\n  public getTotalCartItem(): Observable<number> {\r\n    const val = this._carts.length;\r\n    return of(null).pipe(\r\n      // delay(1000),\r\n      map(() => val)\r\n    );\r\n  }\r\n\r\n  proceedCheckout(): Observable<void> {\r\n    return of(null).pipe(\r\n      tap(() => {\r\n        this._carts = []\r\n      }),\r\n      map(() => {\r\n        return\r\n      })\r\n    );\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/data/inMemoryRepository/productRepository.ts",
    "content": "import {Observable, of} from \"rxjs\";\r\n\r\nimport {injectable} from \"inversify\";\r\nimport {Product} from \"@/domain/entity\";\r\nimport {map} from \"rxjs/operators\";\r\n\r\n@injectable()\r\nexport default class ProductRepositoryImpl {\r\n  readonly _products: Product[];\r\n\r\n  constructor() {\r\n    const _images = [\r\n      \"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img1.jpg?raw=1\",\r\n      \"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img2.jpg?raw=1\",\r\n      \"https://www.dropbox.com/s/78fot6w894stu3n/img3.jpg?raw=1\",\r\n      \"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img4.jpg?raw=1\",\r\n      \"https://www.dropbox.com/s/d45c3pap1h4cu0y/img5.jpg?raw=1\",\r\n      \"https://www.dropbox.com/s/rjj1vtdx79xptu0/img6.jpeg?raw=1\",\r\n      \"https://www.dropbox.com/s/miym588nx2lscqt/img7.jpg?raw=1\",\r\n      \"https://www.dropbox.com/s/miym588nx2lscqt/img8.jpg?raw=1\",\r\n      \"https://www.dropbox.com/s/swg9bdr0ejcbtrl/img9.jpg?raw=1\",\r\n    ]\r\n    const products = []\r\n    for (let i = 0; i < 20; i++) {\r\n      products.push({\r\n        id: `${i + 1}`,\r\n        name: `Product ${i + 1}`,\r\n        price: 2200,\r\n        thumbnailUrl: _images[Math.floor(Math.random() * (_images.length - 1))],\r\n        description: \"3.0GHz Dual-core Haswell Intel Core i5 Turbo Boost up to 3.2 GHz, 3MB L3 cache 8GB (two 4GB SO-DIMMs...\"\r\n      })\r\n    }\r\n    this._products = products\r\n  }\r\n\r\n  public getAll(): Observable<Product[]> {\r\n    return of(null).pipe(\r\n      map(() => this._products)\r\n    )\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/di.ts",
    "content": "import \"reflect-metadata\";\r\nimport {Container} from \"inversify\";\r\nimport getDecorators from \"inversify-inject-decorators\";\r\nimport CartRepository from \"@/usecases/repository/cartRepository\";\r\nimport ProductRepository from \"@/usecases/repository/productRepository\";\r\nimport CartRepositoryImpl from \"@/data/inMemoryRepository/cartRepository\";\r\nimport ProductRepositoryImpl from \"@/data/inMemoryRepository/productRepository\";\r\nimport {AddItemToCart, AddItemToCartImpl} from \"@/usecases/interactor/addItemToCart\";\r\nimport {GetAllProduct, GetAllProductImpl} from \"@/usecases/interactor/getAllProduct\";\r\nimport {GetTotalCartItem, GetTotalCartItemImpl} from \"@/usecases/interactor/getTotalCartItem\";\r\nimport {ProceedCheckout, ProceedCheckoutImpl} from \"@/usecases/interactor/proceedCheckout\";\r\nimport {ProductStore} from \"@/app/store/product\";\r\nimport {getModule} from \"vuex-module-decorators\";\r\n\r\nconst container = new Container();\r\n\r\ncontainer\r\n  .bind<CartRepository>(\"CartRepository\")\r\n  .to(CartRepositoryImpl)\r\n  .inSingletonScope();\r\ncontainer\r\n  .bind<ProductRepository>(\"ProductRepository\")\r\n  .to(ProductRepositoryImpl)\r\n  .inSingletonScope();\r\n\r\ncontainer\r\n  .bind<AddItemToCart>(\"AddItemToCart\")\r\n  .to(AddItemToCartImpl)\r\n  .inSingletonScope();\r\ncontainer\r\n  .bind<GetAllProduct>(\"GetAllProduct\")\r\n  .to(GetAllProductImpl)\r\n  .inSingletonScope();\r\ncontainer\r\n  .bind<GetTotalCartItem>(\"GetTotalCartItem\")\r\n  .to(GetTotalCartItemImpl)\r\n  .inSingletonScope();\r\ncontainer\r\n  .bind<ProceedCheckout>(\"ProceedCheckout\")\r\n  .to(ProceedCheckoutImpl)\r\n  .inSingletonScope();\r\n\r\nconst {lazyInject} = getDecorators(container);\r\nexport {lazyInject, container};\r\n"
  },
  {
    "path": "src/domain/entity/index.ts",
    "content": "export interface Product {\r\n  id?: string;\r\n  name: string;\r\n  price: number;\r\n  description?: string;\r\n  thumbnailUrl?: string;\r\n}\r\n\r\nexport interface Cart {\r\n  product: Product;\r\n  quantity: number;\r\n}"
  },
  {
    "path": "src/main.ts",
    "content": "import \"./app/main\""
  },
  {
    "path": "src/usecases/interactor/addItemToCart.ts",
    "content": "import {Observable} from \"rxjs\";\r\nimport {inject, injectable} from \"inversify\";\r\nimport {Product} from \"@/domain/entity\";\r\nimport CartRepository from \"@/usecases/repository/cartRepository\";\r\n\r\nexport interface AddItemToCart {\r\n  execute(product: Product, quantity: number): Observable<void>;\r\n}\r\n\r\n@injectable()\r\nexport class AddItemToCartImpl implements AddItemToCart {\r\n  constructor(\r\n    @inject(\"CartRepository\") private cartRepository: CartRepository\r\n  ) {\r\n  }\r\n\r\n  execute(product: Product, quantity: number): Observable<void> {\r\n    return this.cartRepository.addItemToCart(product, quantity);\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/usecases/interactor/getAllProduct.ts",
    "content": "import { Product } from \"@/domain/entity\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { inject, injectable } from \"inversify\";\r\nimport ProductRepository from \"@/usecases/repository/productRepository\";\r\n\r\nexport interface GetAllProduct {\r\n  execute(): Observable<Product[]>;\r\n}\r\n\r\n@injectable()\r\nexport class GetAllProductImpl implements GetAllProduct {\r\n  constructor(\r\n    @inject(\"ProductRepository\") public productRepo: ProductRepository\r\n  ) {}\r\n\r\n  execute(): Observable<Product[]> {\r\n    return this.productRepo.getAll();\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/usecases/interactor/getTotalCartItem.ts",
    "content": "import {Observable} from \"rxjs\";\r\nimport {inject, injectable} from \"inversify\";\r\nimport CartRepository from \"@/usecases/repository/cartRepository\";\r\n\r\nexport interface GetTotalCartItem {\r\n  execute(): Observable<number>;\r\n}\r\n\r\n@injectable()\r\nexport class GetTotalCartItemImpl implements GetTotalCartItem {\r\n  constructor(\r\n    @inject(\"CartRepository\") private cartRepository: CartRepository\r\n  ) {\r\n  }\r\n\r\n  execute(): Observable<number> {\r\n    return this.cartRepository.getTotalCartItem()\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/usecases/interactor/proceedCheckout.ts",
    "content": "import {Observable} from \"rxjs\";\nimport {inject, injectable} from \"inversify\";\nimport CartRepository from \"@/usecases/repository/cartRepository\";\n\nexport interface ProceedCheckout {\n  execute(): Observable<void>;\n}\n\n@injectable()\nexport class ProceedCheckoutImpl implements ProceedCheckout {\n  constructor(\n    @inject(\"CartRepository\") private cartRepository: CartRepository\n  ) {\n  }\n\n  execute(): Observable<void> {\n    return this.cartRepository.proceedCheckout();\n  }\n}\n"
  },
  {
    "path": "src/usecases/repository/cartRepository.ts",
    "content": "import {Observable} from \"rxjs\";\r\nimport {Product} from \"@/domain/entity\";\r\n\r\nexport default interface CartRepository {\r\n  addItemToCart(product: Product, quantity: number): Observable<void>;\r\n\r\n  getTotalCartItem(): Observable<number>;\r\n\r\n  proceedCheckout(): Observable<void>;\r\n}\r\n"
  },
  {
    "path": "src/usecases/repository/productRepository.ts",
    "content": "import {Product} from \"@/domain/entity\";\r\nimport {Observable} from \"rxjs\";\r\n\r\nexport default interface ProductRepository {\r\n  getAll(): Observable<Product[]>;\r\n}\r\n"
  },
  {
    "path": "tests/e2e/.eslintrc.js",
    "content": "module.exports = {\n  plugins: [\n    'cypress'\n  ],\n  env: {\n    mocha: true,\n    'cypress/globals': true\n  },\n  rules: {\n    strict: 'off'\n  }\n}\n"
  },
  {
    "path": "tests/e2e/plugins/index.js",
    "content": "/* eslint-disable arrow-body-style */\n// https://docs.cypress.io/guides/guides/plugins-guide.html\n\n// if you need a custom webpack configuration you can uncomment the following import\n// and then use the `file:preprocessor` event\n// as explained in the cypress docs\n// https://docs.cypress.io/api/plugins/preprocessors-api.html#Examples\n\n// /* eslint-disable import/no-extraneous-dependencies, global-require */\n// const webpack = require('@cypress/webpack-preprocessor')\n\nmodule.exports = (on, config) => {\n  // on('file:preprocessor', webpack({\n  //  webpackOptions: require('@vue/cli-service/webpack.config'),\n  //  watchOptions: {}\n  // }))\n\n  return Object.assign({}, config, {\n    fixturesFolder: 'tests/e2e/fixtures',\n    integrationFolder: 'tests/e2e/specs',\n    screenshotsFolder: 'tests/e2e/screenshots',\n    videosFolder: 'tests/e2e/videos',\n    supportFile: 'tests/e2e/support/index.js'\n  })\n}\n"
  },
  {
    "path": "tests/e2e/specs/test.js",
    "content": "// https://docs.cypress.io/api/introduction/api.html\n\ndescribe('My First Test', () => {\n  it('Visits the app root url', () => {\n    cy.visit('/')\n    cy.contains('h1', 'Welcome to Your Vue.js + TypeScript App')\n  })\n})\n"
  },
  {
    "path": "tests/e2e/support/commands.js",
    "content": "// ***********************************************\n// This example commands.js shows you how to\n// create various custom commands and overwrite\n// existing commands.\n//\n// For more comprehensive examples of custom\n// commands please read more here:\n// https://on.cypress.io/custom-commands\n// ***********************************************\n//\n//\n// -- This is a parent command --\n// Cypress.Commands.add(\"login\", (email, password) => { ... })\n//\n//\n// -- This is a child command --\n// Cypress.Commands.add(\"drag\", { prevSubject: 'element'}, (subject, options) => { ... })\n//\n//\n// -- This is a dual command --\n// Cypress.Commands.add(\"dismiss\", { prevSubject: 'optional'}, (subject, options) => { ... })\n//\n//\n// -- This is will overwrite an existing command --\n// Cypress.Commands.overwrite(\"visit\", (originalFn, url, options) => { ... })\n"
  },
  {
    "path": "tests/e2e/support/index.js",
    "content": "// ***********************************************************\n// This example support/index.js is processed and\n// loaded automatically before your test files.\n//\n// This is a great place to put global configuration and\n// behavior that modifies Cypress.\n//\n// You can change the location of this file or turn off\n// automatically serving support files with the\n// 'supportFile' configuration option.\n//\n// You can read more here:\n// https://on.cypress.io/configuration\n// ***********************************************************\n\n// Import commands.js using ES2015 syntax:\nimport './commands'\n\n// Alternatively you can use CommonJS syntax:\n// require('./commands')\n"
  },
  {
    "path": "tests/unit/components/Product.spec.ts",
    "content": "import ProductComponent from \"@/app/components/Product.vue\";\nimport Vue from 'vue'\n\nimport { shallowMount, mount, createLocalVue, Wrapper } from \"@vue/test-utils\";\nimport { Product } from \"@/domain/entity\";\n\nimport vuetify from \"vuetify\";\nconst product: Product = {\n  id: \"1\",\n  name: \"test 1\",\n  price: 1000,\n  thumbnailUrl: \"\"\n} as Product;\n\ndescribe(\"Product.vue\", () => {\n  beforeEach(() => {});\n  it(\"should contains product info\", () => {\n    Vue.use(vuetify);\n    const wrapper = mount(ProductComponent, {\n      propsData: {\n        product\n      }\n    });\n    expect(wrapper.text()).toContain(product.name);\n  });\n});\n"
  },
  {
    "path": "tests/unit/components/ProductList.spec.ts",
    "content": "import ProductComponent from '@/app/components/Product.vue';\nimport ProductList from \"@/app/components/ProductList.vue\";\nimport Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport * as _ from \"lodash\";\n\nimport { shallowMount, mount, createLocalVue, Wrapper } from \"@vue/test-utils\";\nimport { Product } from \"@/domain/entity\";\n\nimport vuetify from \"vuetify\";\nimport { CartStore } from \"@/app/store/cart\";\nimport { getModule } from \"vuex-module-decorators\";\nimport { ProductStore } from \"@/app/store/product\";\nconst products: Product[] = [\n  {\n    id: \"1\",\n    name: \"test 1\",\n    price: 1000,\n    thumbnailUrl: \"\"\n  },\n  {\n    id: \"1\",\n    name: \"test 1\",\n    price: 1000,\n    thumbnailUrl: \"\"\n  }\n];\n\ndescribe(\"ProductList.vue\", () => {\n  let productStore: ProductStore;\n  beforeEach(() => {});\n  it(\"should render Product.vue\", async () => {\n    Vue.use(vuetify);\n    Vue.use(Vuex);\n    const store = new Vuex.Store({\n      modules: { product: _.cloneDeep(ProductStore) }\n    });\n    productStore = getModule(ProductStore, store);\n    productStore.setItems(products);\n\n    // execute\n    const wrapper = mount(ProductList, {\n      store\n    });\n\n    await Vue.nextTick();\n    // assert\n    console.log(wrapper.findAll('Product'))\n    expect(wrapper.findAll(ProductComponent).length).toEqual(products.length);\n  });\n});\n"
  },
  {
    "path": "tests/unit/store/cart.spec.ts",
    "content": "import Vuex from \"vuex\";\nimport { createLocalVue } from \"@vue/test-utils\";\nimport { getModule } from \"vuex-module-decorators\";\nimport { container } from \"@/di\";\nimport { from, of } from \"rxjs\";\nimport sinon from \"sinon\";\nimport { injectable } from \"inversify\";\nimport { Product } from \"@/domain/entity\";\nimport { CartStore } from \"@/app/store/cart\";\nimport { AddItemToCart } from \"@/usecases/interactor/addItemToCart\";\nimport * as _ from \"lodash\";\n\ncontainer.unbindAll();\n\n@injectable()\nclass MockAddItemToCart implements AddItemToCart {\n  execute(product: Product, quantity: number): import(\"rxjs\").Observable<void> {\n    throw new Error(\"Method not implemented.\");\n  }\n}\n\ncontainer\n  .bind<AddItemToCart>(\"AddItemToCart\")\n  .to(MockAddItemToCart)\n  .inSingletonScope();\nconst mockUseCase = container.get<AddItemToCart>(\"AddItemToCart\");\n\nconst sandbox = sinon.createSandbox();\n\ndescribe(\"CartStore\", () => {\n  describe(\"[Actions]\", () => {\n    describe(\"addProductToCart()\", () => {\n      let module: CartStore;\n\n      beforeEach(() => {\n        const localVue = createLocalVue();\n        localVue.use(Vuex);\n        const store = new Vuex.Store({\n          modules: { cart: _.cloneDeep(CartStore) }\n        });\n        module = getModule(CartStore, store);\n      });\n      afterEach(() => {\n        sandbox.restore();\n      });\n      it(\"should execute usecase: AddItemToCart\", async () => {\n        // setup\n        const spy = sandbox.stub(mockUseCase, \"execute\");\n        spy.callsFake(() => of());\n\n        // execute\n        const product: Product = { name: \"test\", price: 999 };\n        const params = { product: product, quantity: 1 };\n        await module.addProductToCart(params);\n\n        // assert\n        expect(spy.calledOnce).toBe(true);\n      });\n      it(\"should update state\", async () => {\n        const spy = sandbox.stub(mockUseCase, \"execute\");\n        spy.callsFake(() => of());\n\n        // execute\n        const product1: Product = { id: \"1\", name: \"test 1\", price: 999 };\n        const product2: Product = { id: \"2\", name: \"test 2\", price: 999 };\n        await module.addProductToCart({ product: product1, quantity: 1 });\n\n        // assert\n        expect(module.items.length).toEqual(1);\n        // add the same product to cart, the quantity is increased but the number of item is the same\n        await module.addProductToCart({ product: product1, quantity: 1 });\n        expect(module.items.length).toEqual(1);\n        // add another product, the item should be increased\n        await module.addProductToCart({ product: product2, quantity: 1 });\n        expect(module.items.length).toEqual(2);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "tests/unit/store/product.spec.ts",
    "content": "import { ProductStore } from \"./../../../src/app/store/product\";\nimport Vuex from \"vuex\";\nimport { createLocalVue } from \"@vue/test-utils\";\nimport { getModule } from \"vuex-module-decorators\";\nimport { container } from \"@/di\";\nimport sinon from \"sinon\";\nimport { GetAllProduct } from \"@/usecases/interactor/getAllProduct\";\nimport { injectable } from \"inversify\";\nimport { of } from \"rxjs\";\nimport { Product } from \"@/domain/entity\";\n\ncontainer.unbindAll();\n\n@injectable()\nclass MockGetAllProduct implements GetAllProduct {\n  execute(): import(\"rxjs\").Observable<\n    import(\"../../../src/domain/entity\").Product[]\n  > {\n    throw new Error(\"Method not implemented.\");\n  }\n}\ncontainer\n  .bind<GetAllProduct>(\"GetAllProduct\")\n  .to(MockGetAllProduct)\n  .inSingletonScope();\nconst mockUseCase = container.get<GetAllProduct>(\"GetAllProduct\");\n\nconst sandbox = sinon.createSandbox();\n\ndescribe(\"ProductStore\", () => {\n  describe(\"[Actions]\", () => {\n    describe(\"fetchAll()\", () => {\n      beforeEach(() => {});\n      afterEach(() => {\n        sandbox.restore();\n      });\n      it(\"should execute usecase: GetAllProduct\", async () => {\n        // setup\n        const localVue = createLocalVue();\n        localVue.use(Vuex);\n        const store = new Vuex.Store({ modules: { product: ProductStore } });\n        const module = getModule(ProductStore, store);\n        const spy = sandbox.stub(mockUseCase, \"execute\");\n        spy.callsFake(() => of([]));\n\n        // execute\n        await module.fetchItems();\n\n        // assert\n        expect(spy.calledOnce).toBe(true);\n      });\n\n      it(\"should call mutation: setItems\", async () => {\n        // setup\n        const localVue = createLocalVue();\n        localVue.use(Vuex);\n        const store = new Vuex.Store({ modules: { product: ProductStore } });\n        const module = getModule(ProductStore, store);\n        const spy = sandbox.stub(mockUseCase, \"execute\");\n        spy.callsFake(() => of([]));\n        const mutation = sandbox.spy(module, \"setItems\");\n\n        // execute\n        await module.fetchItems();\n\n        // assert\n        expect(mutation.calledOnce).toBe(true);\n      });\n    });\n  });\n\n  describe(\"[Mutations]\", () => {\n    describe(\"setItems()\", () => {\n      beforeEach(() => {});\n      afterEach(() => {\n        sandbox.restore();\n      });\n      it(\"should update list item state\", () => {\n        // setup\n        const localVue = createLocalVue();\n        localVue.use(Vuex);\n        const store = new Vuex.Store({ modules: { product: ProductStore } });\n        const module = getModule(ProductStore, store);\n\n        // execute\n        const products: Product[] = [];\n        module.setItems(products);\n        \n        // assert\n        expect(module.items).toEqual(products);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"experimentalDecorators\": true,\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"noUnusedLocals\": false,\n    \"noUnusedParameters\": false,\n    \"importHelpers\": true,\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"sourceMap\": true,\n    \"baseUrl\": \".\",\n    \"types\": [\n      \"webpack-env\",\n      \"jest\"\n    ],\n    \"paths\": {\n      \"@/*\": [\n        \"src/*\"\n      ]\n    },\n    \"lib\": [\n      \"esnext\",\n      \"dom\",\n      \"dom.iterable\",\n      \"scripthost\"\n    ]\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.tsx\",\n    \"src/**/*.vue\",\n    \"tests/**/*.ts\",\n    \"tests/**/*.tsx\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}"
  },
  {
    "path": "vue.config.js",
    "content": "module.exports = {\n  \"publicPath\": process.env.NODE_ENV === \"production\" ? \"/vue-shopping\" : \"/\",\n  \"transpileDependencies\": [\n    \"vuetify\"\n  ]\n}\n"
  }
]