From 6c7f6ad95152d23d3438ad53a0b8d0eed704e793 Mon Sep 17 00:00:00 2001 From: Manan Habib Date: Wed, 10 Aug 2022 05:46:32 +0500 Subject: [PATCH 01/25] Initial commit --- .gitignore | 21 + aws.env | 7 + coverage/clover.xml | 101 + coverage/coverage-final.json | 8 + coverage/lcov-report/base.css | 224 + coverage/lcov-report/block-navigation.js | 87 + .../dataSources/datasources.ts.html | 100 + coverage/lcov-report/dataSources/index.html | 116 + coverage/lcov-report/favicon.png | Bin 0 -> 445 bytes coverage/lcov-report/index.html | 191 + coverage/lcov-report/prettify.css | 1 + coverage/lcov-report/prettify.js | 2 + .../resolvers/coordinates/index.html | 116 + .../resolvers/coordinates/query.ts.html | 97 + coverage/lcov-report/resolvers/index.html | 116 + .../lcov-report/resolvers/resolvers.ts.html | 145 + .../lcov-report/schema/customScalars.ts.html | 166 + coverage/lcov-report/schema/index.html | 131 + coverage/lcov-report/schema/schema.ts.html | 106 + coverage/lcov-report/services/index.html | 116 + .../services/locationService.ts.html | 238 + coverage/lcov-report/sort-arrow-sprite.png | Bin 0 -> 138 bytes coverage/lcov-report/sorter.js | 196 + .../lcov-report/src/configs/config.ts.html | 163 + coverage/lcov-report/src/configs/index.html | 116 + .../src/dataSources/datasources.ts.html | 100 + .../lcov-report/src/dataSources/index.html | 116 + .../src/resolvers/coordinates/index.html | 116 + .../src/resolvers/coordinates/query.ts.html | 97 + coverage/lcov-report/src/resolvers/index.html | 116 + .../src/resolvers/resolvers.ts.html | 133 + .../src/schema/customScalars.ts.html | 166 + coverage/lcov-report/src/schema/index.html | 131 + .../lcov-report/src/schema/schema.ts.html | 106 + coverage/lcov-report/src/services/index.html | 116 + .../src/services/locationService.ts.html | 238 + .../lcov-report/src/utils/helpers.ts.html | 175 + coverage/lcov-report/src/utils/index.html | 116 + .../lcov-report/tests/e2e/e2eConfig.ts.html | 118 + coverage/lcov-report/tests/e2e/index.html | 116 + coverage/lcov-report/utils/helpers.ts.html | 175 + coverage/lcov-report/utils/index.html | 116 + coverage/lcov.info | 144 + development.env | 12 + iac/aws/api_gateway/aws_proxy/main.tf | 69 + iac/aws/lambda/main.tf | 46 + iac/aws/lambda/role/role.tf | 45 + jest.config.ts | 11 + main.tf | 70 + package-lock.json | 4633 +++++++++++++++++ package.json | 38 + src/configs/config.ts | 27 + src/dataSources/datasources.ts | 6 + src/graphql_lambda.ts | 39 + src/index.ts | 26 + src/resolvers/coordinates/query.ts | 5 + src/resolvers/resolvers.ts | 20 + src/schema/customScalars.ts | 28 + src/schema/schema.graphql | 16 + src/schema/schema.ts | 8 + src/services/locationService.ts | 52 + src/utils/helpers.ts | 31 + test.env | 10 + tests/e2e/e2eConfig.ts | 12 + tests/e2e/getCoordinates.query.test.ts | 55 + tests/unit/schema/customScalars.test.ts | 52 + .../locationService/locationService.test.ts | 66 + tsconfig.json | 104 + 68 files changed, 10440 insertions(+) create mode 100644 .gitignore create mode 100644 aws.env create mode 100644 coverage/clover.xml create mode 100644 coverage/coverage-final.json create mode 100644 coverage/lcov-report/base.css create mode 100644 coverage/lcov-report/block-navigation.js create mode 100644 coverage/lcov-report/dataSources/datasources.ts.html create mode 100644 coverage/lcov-report/dataSources/index.html create mode 100644 coverage/lcov-report/favicon.png create mode 100644 coverage/lcov-report/index.html create mode 100644 coverage/lcov-report/prettify.css create mode 100644 coverage/lcov-report/prettify.js create mode 100644 coverage/lcov-report/resolvers/coordinates/index.html create mode 100644 coverage/lcov-report/resolvers/coordinates/query.ts.html create mode 100644 coverage/lcov-report/resolvers/index.html create mode 100644 coverage/lcov-report/resolvers/resolvers.ts.html create mode 100644 coverage/lcov-report/schema/customScalars.ts.html create mode 100644 coverage/lcov-report/schema/index.html create mode 100644 coverage/lcov-report/schema/schema.ts.html create mode 100644 coverage/lcov-report/services/index.html create mode 100644 coverage/lcov-report/services/locationService.ts.html create mode 100644 coverage/lcov-report/sort-arrow-sprite.png create mode 100644 coverage/lcov-report/sorter.js create mode 100644 coverage/lcov-report/src/configs/config.ts.html create mode 100644 coverage/lcov-report/src/configs/index.html create mode 100644 coverage/lcov-report/src/dataSources/datasources.ts.html create mode 100644 coverage/lcov-report/src/dataSources/index.html create mode 100644 coverage/lcov-report/src/resolvers/coordinates/index.html create mode 100644 coverage/lcov-report/src/resolvers/coordinates/query.ts.html create mode 100644 coverage/lcov-report/src/resolvers/index.html create mode 100644 coverage/lcov-report/src/resolvers/resolvers.ts.html create mode 100644 coverage/lcov-report/src/schema/customScalars.ts.html create mode 100644 coverage/lcov-report/src/schema/index.html create mode 100644 coverage/lcov-report/src/schema/schema.ts.html create mode 100644 coverage/lcov-report/src/services/index.html create mode 100644 coverage/lcov-report/src/services/locationService.ts.html create mode 100644 coverage/lcov-report/src/utils/helpers.ts.html create mode 100644 coverage/lcov-report/src/utils/index.html create mode 100644 coverage/lcov-report/tests/e2e/e2eConfig.ts.html create mode 100644 coverage/lcov-report/tests/e2e/index.html create mode 100644 coverage/lcov-report/utils/helpers.ts.html create mode 100644 coverage/lcov-report/utils/index.html create mode 100644 coverage/lcov.info create mode 100644 development.env create mode 100644 iac/aws/api_gateway/aws_proxy/main.tf create mode 100644 iac/aws/lambda/main.tf create mode 100644 iac/aws/lambda/role/role.tf create mode 100644 jest.config.ts create mode 100644 main.tf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/configs/config.ts create mode 100644 src/dataSources/datasources.ts create mode 100644 src/graphql_lambda.ts create mode 100644 src/index.ts create mode 100644 src/resolvers/coordinates/query.ts create mode 100644 src/resolvers/resolvers.ts create mode 100644 src/schema/customScalars.ts create mode 100644 src/schema/schema.graphql create mode 100644 src/schema/schema.ts create mode 100644 src/services/locationService.ts create mode 100644 src/utils/helpers.ts create mode 100644 test.env create mode 100644 tests/e2e/e2eConfig.ts create mode 100644 tests/e2e/getCoordinates.query.test.ts create mode 100644 tests/unit/schema/customScalars.test.ts create mode 100644 tests/unit/services/locationService/locationService.test.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7c68d32 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# See https://help.github.com/ignore-files/ for more about ignoring files. +# dependencies +/node_modules +/.idea +/dist +/build +/.terraform +# misc +.DS_Store +.env* + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.env +build +iac/deployment/test/terraform.tfstate +.terraform.lock.hcl +terraform.tfstate.backup +terraform.tfstate + diff --git a/aws.env b/aws.env new file mode 100644 index 0000000..1978329 --- /dev/null +++ b/aws.env @@ -0,0 +1,7 @@ +NODE_ENV="aws" + +# Google Geocode API +GOOGLE_MAPS_KEY='AIzaSyBj1aLo0X1uH7CKoi3bXPFPdX6eeCra4e8' + +# Debug +LOG_LEVEL='error' diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 0000000..f475bd1 --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 0000000..f0a3485 --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,8 @@ +{"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\dataSources\\datasources.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\dataSources\\datasources.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"2":{"start":{"line":4,"column":27},"end":{"line":6,"column":2}},"3":{"start":{"line":4,"column":34},"end":{"line":6,"column":2}},"4":{"start":{"line":4,"column":13},"end":{"line":4,"column":27}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":30}},"loc":{"start":{"line":4,"column":34},"end":{"line":6,"column":2}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":2,"4":1},"f":{"0":2},"b":{}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\resolvers\\resolvers.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\resolvers\\resolvers.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":57}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":55}},"2":{"start":{"line":4,"column":27},"end":{"line":10,"column":null}},"3":{"start":{"line":6,"column":8},"end":{"line":8,"column":23}},"4":{"start":{"line":12,"column":14},"end":{"line":12,"column":36}},"5":{"start":{"line":14,"column":13},"end":{"line":19,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":17}},"loc":{"start":{"line":5,"column":26},"end":{"line":9,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":15},"end":{"line":8,"column":22}},"type":"cond-expr","locations":[{"start":{"line":7,"column":9},"end":{"line":7,"column":16}},{"start":{"line":8,"column":9},"end":{"line":8,"column":22}}]}},"s":{"0":1,"1":1,"2":1,"3":2,"4":1,"5":1},"f":{"0":2},"b":{"0":[1,1]}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\resolvers\\coordinates\\query.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\resolvers\\coordinates\\query.ts","statementMap":{"0":{"start":{"line":3,"column":8},"end":{"line":3,"column":78}},"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":11},"end":{"line":2,"column":16}},"loc":{"start":{"line":2,"column":85},"end":{"line":4,"column":5}}}},"branchMap":{},"s":{"0":2,"1":1},"f":{"0":2},"b":{}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\schema\\customScalars.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\schema\\customScalars.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":4,"column":13},"end":{"line":28,"column":5}},"2":{"start":{"line":8,"column":6},"end":{"line":10,"column":null}},"3":{"start":{"line":9,"column":8},"end":{"line":9,"column":77}},"4":{"start":{"line":11,"column":6},"end":{"line":13,"column":null}},"5":{"start":{"line":12,"column":8},"end":{"line":12,"column":80}},"6":{"start":{"line":15,"column":6},"end":{"line":15,"column":null}},"7":{"start":{"line":18,"column":8},"end":{"line":20,"column":null}},"8":{"start":{"line":19,"column":10},"end":{"line":19,"column":79}},"9":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"10":{"start":{"line":22,"column":10},"end":{"line":22,"column":82}},"11":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":15},"end":{"line":7,"column":16}},"loc":{"start":{"line":7,"column":42},"end":{"line":16,"column":5}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":16},"end":{"line":17,"column":17}},"loc":{"start":{"line":17,"column":43},"end":{"line":26,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":6},"end":{"line":10,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":6},"end":{"line":10,"column":null}}]},"1":{"loc":{"start":{"line":11,"column":6},"end":{"line":13,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":6},"end":{"line":13,"column":null}}]},"2":{"loc":{"start":{"line":18,"column":8},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":20,"column":null}}]},"3":{"loc":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":8},"end":{"line":23,"column":null}}]}},"s":{"0":2,"1":2,"2":3,"3":1,"4":2,"5":1,"6":1,"7":7,"8":1,"9":6,"10":1,"11":5},"f":{"0":3,"1":7},"b":{"0":[1],"1":[1],"2":[1],"3":[1]}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\schema\\schema.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\schema\\schema.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":33}},"3":{"start":{"line":5,"column":15},"end":{"line":5,"column":69}},"4":{"start":{"line":6,"column":13},"end":{"line":8,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\services\\locationService.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\services\\locationService.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":67}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":45}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":39}},"5":{"start":{"line":9,"column":0},"end":{"line":52,"column":null}},"6":{"start":{"line":11,"column":8},"end":{"line":11,"column":16}},"7":{"start":{"line":10,"column":24},"end":{"line":10,"column":38}},"8":{"start":{"line":10,"column":54},"end":{"line":10,"column":62}},"9":{"start":{"line":15,"column":8},"end":{"line":15,"column":92}},"10":{"start":{"line":16,"column":8},"end":{"line":49,"column":null}},"11":{"start":{"line":17,"column":25},"end":{"line":20,"column":14}},"12":{"start":{"line":22,"column":12},"end":{"line":22,"column":75}},"13":{"start":{"line":24,"column":27},"end":{"line":24,"column":68}},"14":{"start":{"line":26,"column":12},"end":{"line":26,"column":73}},"15":{"start":{"line":28,"column":12},"end":{"line":45,"column":null}},"16":{"start":{"line":29,"column":37},"end":{"line":29,"column":79}},"17":{"start":{"line":31,"column":16},"end":{"line":31,"column":112}},"18":{"start":{"line":33,"column":16},"end":{"line":36,"column":null}},"19":{"start":{"line":39,"column":16},"end":{"line":39,"column":84}},"20":{"start":{"line":41,"column":16},"end":{"line":44,"column":null}},"21":{"start":{"line":9,"column":13},"end":{"line":52,"column":null}},"22":{"start":{"line":9,"column":13},"end":{"line":9,"column":28}}},"fnMap":{"0":{"name":"(anonymous_3)","decl":{"start":{"line":10,"column":4},"end":{"line":10,"column":24}},"loc":{"start":{"line":10,"column":68},"end":{"line":12,"column":5}}},"1":{"name":"(anonymous_4)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":16}},"loc":{"start":{"line":14,"column":47},"end":{"line":51,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":12},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":12},"end":{"line":45,"column":null}},{"start":{"line":38,"column":16},"end":{"line":45,"column":null}}]},"1":{"loc":{"start":{"line":28,"column":15},"end":{"line":28,"column":112}},"type":"binary-expr","locations":[{"start":{"line":28,"column":15},"end":{"line":28,"column":38}},{"start":{"line":28,"column":42},"end":{"line":28,"column":75}},{"start":{"line":28,"column":79},"end":{"line":28,"column":112}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":5,"7":5,"8":5,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":2,"17":2,"18":2,"19":4,"20":4,"21":2,"22":2},"f":{"0":5,"1":6},"b":{"0":[2,4],"1":[6,5,3]}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\utils\\helpers.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\utils\\helpers.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":44}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":31}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":39}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":57}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":44}},"7":{"start":{"line":11,"column":13},"end":{"line":11,"column":39}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{}} +} diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000..cc12130 --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/dataSources/datasources.ts.html b/coverage/lcov-report/dataSources/datasources.ts.html new file mode 100644 index 0000000..8b0bd87 --- /dev/null +++ b/coverage/lcov-report/dataSources/datasources.ts.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for dataSources/datasources.ts + + + + + + + + + +
+
+

All files / dataSources datasources.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +  +2x +  + 
import Container from "typedi";
+import { LocationService } from "../services/locationService";
+ 
+export const dataSources = () => ({
+    locationService:  Container.get(LocationService)
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/dataSources/index.html b/coverage/lcov-report/dataSources/index.html new file mode 100644 index 0000000..3df3919 --- /dev/null +++ b/coverage/lcov-report/dataSources/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for dataSources + + + + + + + + + +
+
+

All files dataSources

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
datasources.ts +
+
100%5/5100%0/0100%1/1100%3/3
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 100% + Statements + 61/61 +
+ + +
+ 100% + Branches + 11/11 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 56/56 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
dataSources +
+
100%5/5100%0/0100%1/1100%3/3
resolvers +
+
100%6/6100%2/2100%1/1100%6/6
resolvers/coordinates +
+
100%2/2100%0/0100%1/1100%2/2
schema +
+
100%17/17100%4/4100%2/2100%17/17
services +
+
100%23/23100%5/5100%2/2100%20/20
utils +
+
100%8/8100%0/0100%0/0100%8/8
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.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} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){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;arat[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=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=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=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=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*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\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=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]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\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"]); diff --git a/coverage/lcov-report/resolvers/coordinates/index.html b/coverage/lcov-report/resolvers/coordinates/index.html new file mode 100644 index 0000000..3d0372d --- /dev/null +++ b/coverage/lcov-report/resolvers/coordinates/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for resolvers/coordinates + + + + + + + + + +
+
+

All files resolvers/coordinates

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
query.ts +
+
100%2/2100%0/0100%1/1100%2/2
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/resolvers/coordinates/query.ts.html b/coverage/lcov-report/resolvers/coordinates/query.ts.html new file mode 100644 index 0000000..14abccd --- /dev/null +++ b/coverage/lcov-report/resolvers/coordinates/query.ts.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for resolvers/coordinates/query.ts + + + + + + + + + +
+
+

All files / resolvers/coordinates query.ts

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +  +2x +  + 
export class CoordinatesQuery {
+    public async getCoordinates(parent: any, args: any, {dataSources}: any, info: any){
+        return await dataSources.locationService.getCoordinates(args.address);
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/resolvers/index.html b/coverage/lcov-report/resolvers/index.html new file mode 100644 index 0000000..a3b99d5 --- /dev/null +++ b/coverage/lcov-report/resolvers/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for resolvers + + + + + + + + + +
+
+

All files resolvers

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
resolvers.ts +
+
100%6/6100%2/2100%1/1100%6/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/resolvers/resolvers.ts.html b/coverage/lcov-report/resolvers/resolvers.ts.html new file mode 100644 index 0000000..cf23792 --- /dev/null +++ b/coverage/lcov-report/resolvers/resolvers.ts.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for resolvers/resolvers.ts + + + + + + + + + +
+
+

All files / resolvers resolvers.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +211x +1x +  +1x +  +2x +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  + 
import { NonEmptyString } from '../schema/customScalars';
+import { CoordinatesQuery } from './coordinates/query';
+ 
+const CoordinatesOrError = {
+    __resolveType(obj: any){
+        return obj.code ?
+         'Error' :
+         'Coordinates';
+    }
+}
+ 
+const Query = new CoordinatesQuery();
+ 
+export const resolvers = {
+    NonEmptyString: NonEmptyString,
+ 
+    Query,
+    CoordinatesOrError
+}
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/schema/customScalars.ts.html b/coverage/lcov-report/schema/customScalars.ts.html new file mode 100644 index 0000000..9b46297 --- /dev/null +++ b/coverage/lcov-report/schema/customScalars.ts.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for schema/customScalars.ts + + + + + + + + + +
+
+

All files / schema customScalars.ts

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +282x +  +  +2x +  +  +  +3x +1x +  +2x +1x +  +  +1x +  +  +7x +1x +  +6x +1x +  +  +5x +  +  + 
import { GraphQLScalarType } from "graphql";
+ 
+ 
+export const NonEmptyString = new GraphQLScalarType({
+    name: 'NonEmptyString',
+    description: 'Non empty string',
+    serialize: (value: unknown): string => {
+      if (typeof value !== 'string') { 
+        throw <Error>{message: 'Wrong value type', name: 'WRONG_VALUE_TYPE'};
+      }
+      if (value === '') { 
+        throw <Error>{message: `Value can't be empty`, name: 'VALUE_NOT_EMPTY'};
+      }
+  
+      return value
+    },
+    parseValue: (value: unknown): string => {
+        if (typeof value !== 'string') { 
+          throw <Error>{message: 'Wrong value type', name: 'WRONG_VALUE_TYPE'};
+          }
+        if (value === '') { 
+          throw <Error>{message: `Value can't be empty`, name: 'VALUE_NOT_EMPTY'};
+        }
+      
+      return value
+    },
+    
+  });
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/schema/index.html b/coverage/lcov-report/schema/index.html new file mode 100644 index 0000000..0d81a43 --- /dev/null +++ b/coverage/lcov-report/schema/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for schema + + + + + + + + + +
+
+

All files schema

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
customScalars.ts +
+
100%12/12100%4/4100%2/2100%12/12
schema.ts +
+
100%5/5100%0/0100%0/0100%5/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/schema/schema.ts.html b/coverage/lcov-report/schema/schema.ts.html new file mode 100644 index 0000000..a570366 --- /dev/null +++ b/coverage/lcov-report/schema/schema.ts.html @@ -0,0 +1,106 @@ + + + + + + Code coverage report for schema/schema.ts + + + + + + + + + +
+
+

All files / schema schema.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +81x +1x +1x +  +1x +1x +  + 
import path from 'path';
+import {readFileSync} from 'fs';
+import {gql} from 'apollo-server'
+ 
+const schema = readFileSync(path.join(__dirname, './schema.graphql'));
+export const typeDefs = gql`
+    ${schema}
+`
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/services/index.html b/coverage/lcov-report/services/index.html new file mode 100644 index 0000000..b17ec25 --- /dev/null +++ b/coverage/lcov-report/services/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for services + + + + + + + + + +
+
+

All files services

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
locationService.ts +
+
100%23/23100%5/5100%2/2100%20/20
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/services/locationService.ts.html b/coverage/lcov-report/services/locationService.ts.html new file mode 100644 index 0000000..532b211 --- /dev/null +++ b/coverage/lcov-report/services/locationService.ts.html @@ -0,0 +1,238 @@ + + + + + + Code coverage report for services/locationService.ts + + + + + + + + + +
+
+

All files / services locationService.ts

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +522x +2x +2x +  +2x +2x +  +  +2x +5x +5x +  +  +  +6x +6x +6x +  +  +  +  +6x +  +6x +  +6x +  +6x +2x +  +2x +  +2x +  +  +  +  +  +4x +  +4x +  +  +  +  +  +  +  +  +  +  + 
import { Logger } from "@aws-lambda-powertools/logger";
+import {Client, Status} from "@googlemaps/google-maps-services-js";
+import {DataSource} from 'apollo-datasource';
+import { responsePathAsArray } from "graphql";
+import { Service } from "typedi";
+import config from "../configs/config";
+ 
+@Service()
+export class LocationService extends DataSource {
+    constructor(private googleClient: Client, private logger: Logger){
+        super();
+    }
+ 
+    public async getCoordinates(address: string) {
+        this.logger.debug(`locationService.getCoordinates called with address: ${address}`);
+        try {
+            let params = {
+                address: address,
+                key: config.googleMapsKey!
+            }; 
+            
+            this.logger.debug(`Sending request to googlde geocode api...`);
+ 
+            var repsonse = await this.googleClient.geocode({params});
+ 
+            this.logger.debug(`Got response from google geocode api...`);
+            
+            if(repsonse.status === 200 && repsonse.data.status == Status.OK && repsonse.data.results?.length > 0){
+                const locationData = repsonse.data.results[0].geometry.location;
+ 
+                this.logger.info(`Valid response from google geocode service: ${JSON.stringify(locationData)}`);
+                
+                return {
+                    latitude: locationData.lat,
+                    longitude: locationData.lng
+                }
+            }
+            else{
+                this.logger.error(`Location not found against address: ${address}`);
+                
+                return {
+                    code: 'LOCATION_NOT_FOUND',
+                    message: 'Unable to find coordinates for given address',
+                }
+            }
+        } catch (error) {
+            /* istanbul ignore next */ 
+            this.logger.error(`locationService.getCoordinates ended up in exception. Error: ${error}`);
+        }
+        
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 0000000..2bb296a --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov-report/src/configs/config.ts.html b/coverage/lcov-report/src/configs/config.ts.html new file mode 100644 index 0000000..15616fb --- /dev/null +++ b/coverage/lcov-report/src/configs/config.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/configs/config.ts + + + + + + + + + +
+
+

All files / src/configs config.ts

+
+ +
+ 81.81% + Statements + 9/11 +
+ + +
+ 66.66% + Branches + 6/9 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 81.81% + Lines + 9/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +272x +2x +  +2x +2x +2x +2x +  +  +  +2x +2x +  +  +  +  +2x +  +  +  +  +  +  +  +  +  + 
import dotenv from 'dotenv';
+import path from 'path'
+ 
+var envPath = '';
+const env = process.env.NODE_ENV?.trimEnd();
+if(env == 'development' || env == 'test')
+  envPath = path.join(__dirname, `../../${env}.env`);
+else 
+EenvPath = path.join(__dirname, `../${env}.env`);
+  
+const envFound = dotenv.config({path: envPath});
+Iif (envFound.error) {
+  
+  throw new Error(`⚠️  Couldn't find .env file. ⚠️ path: ${envPath} | env: ${env}`);
+}
+ 
+export default {
+  port: parseInt(process.env.PORT!, 10),
+ 
+  googleMapsKey: process.env.GOOGLE_MAPS_KEY,
+ 
+  logs: {
+    level: process.env.LOG_LEVEL || 'ERROR',
+  },
+ 
+  appName: process.env.APP_NAME || 'location-Service'
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/configs/index.html b/coverage/lcov-report/src/configs/index.html new file mode 100644 index 0000000..d908527 --- /dev/null +++ b/coverage/lcov-report/src/configs/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/configs + + + + + + + + + +
+
+

All files src/configs

+
+ +
+ 81.81% + Statements + 9/11 +
+ + +
+ 66.66% + Branches + 6/9 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 81.81% + Lines + 9/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.ts +
+
81.81%9/1166.66%6/9100%0/081.81%9/11
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/dataSources/datasources.ts.html b/coverage/lcov-report/src/dataSources/datasources.ts.html new file mode 100644 index 0000000..5502952 --- /dev/null +++ b/coverage/lcov-report/src/dataSources/datasources.ts.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for src/dataSources/datasources.ts + + + + + + + + + +
+
+

All files / src/dataSources datasources.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +  +2x +  + 
import Container from "typedi";
+import { LocationService } from "../services/locationService";
+ 
+export const dataSources = () => ({
+    locationService:  Container.get(LocationService)
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/dataSources/index.html b/coverage/lcov-report/src/dataSources/index.html new file mode 100644 index 0000000..b93f980 --- /dev/null +++ b/coverage/lcov-report/src/dataSources/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/dataSources + + + + + + + + + +
+
+

All files src/dataSources

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
datasources.ts +
+
100%5/5100%0/0100%1/1100%3/3
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/resolvers/coordinates/index.html b/coverage/lcov-report/src/resolvers/coordinates/index.html new file mode 100644 index 0000000..01fcc7c --- /dev/null +++ b/coverage/lcov-report/src/resolvers/coordinates/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/resolvers/coordinates + + + + + + + + + +
+
+

All files src/resolvers/coordinates

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
query.ts +
+
100%2/2100%0/0100%1/1100%2/2
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/resolvers/coordinates/query.ts.html b/coverage/lcov-report/src/resolvers/coordinates/query.ts.html new file mode 100644 index 0000000..d41ccd5 --- /dev/null +++ b/coverage/lcov-report/src/resolvers/coordinates/query.ts.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for src/resolvers/coordinates/query.ts + + + + + + + + + +
+
+

All files / src/resolvers/coordinates query.ts

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +  +2x +  + 
export class CoordinatesQuery {
+    public async getCoordinates(parent: any, args: any, {dataSources}: any, info: any){
+        return await dataSources.locationService.getCoordinates(args.address);
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/resolvers/index.html b/coverage/lcov-report/src/resolvers/index.html new file mode 100644 index 0000000..225dedf --- /dev/null +++ b/coverage/lcov-report/src/resolvers/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/resolvers + + + + + + + + + +
+
+

All files src/resolvers

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
resolvers.ts +
+
100%6/6100%2/2100%1/1100%6/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/resolvers/resolvers.ts.html b/coverage/lcov-report/src/resolvers/resolvers.ts.html new file mode 100644 index 0000000..af8efc8 --- /dev/null +++ b/coverage/lcov-report/src/resolvers/resolvers.ts.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for src/resolvers/resolvers.ts + + + + + + + + + +
+
+

All files / src/resolvers resolvers.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +  +1x +1x +  +2x +  +  +  +  +1x +  +  +  +  + 
import { NonEmptyString } from '../schema/customScalars';
+import { CoordinatesQuery } from './coordinates/query';
+ 
+const Query = new CoordinatesQuery();
+const CoordinatesOrError = {
+    __resolveType(obj: any){
+        return obj.code ?
+         'Error' :
+         'Coordinates';
+    }
+}
+export const resolvers = {
+    NonEmptyString: NonEmptyString,
+ 
+    Query,
+    CoordinatesOrError
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/schema/customScalars.ts.html b/coverage/lcov-report/src/schema/customScalars.ts.html new file mode 100644 index 0000000..9320b64 --- /dev/null +++ b/coverage/lcov-report/src/schema/customScalars.ts.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for src/schema/customScalars.ts + + + + + + + + + +
+
+

All files / src/schema customScalars.ts

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +282x +  +  +2x +  +  +  +3x +1x +  +2x +1x +  +  +1x +  +  +7x +1x +  +6x +1x +  +  +5x +  +  + 
import { GraphQLScalarType } from "graphql";
+ 
+ 
+export const NonEmptyString = new GraphQLScalarType({
+    name: 'NonEmptyString',
+    description: 'Non empty string',
+    serialize: (value: unknown): string => {
+      if (typeof value !== 'string') { 
+        throw <Error>{message: 'Wrong value type', name: 'WRONG_VALUE_TYPE'};
+      }
+      if (value === '') { 
+        throw <Error>{message: `Value can't be empty`, name: 'VALUE_NOT_EMPTY'};
+      }
+  
+      return value
+    },
+    parseValue: (value: unknown): string => {
+        if (typeof value !== 'string') { 
+          throw <Error>{message: 'Wrong value type', name: 'WRONG_VALUE_TYPE'};
+          }
+        if (value === '') { 
+          throw <Error>{message: `Value can't be empty`, name: 'VALUE_NOT_EMPTY'};
+        }
+      
+      return value
+    },
+    
+  });
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/schema/index.html b/coverage/lcov-report/src/schema/index.html new file mode 100644 index 0000000..e4b4b33 --- /dev/null +++ b/coverage/lcov-report/src/schema/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/schema + + + + + + + + + +
+
+

All files src/schema

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
customScalars.ts +
+
100%12/12100%4/4100%2/2100%12/12
schema.ts +
+
100%5/5100%0/0100%0/0100%5/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/schema/schema.ts.html b/coverage/lcov-report/src/schema/schema.ts.html new file mode 100644 index 0000000..44b0647 --- /dev/null +++ b/coverage/lcov-report/src/schema/schema.ts.html @@ -0,0 +1,106 @@ + + + + + + Code coverage report for src/schema/schema.ts + + + + + + + + + +
+
+

All files / src/schema schema.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +81x +1x +1x +  +1x +1x +  + 
import path from 'path';
+import {readFileSync} from 'fs';
+import {gql} from 'apollo-server'
+ 
+const schema = readFileSync(path.join(__dirname, './schema.graphql'));
+export const typeDefs = gql`
+    ${schema}
+`
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/services/index.html b/coverage/lcov-report/src/services/index.html new file mode 100644 index 0000000..1ae3cc5 --- /dev/null +++ b/coverage/lcov-report/src/services/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/services + + + + + + + + + +
+
+

All files src/services

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
locationService.ts +
+
100%23/23100%5/5100%2/2100%20/20
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/services/locationService.ts.html b/coverage/lcov-report/src/services/locationService.ts.html new file mode 100644 index 0000000..5731daa --- /dev/null +++ b/coverage/lcov-report/src/services/locationService.ts.html @@ -0,0 +1,238 @@ + + + + + + Code coverage report for src/services/locationService.ts + + + + + + + + + +
+
+

All files / src/services locationService.ts

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +522x +2x +2x +  +2x +2x +  +  +2x +5x +5x +  +  +  +6x +6x +6x +  +  +  +  +6x +  +6x +  +6x +  +6x +2x +  +2x +  +2x +  +  +  +  +  +4x +  +4x +  +  +  +  +  +  +  +  +  +  + 
import { Logger } from "@aws-lambda-powertools/logger";
+import {Client, Status} from "@googlemaps/google-maps-services-js";
+import {DataSource} from 'apollo-datasource';
+import { responsePathAsArray } from "graphql";
+import { Service } from "typedi";
+import config from "../configs/config";
+ 
+@Service()
+export class LocationService extends DataSource {
+    constructor(private googleClient: Client, private logger: Logger){
+        super();
+    }
+ 
+    public async getCoordinates(address: string) {
+        this.logger.debug(`locationService.getCoordinates called with address: ${address}`);
+        try {
+            let params = {
+                address: address,
+                key: config.googleMapsKey!
+            }; 
+            
+            this.logger.debug(`Sending request to googlde geocode api...`);
+ 
+            var repsonse = await this.googleClient.geocode({params});
+ 
+            this.logger.debug(`Got response from google geocode api...`);
+            
+            if(repsonse.status === 200 && repsonse.data.status == Status.OK && repsonse.data.results?.length > 0){
+                const locationData = repsonse.data.results[0].geometry.location;
+ 
+                this.logger.info(`Valid response from google geocode service: ${JSON.stringify(locationData)}`);
+                
+                return {
+                    latitude: locationData.lat,
+                    longitude: locationData.lng
+                }
+            }
+            else{
+                this.logger.error(`Location not found against address: ${address}`);
+                
+                return {
+                    code: 'LOCATION_NOT_FOUND',
+                    message: 'Unable to find coordinates for given address',
+                }
+            }
+        } catch (error) {
+            /* istanbul ignore next */ 
+            this.logger.error(`locationService.getCoordinates ended up in exception. Error: ${error}`);
+        }
+        
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/helpers.ts.html b/coverage/lcov-report/src/utils/helpers.ts.html new file mode 100644 index 0000000..35922c8 --- /dev/null +++ b/coverage/lcov-report/src/utils/helpers.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/utils/helpers.ts + + + + + + + + + +
+
+

All files / src/utils helpers.ts

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +311x +1x +  +1x +1x +1x +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Logger } from "@aws-lambda-powertools/logger";
+import { ApolloError } from "apollo-server";
+import { GraphQLError } from "graphql";
+import Container from "typedi";
+import config from "../configs/config";
+import { dataSources } from "../dataSources/datasources";
+import { resolvers } from "../resolvers/resolvers";
+import { typeDefs } from "../schema/schema";
+ 
+/* istanbul ignore next */
+export const buildApolloServerConfig = (): any => {
+    return {
+        typeDefs, 
+        resolvers, 
+        dataSources,
+        debug: config.logs.level === 'debug',
+        formatError: (err: GraphQLError) =>
+        {
+            if(err.extensions.code == 'INTERNAL_SERVER_ERROR'){
+                var logger = Container.get(Logger);
+                logger.error(`Internal error occurred. Error: ${err}`);
+                
+                return new ApolloError('Unable to handle the request.', 'ERROR', {
+                  token: 'INTERNAL_ERROR',
+                });
+            }
+            return err;
+        }
+    }
+ 
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/index.html b/coverage/lcov-report/src/utils/index.html new file mode 100644 index 0000000..0086a34 --- /dev/null +++ b/coverage/lcov-report/src/utils/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/utils + + + + + + + + + +
+
+

All files src/utils

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
helpers.ts +
+
100%8/8100%0/0100%0/0100%8/8
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/tests/e2e/e2eConfig.ts.html b/coverage/lcov-report/tests/e2e/e2eConfig.ts.html new file mode 100644 index 0000000..030b5ec --- /dev/null +++ b/coverage/lcov-report/tests/e2e/e2eConfig.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for tests/e2e/e2eConfig.ts + + + + + + + + + +
+
+

All files / tests/e2e e2eConfig.ts

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +  +  +1x +1x +  +1x
import 'reflect-metadata';
+import {ApolloServer} from 'apollo-server';
+import {buildApolloServerConfig} from '../../src/utils/helpers'
+import Container from 'typedi';
+import { Client } from '@googlemaps/google-maps-services-js';
+import { Logger } from '@aws-lambda-powertools/logger';
+ 
+ 
+Container.set({id: Logger, value: new Logger()}); //configuring empty logger
+Container.set({id: Client, value: new Client()});
+ 
+export const server = new ApolloServer(buildApolloServerConfig());
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/tests/e2e/index.html b/coverage/lcov-report/tests/e2e/index.html new file mode 100644 index 0000000..ca8b664 --- /dev/null +++ b/coverage/lcov-report/tests/e2e/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for tests/e2e + + + + + + + + + +
+
+

All files tests/e2e

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
e2eConfig.ts +
+
100%9/9100%0/0100%0/0100%9/9
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/utils/helpers.ts.html b/coverage/lcov-report/utils/helpers.ts.html new file mode 100644 index 0000000..c2c9422 --- /dev/null +++ b/coverage/lcov-report/utils/helpers.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for utils/helpers.ts + + + + + + + + + +
+
+

All files / utils helpers.ts

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +311x +1x +  +1x +1x +1x +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Logger } from "@aws-lambda-powertools/logger";
+import { ApolloError } from "apollo-server";
+import { GraphQLError } from "graphql";
+import Container from "typedi";
+import config from "../configs/config";
+import { dataSources } from "../dataSources/datasources";
+import { resolvers } from "../resolvers/resolvers";
+import { typeDefs } from "../schema/schema";
+ 
+/* istanbul ignore next */
+export const buildApolloServerConfig = (): any => {
+    return {
+        typeDefs, 
+        resolvers, 
+        dataSources,
+        debug: config.logs.level === 'debug',
+        formatError: (err: GraphQLError) =>
+        {
+            if(err.extensions.code == 'INTERNAL_SERVER_ERROR'){
+                var logger = Container.get(Logger);
+                logger.error(`Internal error occurred. Error: ${err}`);
+                
+                return new ApolloError('Unable to handle the request.', 'ERROR', {
+                  token: 'INTERNAL_ERROR',
+                });
+            }
+            return err;
+        }
+    }
+ 
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/utils/index.html b/coverage/lcov-report/utils/index.html new file mode 100644 index 0000000..485b331 --- /dev/null +++ b/coverage/lcov-report/utils/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for utils + + + + + + + + + +
+
+

All files utils

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
helpers.ts +
+
100%8/8100%0/0100%0/0100%8/8
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..cff3c78 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,144 @@ +TN: +SF:src\dataSources\datasources.ts +FN:4,(anonymous_1) +FNF:1 +FNH:1 +FNDA:2,(anonymous_1) +DA:1,1 +DA:2,1 +DA:4,2 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\resolvers\resolvers.ts +FN:5,(anonymous_0) +FNF:1 +FNH:1 +FNDA:2,(anonymous_0) +DA:1,1 +DA:2,1 +DA:4,1 +DA:6,2 +DA:12,1 +DA:14,1 +LF:6 +LH:6 +BRDA:6,0,0,1 +BRDA:6,0,1,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src\resolvers\coordinates\query.ts +FN:2,(anonymous_0) +FNF:1 +FNH:1 +FNDA:2,(anonymous_0) +DA:1,1 +DA:3,2 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\schema\customScalars.ts +FN:7,(anonymous_0) +FN:17,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:7,(anonymous_1) +DA:1,2 +DA:4,2 +DA:8,3 +DA:9,1 +DA:11,2 +DA:12,1 +DA:15,1 +DA:18,7 +DA:19,1 +DA:21,6 +DA:22,1 +DA:25,5 +LF:12 +LH:12 +BRDA:8,0,0,1 +BRDA:11,1,0,1 +BRDA:18,2,0,1 +BRDA:21,3,0,1 +BRF:4 +BRH:4 +end_of_record +TN: +SF:src\schema\schema.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\services\locationService.ts +FN:10,(anonymous_3) +FN:14,(anonymous_4) +FNF:2 +FNH:2 +FNDA:5,(anonymous_3) +FNDA:6,(anonymous_4) +DA:1,2 +DA:2,2 +DA:3,2 +DA:5,2 +DA:6,2 +DA:9,2 +DA:10,5 +DA:11,5 +DA:15,6 +DA:16,6 +DA:17,6 +DA:22,6 +DA:24,6 +DA:26,6 +DA:28,6 +DA:29,2 +DA:31,2 +DA:33,2 +DA:39,4 +DA:41,4 +LF:20 +LH:20 +BRDA:28,0,0,2 +BRDA:28,0,1,4 +BRDA:28,1,0,6 +BRDA:28,1,1,5 +BRDA:28,1,2,3 +BRF:5 +BRH:5 +end_of_record +TN: +SF:src\utils\helpers.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:11,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record diff --git a/development.env b/development.env new file mode 100644 index 0000000..cb57fd9 --- /dev/null +++ b/development.env @@ -0,0 +1,12 @@ +NODE_ENV="development" + +# Google Geocode API +GOOGLE_MAPS_KEY='AIzaSyBj1aLo0X1uH7CKoi3bXPFPdX6eeCra4e8' + +# Port +PORT=4000 + +# Debug +LOG_LEVEL='DEBUG' + + diff --git a/iac/aws/api_gateway/aws_proxy/main.tf b/iac/aws/api_gateway/aws_proxy/main.tf new file mode 100644 index 0000000..50f6810 --- /dev/null +++ b/iac/aws/api_gateway/aws_proxy/main.tf @@ -0,0 +1,69 @@ +variable "api_name" { + description = "name of the api" + default = "api" +} + +variable "api_path" { + description = "path of the api" + default = "api" +} + +variable "lambda_arn" { + description = "arn of the associated lambda function" +} + +variable "region" { + description = "region" +} +variable "account_id" { + description = "account id" +} + +variable "deploy_stage" { + description = "stage name for deployment" +} + + +# API Gateway +resource "aws_api_gateway_rest_api" "api" { + name = "${var.api_name}" +} + +resource "aws_api_gateway_resource" "resource" { + path_part = "${var.api_path}" + parent_id = "${aws_api_gateway_rest_api.api.root_resource_id}" + rest_api_id = "${aws_api_gateway_rest_api.api.id}" +} + +resource "aws_api_gateway_method" "method" { + rest_api_id = "${aws_api_gateway_rest_api.api.id}" + resource_id = "${aws_api_gateway_resource.resource.id}" + http_method = "ANY" + authorization = "NONE" +} + +resource "aws_api_gateway_integration" "integration" { + rest_api_id = "${aws_api_gateway_rest_api.api.id}" + resource_id = "${aws_api_gateway_resource.resource.id}" + http_method = "${aws_api_gateway_method.method.http_method}" + uri = "arn:aws:apigateway:${var.region}:lambda:path/2015-03-31/functions/${var.lambda_arn}/invocations" + integration_http_method = "POST" + type = "AWS_PROXY" +} +resource "aws_api_gateway_deployment" "deployment" { + depends_on = ["aws_api_gateway_method.method","aws_api_gateway_integration.integration"] + rest_api_id = "${aws_api_gateway_rest_api.api.id}" + stage_name = "${var.deploy_stage}" +} +output "url" { + value = "${aws_api_gateway_deployment.deployment.invoke_url}" +} + +# Lambda +resource "aws_lambda_permission" "apigw_lambda" { + statement_id = "AllowExecutionFromAPIGateway" + action = "lambda:InvokeFunction" + function_name = "${var.lambda_arn}" + principal = "apigateway.amazonaws.com" + source_arn = "arn:aws:execute-api:${var.region}:${var.account_id}:${aws_api_gateway_rest_api.api.id}/*/*/*" +} \ No newline at end of file diff --git a/iac/aws/lambda/main.tf b/iac/aws/lambda/main.tf new file mode 100644 index 0000000..7c632ab --- /dev/null +++ b/iac/aws/lambda/main.tf @@ -0,0 +1,46 @@ +variable "name" { + description = "Name of lambda" + default = "lambda" +} + +variable "runtime" { + description = "Runtime of lambda" + default = "nodejs14.x" +} +variable "zip_file_path" { + description = "zip file path" + default = "./" +} + +variable "handler" { + description = "Handler name" + default = "handler" +} + + +module "role"{ + source = "./role" +} + +resource "aws_lambda_function" "lambda" { + filename = "${var.zip_file_path}${var.name}.zip" + function_name = "${var.name}_lambda" + handler = "${var.name}_lambda.${var.handler}" + role = "${module.role.role}" + runtime = "${var.runtime}" + source_code_hash = filebase64sha256("${var.zip_file_path}${var.name}.zip") + timeout = 59 + environment { + variables = { + NODE_ENV = "aws" + } + } +} + +output "name" { + value = "${aws_lambda_function.lambda.function_name}" +} + +output "arn" { + value = "${aws_lambda_function.lambda.arn}" +} \ No newline at end of file diff --git a/iac/aws/lambda/role/role.tf b/iac/aws/lambda/role/role.tf new file mode 100644 index 0000000..1f9d2ca --- /dev/null +++ b/iac/aws/lambda/role/role.tf @@ -0,0 +1,45 @@ +resource "aws_iam_role" "iam_role_for_lambda" { + name = "iam_role_for_lambda" + + assume_role_policy = <= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", + "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "dev": true, + "requires": { + "@jest/core": "^28.1.3", + "@jest/types": "^28.1.3", + "import-local": "^3.0.2", + "jest-cli": "^28.1.3" + }, + "dependencies": { + "jest-cli": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", + "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "dev": true, + "requires": { + "@jest/core": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + } + } + }, + "jest-changed-files": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", + "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, + "jest-circus": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", + "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "p-limit": "^3.1.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, + "jest-config": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", + "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.3", + "@jest/types": "^28.1.3", + "babel-jest": "^28.1.3", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.3", + "jest-environment-node": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-docblock": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", + "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.3", + "pretty-format": "^28.1.3" + } + }, + "jest-environment-node": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", + "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + } + }, + "jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true + }, + "jest-haste-map": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", + "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true + }, + "jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", + "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "dev": true, + "requires": { + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.3" + } + }, + "jest-runner": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", + "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/environment": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.1.1", + "jest-environment-node": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-leak-detector": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-resolve": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-util": "^28.1.3", + "jest-watcher": "^28.1.3", + "jest-worker": "^28.1.3", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, + "jest-runtime": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", + "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/globals": "^28.1.3", + "@jest/source-map": "^28.1.2", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.3", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", + "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "leven": "^3.1.0", + "pretty-format": "^28.1.3" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dev": true, + "requires": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.pickby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", + "integrity": "sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "nodemon": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", + "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.3.tgz", + "integrity": "sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "requires": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "query-string": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.1.tgz", + "integrity": "sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==", + "requires": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, + "retry-axios": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz", + "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "ts-jest": { + "version": "28.0.7", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.7.tgz", + "integrity": "sha512-wWXCSmTwBVmdvWrOpYhal79bDpioDy4rTT+0vyUnE3ZzM7LOAAGG9NXwzkEL/a516rQEgnMmS/WKP9jBPCVJyA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^28.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedi": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/typedi/-/typedi-0.10.0.tgz", + "integrity": "sha512-v3UJF8xm68BBj6AF4oQML3ikrfK2c9EmZUyLOfShpJuItAqVBHWP/KtpGinkSsIiP6EZyyb6Z3NXyW9dgS9X1w==" + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==" + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "value-or-promise": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", + "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" + }, + "xss": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.13.tgz", + "integrity": "sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==", + "requires": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b59fb0c --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "name": "location-api", + "version": "1.0.0", + "description": "", + "main": "index.ts", + "scripts": { + "test": "set NODE_ENV=test && jest --coverage", + "start": "set NODE_ENV=development && nodemon ./src/index.ts", + "build": "tsc -p tsconfig.json", + "postbuild": "copy /y .\\src\\schema\\schema.graphql .\\build\\schema\\schema.graphql && copy /y .\\aws.env .\\build\\aws.env", + "publish": "7z a dist/graphql.zip ./build/* && 7z u dist/graphql.zip ./node_modules", + "aws-deploy": "npm run build && npm test && npm run publish && terraform plan -out=.\\iac\\deployment\\test\\terraform.tfstate && terraform apply .\\iac\\deployment\\test\\terraform.tfstate" + }, + "author": "mananhabib", + "license": "ISC", + "dependencies": { + "@aws-lambda-powertools/logger": "^1.0.2", + "@googlemaps/google-maps-services-js": "^3.3.16", + "@middy/core": "^3.1.1", + "apollo-datasource": "^3.3.2", + "apollo-server": "^3.10.0", + "apollo-server-core": "^3.10.0", + "apollo-server-lambda": "^3.10.0", + "aws-lambda": "^1.0.7", + "dotenv": "^16.0.1", + "graphql": "^16.5.0", + "nodemon": "^2.0.19", + "reflect-metadata": "^0.1.13", + "ts-node": "^10.9.1", + "typedi": "^0.10.0", + "typescript": "^4.7.4" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "jest": "^28.1.3", + "ts-jest": "^28.0.7" + } +} diff --git a/src/configs/config.ts b/src/configs/config.ts new file mode 100644 index 0000000..931d465 --- /dev/null +++ b/src/configs/config.ts @@ -0,0 +1,27 @@ +import dotenv from 'dotenv'; +import path from 'path' + +var envPath = ''; +const env = process.env.NODE_ENV?.trimEnd(); +if(env == 'development' || env == 'test') + envPath = path.join(__dirname, `../../${env}.env`); +else +envPath = path.join(__dirname, `../${env}.env`); + +const envFound = dotenv.config({path: envPath}); +if (envFound.error) { + + throw new Error(`⚠️ Couldn't find .env file. ⚠️ path: ${envPath} | env: ${env}`); +} + +export default { + port: parseInt(process.env.PORT!, 10), + + googleMapsKey: process.env.GOOGLE_MAPS_KEY, + + logs: { + level: process.env.LOG_LEVEL || 'ERROR', + }, + + appName: process.env.APP_NAME || 'location-Service' +}; \ No newline at end of file diff --git a/src/dataSources/datasources.ts b/src/dataSources/datasources.ts new file mode 100644 index 0000000..7f1fe17 --- /dev/null +++ b/src/dataSources/datasources.ts @@ -0,0 +1,6 @@ +import Container from "typedi"; +import { LocationService } from "../services/locationService"; + +export const dataSources = () => ({ + locationService: Container.get(LocationService) +}); \ No newline at end of file diff --git a/src/graphql_lambda.ts b/src/graphql_lambda.ts new file mode 100644 index 0000000..0571375 --- /dev/null +++ b/src/graphql_lambda.ts @@ -0,0 +1,39 @@ +import 'reflect-metadata'; +import {ApolloServer, ApolloError} from 'apollo-server-lambda'; +import {ApolloServerPluginLandingPageLocalDefault, Config} from 'apollo-server-core' +import { typeDefs } from './schema/schema'; +import { resolvers } from './resolvers/resolvers'; +import {dataSources} from './dataSources/datasources' +import config from './configs/config'; +import Container from 'typedi'; +import { Client } from '@googlemaps/google-maps-services-js'; +import { Logger, injectLambdaContext } from '@aws-lambda-powertools/logger'; +import middy from '@middy/core'; + +const logger = new Logger({logLevel: 'INFO', serviceName: 'locationService'}); + +Container.set({id: Logger, value: logger}); +Container.set({id: Client, value: new Client()}); + + +const server = new ApolloServer({ + typeDefs, + resolvers, + dataSources, + debug: config.logs.level === 'DEBUG', + formatError: (err) => + { + console.log(err); + if(err.extensions.code == 'INTERNAL_SERVER_ERROR'){ + return new ApolloError('Unable to handle the request.', 'ERROR', { + token: 'INTERNAL_ERROR', + }); + } + return err; + }, + plugins: [ + ApolloServerPluginLandingPageLocalDefault({ embed: true }), + ] + +}); +export const handler = middy(server.createHandler()).use(injectLambdaContext(logger)); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..a8133e0 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,26 @@ +import 'reflect-metadata'; +import {ApolloServer, ServerInfo} from 'apollo-server'; +import Container from 'typedi'; +import { Client } from '@googlemaps/google-maps-services-js'; +import {Logger} from '@aws-lambda-powertools/logger'; +import { buildApolloServerConfig } from './utils/helpers'; +import config from './configs/config'; + + + + +Container.set({id: Logger, value: new Logger({logLevel: config.logs.level, serviceName: config.appName})}); +Container.set({id: Client, value: new Client()}); + + + +const server = new ApolloServer(buildApolloServerConfig()); + +server + .listen({port: config.port}) + .then(({url}: ServerInfo) => { + console.log(`server running at ${url}`); + }) + + + diff --git a/src/resolvers/coordinates/query.ts b/src/resolvers/coordinates/query.ts new file mode 100644 index 0000000..6abd9fa --- /dev/null +++ b/src/resolvers/coordinates/query.ts @@ -0,0 +1,5 @@ +export class CoordinatesQuery { + public async getCoordinates(parent: any, args: any, {dataSources}: any, info: any){ + return await dataSources.locationService.getCoordinates(args.address); + } +} \ No newline at end of file diff --git a/src/resolvers/resolvers.ts b/src/resolvers/resolvers.ts new file mode 100644 index 0000000..8e3b7a0 --- /dev/null +++ b/src/resolvers/resolvers.ts @@ -0,0 +1,20 @@ +import { NonEmptyString } from '../schema/customScalars'; +import { CoordinatesQuery } from './coordinates/query'; + +const CoordinatesOrError = { + __resolveType(obj: any){ + return obj.code ? + 'Error' : + 'Coordinates'; + } +} + +const Query = new CoordinatesQuery(); + +export const resolvers = { + NonEmptyString: NonEmptyString, + + Query, + CoordinatesOrError +} + diff --git a/src/schema/customScalars.ts b/src/schema/customScalars.ts new file mode 100644 index 0000000..5169c2b --- /dev/null +++ b/src/schema/customScalars.ts @@ -0,0 +1,28 @@ +import { GraphQLScalarType } from "graphql"; + + +export const NonEmptyString = new GraphQLScalarType({ + name: 'NonEmptyString', + description: 'Non empty string', + serialize: (value: unknown): string => { + if (typeof value !== 'string') { + throw {message: 'Wrong value type', name: 'WRONG_VALUE_TYPE'}; + } + if (value === '') { + throw {message: `Value can't be empty`, name: 'VALUE_NOT_EMPTY'}; + } + + return value + }, + parseValue: (value: unknown): string => { + if (typeof value !== 'string') { + throw {message: 'Wrong value type', name: 'WRONG_VALUE_TYPE'}; + } + if (value === '') { + throw {message: `Value can't be empty`, name: 'VALUE_NOT_EMPTY'}; + } + + return value + }, + + }); \ No newline at end of file diff --git a/src/schema/schema.graphql b/src/schema/schema.graphql new file mode 100644 index 0000000..20e6600 --- /dev/null +++ b/src/schema/schema.graphql @@ -0,0 +1,16 @@ + +scalar NonEmptyString + +type Query{ + getCoordinates(address: NonEmptyString): CoordinatesOrError +} + +union CoordinatesOrError = Coordinates | Error +type Coordinates { + latitude: Float, + longitude: Float, +} +type Error { + code: String, + message: String +} \ No newline at end of file diff --git a/src/schema/schema.ts b/src/schema/schema.ts new file mode 100644 index 0000000..864262b --- /dev/null +++ b/src/schema/schema.ts @@ -0,0 +1,8 @@ +import path from 'path'; +import {readFileSync} from 'fs'; +import {gql} from 'apollo-server' + +const schema = readFileSync(path.join(__dirname, './schema.graphql')); +export const typeDefs = gql` + ${schema} +` \ No newline at end of file diff --git a/src/services/locationService.ts b/src/services/locationService.ts new file mode 100644 index 0000000..02b6030 --- /dev/null +++ b/src/services/locationService.ts @@ -0,0 +1,52 @@ +import { Logger } from "@aws-lambda-powertools/logger"; +import {Client, Status} from "@googlemaps/google-maps-services-js"; +import {DataSource} from 'apollo-datasource'; +import { responsePathAsArray } from "graphql"; +import { Service } from "typedi"; +import config from "../configs/config"; + +@Service() +export class LocationService extends DataSource { + constructor(private googleClient: Client, private logger: Logger){ + super(); + } + + public async getCoordinates(address: string) { + this.logger.debug(`locationService.getCoordinates called with address: ${address}`); + try { + let params = { + address: address, + key: config.googleMapsKey! + }; + + this.logger.debug(`Sending request to googlde geocode api...`); + + var repsonse = await this.googleClient.geocode({params}); + + this.logger.debug(`Got response from google geocode api...`); + + if(repsonse.status === 200 && repsonse.data.status == Status.OK && repsonse.data.results?.length > 0){ + const locationData = repsonse.data.results[0].geometry.location; + + this.logger.info(`Valid response from google geocode service: ${JSON.stringify(locationData)}`); + + return { + latitude: locationData.lat, + longitude: locationData.lng + } + } + else{ + this.logger.error(`Location not found against address: ${address}`); + + return { + code: 'LOCATION_NOT_FOUND', + message: 'Unable to find coordinates for given address', + } + } + } catch (error) { + /* istanbul ignore next */ + this.logger.error(`locationService.getCoordinates ended up in exception. Error: ${error}`); + } + + } +} \ No newline at end of file diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts new file mode 100644 index 0000000..fd33772 --- /dev/null +++ b/src/utils/helpers.ts @@ -0,0 +1,31 @@ +import { Logger } from "@aws-lambda-powertools/logger"; +import { ApolloError } from "apollo-server"; +import { GraphQLError } from "graphql"; +import Container from "typedi"; +import config from "../configs/config"; +import { dataSources } from "../dataSources/datasources"; +import { resolvers } from "../resolvers/resolvers"; +import { typeDefs } from "../schema/schema"; + +/* istanbul ignore next */ +export const buildApolloServerConfig = (): any => { + return { + typeDefs, + resolvers, + dataSources, + debug: config.logs.level === 'DEBUG', + formatError: (err: GraphQLError) => + { + if(err.extensions.code == 'INTERNAL_SERVER_ERROR'){ + var logger = Container.get(Logger); + logger.error(`Internal error occurred. Error: ${err}`); + + return new ApolloError('Unable to handle the request.', 'ERROR', { + token: 'INTERNAL_ERROR', + }); + } + return err; + } + } + +} \ No newline at end of file diff --git a/test.env b/test.env new file mode 100644 index 0000000..4a7c918 --- /dev/null +++ b/test.env @@ -0,0 +1,10 @@ +NODE_ENV="local" + +# Google Geocode API +GOOGLE_MAPS_KEY='AIzaSyBj1aLo0X1uH7CKoi3bXPFPdX6eeCra4e8' + +# Port +PORT=4000 + +# Debug +LOG_LEVEL='ERROR' diff --git a/tests/e2e/e2eConfig.ts b/tests/e2e/e2eConfig.ts new file mode 100644 index 0000000..1588d40 --- /dev/null +++ b/tests/e2e/e2eConfig.ts @@ -0,0 +1,12 @@ +import 'reflect-metadata'; +import {ApolloServer} from 'apollo-server'; +import {buildApolloServerConfig} from '../../src/utils/helpers' +import Container from 'typedi'; +import { Client } from '@googlemaps/google-maps-services-js'; +import { Logger } from '@aws-lambda-powertools/logger'; + + +Container.set({id: Logger, value: new Logger()}); //configuring empty logger +Container.set({id: Client, value: new Client()}); + +export const server = new ApolloServer(buildApolloServerConfig()); \ No newline at end of file diff --git a/tests/e2e/getCoordinates.query.test.ts b/tests/e2e/getCoordinates.query.test.ts new file mode 100644 index 0000000..8eb9dcb --- /dev/null +++ b/tests/e2e/getCoordinates.query.test.ts @@ -0,0 +1,55 @@ +import { server } from './e2eConfig'; + +describe('getCoordinates Query e2e tests', () => { + describe('getCoordinatesQuery', () => { + test('Should return coordinates for valid address', async () => { + + const query = ` + query { + + getCoordinates(address: "New York") { + ... on Coordinates{ + latitude + longitude + } + ... on Error{ + code + message + }, + } + + } + ` + + const response = await server.executeOperation({query}); + + expect(response.data?.getCoordinates?.latitude).toStrictEqual(40.7127753); + expect(response.data?.getCoordinates?.longitude).toStrictEqual(-74.0059728); + }); + test('Should return error invalid address', async () => { + + const query = ` + query { + + getCoordinates(address: "invalidAddress") { + ... on Coordinates{ + latitude + longitude + } + ... on Error{ + code + message + }, + } + + } + ` + + const response = await server.executeOperation({query}); + + expect(response.data?.getCoordinates?.code).toStrictEqual("LOCATION_NOT_FOUND"); + + }); + + }) + }) \ No newline at end of file diff --git a/tests/unit/schema/customScalars.test.ts b/tests/unit/schema/customScalars.test.ts new file mode 100644 index 0000000..acf8c6c --- /dev/null +++ b/tests/unit/schema/customScalars.test.ts @@ -0,0 +1,52 @@ +import {NonEmptyString} from '../../../src/schema/customScalars'; +describe('customScalars Unit Test', () => { + describe('NonEmptyString.serialize', () => { + test('Should return error for non-string value', async () => { + try { + var result = NonEmptyString.serialize(23); + } catch (error: any) { + expect(error.name).toStrictEqual("WRONG_VALUE_TYPE"); + } + }); + + test('Should return error for empty string value', async () => { + try { + var result = NonEmptyString.serialize(''); + } catch (error: any) { + expect(error.name).toStrictEqual("VALUE_NOT_EMPTY"); + } + }); + + test('Should return value for valid and non-empty string value', async () => { + var result = NonEmptyString.serialize('validString'); + expect(result).toStrictEqual('validString'); + + }); + + }) + + describe('NonEmptyString.parseValue', () => { + test('Should return error for non-string value', async () => { + try { + var result = NonEmptyString.parseValue(23); + } catch (error: any) { + expect(error.name).toStrictEqual("WRONG_VALUE_TYPE"); + } + }); + + test('Should return error for empty string value', async () => { + try { + var result = NonEmptyString.parseValue(''); + } catch (error: any) { + expect(error.name).toStrictEqual("VALUE_NOT_EMPTY"); + } + }); + + test('Should return value for valid and non-empty string value', async () => { + var result = NonEmptyString.parseValue('validString'); + expect(result).toStrictEqual('validString'); + + }); + + }) + }) \ No newline at end of file diff --git a/tests/unit/services/locationService/locationService.test.ts b/tests/unit/services/locationService/locationService.test.ts new file mode 100644 index 0000000..3890eed --- /dev/null +++ b/tests/unit/services/locationService/locationService.test.ts @@ -0,0 +1,66 @@ +import { Logger } from '@aws-lambda-powertools/logger'; +import { Client, GeocodeResponseData, GeocodeResponse, Status, GeocodeResult, AddressGeometry } from '@googlemaps/google-maps-services-js'; +import {LocationService} from '../../../../src/services/locationService'; + + +describe('LocationService Unit Test', () => { + describe('getCoordinates', () => { + var logger = new Logger(); + test('Should return coordinates for valid address', async () => { + + var client = new Client(); + var response = {}; + var geocodeResult = {}; + geocodeResult.geometry = {location:{lat: 1, lng: 1}}; + response.status = 200; + response.data = {results:[geocodeResult], status: Status.OK}; + + jest.spyOn(client, 'geocode').mockResolvedValue(response); + + const locationService = new LocationService(client, logger); + const result = await locationService.getCoordinates("validAddress"); + + expect(result).toStrictEqual({latitude: 1, longitude: 1}); + }); + + test('Should return error on response status other than 200', async () => { + var client = new Client(); + var response = {}; + response.status = 500; + + jest.spyOn(client, 'geocode').mockResolvedValue(response); + + const locationService = new LocationService(client, logger); + const result = await locationService.getCoordinates("invalidAddress"); + + expect(result?.code).toStrictEqual("LOCATION_NOT_FOUND"); + }); + test('Should return error on response data status other than OK', async () => { + var client = new Client(); + var response = {}; + response.status = 200; + response.data = {status: Status.NOT_FOUND}; + + jest.spyOn(client, 'geocode').mockResolvedValue(response); + + const locationService = new LocationService(client, logger); + const result = await locationService.getCoordinates("invalidAddress"); + + expect(result?.code).toStrictEqual("LOCATION_NOT_FOUND"); + }); + test('Should return error on empty location result', async () => { + var client = new Client(); + var response = {}; + response.status = 200; + response.data = {status: Status.OK}; + + + jest.spyOn(client, 'geocode').mockResolvedValue(response); + + const locationService = new LocationService(client, logger); + const result = await locationService.getCoordinates("invalidAddress"); + + expect(result?.code).toStrictEqual("LOCATION_NOT_FOUND"); + }); + }) + }) \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3231285 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,104 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./build", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "exclude": ["node_modules/**", "tests/**","jest.*"] +} From 13f6542b920b764105f582edff949398f01e67c6 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 07:25:08 +0500 Subject: [PATCH 02/25] Updated readme with architecture, structure and stack details --- README.md | 144 ++++++++++++++++++++++-------------------------------- 1 file changed, 59 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index 3300a23..69cfa5c 100644 --- a/README.md +++ b/README.md @@ -1,86 +1,60 @@ -# Superformula Cloud Backend Test - -Be sure to read **all** of this document carefully, and follow the guidelines within. - -### Summary - -Build a GraphQL API for geographical data to receive an arbitrary address and return its coordinates (Latitude and Longitude). - -Example response: - -```json -{ - "latitude": 37.821385, - "longitude": -122.478779, -} +# Superformula Cloud Backend Test - Manan Habib + +## Table of contents + +- [Technical stack](#tech-stack); +- [Architecture](#architecture); +- [Project Structure](#repo-structure); +- [Structure of the folder "/src/server"](#structure-of-server-folder); +- [Useful Environment Variables](#env-variables); +- [Setting up your environment and building/running/testing the solution](#setting-up); +- [GraphQL documentation and playground](#graphql-docs-and-playground); +- [Description of some of the frameworks/tools used in the solution](#frameworks-and-tools); +- [Test bonuses](#bonuses) +- [Further improvements](#further-improvements); + +## Technical stack + +- [**Node.js**](https://nodejs.org/en/) as runtime +- [**Typescript**](https://www.typescriptlang.org/) as programming language +- [**API Gateway**](https://aws.amazon.com/api-gateway/) to expose API +- [**AWS Lambda**](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) as compute service +- [**AWS CloudWatch**](https://aws.amazon.com/cloudwatch) for logging +- [**GraphQL**](https://graphql.org/) as specification to develop API using **Apollo Server** +- [**Terraform**](https://www.terraform.io/) as IaC + +## Architecture +As the image shows, we have serverless architecture of this project built upon amazon web services. +the first entry point for request is **Api Gateway** which redirects the request to corresponding lambda +function. After gateway, **AWS Lambda**, gets the request and this is the actual component where request gets +processed and response is generated for user. It is the building block of serverless architecture where on each +request a lambda gets triggered, serves the response and gets killed. While process of request in lambda, all the +logs and traces being generated get saved in **AWS Cloudwatch service**. + +To get the coordinates against given address, **Google geocoding api** is being used. Lambda function directly communicates +with this service to fetch the location data. + +![solution-overall-architecture](./assets/overall_arch.png) + +## Project Structure +Following is the directories arrangememnt in folder: +``` +. +├───coverage # Code coverage report. Jest produce results in this folder. +├───iac # All the terraform files reside in this directory +│ ├───aws +│ ├───api_gateway # Contains .terraform files for api gateway +│ └───lambda # Contains tf files for aws lambda and its role +├───src +│ ├───configs # Implementation around env files and global configs +│ ├───dataSources # Apollo server data sources implementation to wire requests to services +│ ├───resolvers # Graphql Query/Mutation resolvers implementation +│ │ └───coordinates +│ ├───schema # Implementation around graphql schema +│ ├───services # Contains services implementation which makes core business logic of app +│ └───utils # Contains helper/reusable functions +└───tests + ├───e2e # Contains End to end tests + └───unit # Contains unit tests + ``` - -### Requirements - -#### Functionality - -1. The API should follow typical GraphQL API design patterns -1. Proper error handling should be used - -#### Tech Stack - - Use of **TypeScript** is required - - **Please use infrastructure-as-code tooling** that can be used to deploy all resources to AWS. - - Terraform (preferred) - - CloudFormation / SAM - - Serverless Framework - - AWS CDK - - Use **AWS Lambda** + **AWS API Gateway** - - Location query must use [NASA](https://api.nasa.gov/), [Google Maps,](https://developers.google.com/maps) or [Mapbox](https://www.mapbox.com/api-documentation/) APIs to resolve the coordinate based on the address - -#### Developer Experience -- Write unit tests for business logic -- Write concise and clear commit messages -- Developers must be able to run and test this service locally -- Document and diagram the architecture of your solution -- Write clear documentation: - - Repository structure - - Environment variables and any defaults - - How to build/run/test the solution - - Deployment guide - -### Bonus - -These may be used for further challenges. You can freely skip these; feel free to try them out if you feel up to it. - -#### Developer Experience - -1. Code-coverage report generation -1. Online interactive demo with a publicly accessible link to your API - -## What We Care About - -Use any libraries that you would normally use if this were a real production App. Please note: we're interested in your code & the way you solve the problem, not how well you can use a particular library or feature. - -_We're interested in your method and how you approach the problem just as much as we're interested in the end result._ - -Here's what you should strive for: - -- Good use of current `TypeScript`, `Node.js`, `GraphQL` & performance best practices -- Solid testing approach -- Logging and traceability -- Extensible code and architecture -- A delightful experience for other backend engineers working in this repository -- A delightful experience for engineers consuming your APIs - -## Q&A - -> How should I start this code challenge? - -Fork this repo to your own account and make git commits to add your code as you would on any other project. - -> Where should I send back the result when I'm done? - -Send us a pull request when you think you are done. There is no deadline for this task unless otherwise noted to you directly. - -> What if I have a question? - -Create a new issue [in this repo](https://github.com/Superformula/cloud-backend-test/issues) and we will respond and get back to you quickly. - -> I am almost finished, but I don't have time to create everything that is required - -Please provide a plan for the rest of the things that you would do. From 496897bb8e4af9eb1cfc5af9e2fb0063b3d5e6ed Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 07:25:58 +0500 Subject: [PATCH 03/25] Added project architecture image --- proj-arch.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 proj-arch.svg diff --git a/proj-arch.svg b/proj-arch.svg new file mode 100644 index 0000000..f98a789 --- /dev/null +++ b/proj-arch.svg @@ -0,0 +1 @@ + \ No newline at end of file From 511a919a02dfd638cb1c8e664082892c77d05f92 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 07:27:14 +0500 Subject: [PATCH 04/25] Deleting file --- proj-arch.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 proj-arch.svg diff --git a/proj-arch.svg b/proj-arch.svg deleted file mode 100644 index f98a789..0000000 --- a/proj-arch.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 9b8481d0b9170fe1d17a3858e1bbcaf5e9499e0d Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 07:27:33 +0500 Subject: [PATCH 05/25] Added project architecture image --- proj-arch.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 proj-arch.svg diff --git a/proj-arch.svg b/proj-arch.svg new file mode 100644 index 0000000..b51f4bc --- /dev/null +++ b/proj-arch.svg @@ -0,0 +1 @@ + \ No newline at end of file From 457460b9273d6623f676b70a072f19c8fe844250 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 07:28:09 +0500 Subject: [PATCH 06/25] Linked architecture image in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69cfa5c..e53e580 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ logs and traces being generated get saved in **AWS Cloudwatch service**. To get the coordinates against given address, **Google geocoding api** is being used. Lambda function directly communicates with this service to fetch the location data. -![solution-overall-architecture](./assets/overall_arch.png) +![solution-overall-architecture](./proj-arch.svg) ## Project Structure Following is the directories arrangememnt in folder: From 41923df35ccc2fcff89006771971f762bc6f5d9b Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 20:08:23 +0500 Subject: [PATCH 07/25] Added details about environment variables, building and shipping of solution --- README.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e53e580..caaf335 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ - [Technical stack](#tech-stack); - [Architecture](#architecture); - [Project Structure](#repo-structure); -- [Structure of the folder "/src/server"](#structure-of-server-folder); - [Useful Environment Variables](#env-variables); - [Setting up your environment and building/running/testing the solution](#setting-up); - [GraphQL documentation and playground](#graphql-docs-and-playground); @@ -58,3 +57,58 @@ Following is the directories arrangememnt in folder: └───unit # Contains unit tests ``` +## Environment Variables +Following are the important environment variables to be set to run the application. For the scope of this project +I have added env files for dev, test and aws environments having variables set in it. (Although, env files shouldn't +be part of git repo and deployments variable should be in terraform.) +``` +NODE_ENV # Environment of the app +GOOGLE_MAPS_KEY # Api key for maps api +LOG_LEVEL # Log level of the application + +``` + +## Building and running(Locally) + +To manage the build and ship, some npm commands have been implemented in *package.json* file. +#### Install required packages +In order to install required packages, run following command in project root directory: +``` +npm install +``` +This will generate assets in *./build* folder. +#### Build +In order to build the project and generate assets for deployment, run: +``` +npm run build +``` +This will generate assets in *./build* folder. + +#### Run tests +In order to run the test and generate coverage report: +``` +npm test +``` +This will generate CLI report as well as report assets in *./coverage* folder. + +#### Run tests +In order to run the test and generate coverage report: +``` +npm test +``` +This will generate CLI report as well as report assets in *./coverage* folder. +#### Run locally +In order to run the app locally, hit: +``` +npm start +``` +This will host application locally on default 4000 port. +#### Deploy to aws +In order to run the app locally, hit: +``` +npm run aws-deploy +``` +This command will automate the whole building and shipping process using the CLI. On running this, +it will build the assets, run all the test suites, generate a coverage report, create the zipped dist package, +create/update the terraform plan and apply it to deploy it to aws. Upon successful deplpyment, you +shoudl be seeing lambda url in CLI output. From e708dcca4c56cf5c98a966f01ff0fba09c88d4e0 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 20:09:06 +0500 Subject: [PATCH 08/25] Removed the duplication --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index caaf335..c5a4e59 100644 --- a/README.md +++ b/README.md @@ -91,11 +91,6 @@ npm test ``` This will generate CLI report as well as report assets in *./coverage* folder. -#### Run tests -In order to run the test and generate coverage report: -``` -npm test -``` This will generate CLI report as well as report assets in *./coverage* folder. #### Run locally In order to run the app locally, hit: From 76a83251d86fc7c396cceaed3e7ce86eeb6a0cd5 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 20:16:12 +0500 Subject: [PATCH 09/25] Added api reference --- README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/README.md b/README.md index c5a4e59..34893e7 100644 --- a/README.md +++ b/README.md @@ -107,3 +107,31 @@ This command will automate the whole building and shipping process using the CLI it will build the assets, run all the test suites, generate a coverage report, create the zipped dist package, create/update the terraform plan and apply it to deploy it to aws. Upon successful deplpyment, you shoudl be seeing lambda url in CLI output. + +## API Reference + +#### Get location coordinates + +```http + POST /api/insurancePolicy +``` + +| Parameter | Type | Description | +| :-------- | :------- | :------------------------- | +| `address` | `NonEmptyString` | **Required**. Arbitrary address to know the coordinates of | + +#### Response + +```http + { + latitute: value, + longitude: value + } + + //in case of error + + { + code: + message: + } +``` From 1150c74a85e4c87d54d66b1f9aa555c9c7684958 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 22:44:29 +0500 Subject: [PATCH 10/25] Added sample request --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 34893e7..00cc082 100644 --- a/README.md +++ b/README.md @@ -112,8 +112,13 @@ shoudl be seeing lambda url in CLI output. #### Get location coordinates -```http - POST /api/insurancePolicy +``` Sample request + curl -X POST \ + http://localhost:4000/ \ + -H 'cache-control: no-cache' \ + -H 'content-type: application/json' \ + -H 'postman-token: 3e3c3fa8-b827-3b61-ced1-8e3a12f229ca' \ + -d '{"query":"query {\n getCoordinates(address: \"New York\"){\n ... on Coordinates{\n latitude\n longitude\n }\n ... on Error{\n code\n message\n }\n }\n \n \n}\n\n\n","variables":{"address":null}}' ``` | Parameter | Type | Description | From 945e3e1364a9bebaae933a64f768632e08a62880 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Wed, 10 Aug 2022 23:16:45 +0500 Subject: [PATCH 11/25] Added implementation details --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 00cc082..97d8966 100644 --- a/README.md +++ b/README.md @@ -140,3 +140,19 @@ shoudl be seeing lambda url in CLI output. message: } ``` +## Implementation Details + +- Most important aspect of implementation is that it isusing Graphql for API specification. Following are some details of how components are designed. +- **Schema** + - Schema is defined in .graphql file turned into *typedefs* by reading the schema file on runtime. + - A union of type `Coordinates` and `Error` is implemented to have clean error handling in business layer. + - There's a custom type being implemented to have validation of non empty address on first level of request. + **Note**: We could have add validation in business layer as well instead of implementing custom type but given the + fact that app is serverless and cost would be based on compute time, its intutive if we reject the request on schema validation level rather + than let it to go to business layer and have further compute. +- **Resolvers** + - Resolvers are organized on the basis of schema structure. Currently, resolvers just get the request and wire it don to data sources layer. No business logic is exposed in this layer. +- **Data Sources** + - This is a simple layer which uses dependency container to resolve the service component and make it available for resolver layer to call. +- **Services** + - Servcice layer is where all the business logic is implemented. Dependency container from `typedi` is being incorporated in this layer to make services implementation injectable and resolvable without hassle of managing the lifecycle of objects. Dependencies of each service class is also injected in DI container at start of app to be available to consume with in service. This makes whole solution extensible as well as testable. From 30f550f43925e4015a5a4a948fd328394713842e Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Thu, 11 Aug 2022 00:00:30 +0500 Subject: [PATCH 12/25] Added link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 97d8966..70ffe16 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Table of contents -- [Technical stack](#tech-stack); +- [Technical stack](#Technical stack); - [Architecture](#architecture); - [Project Structure](#repo-structure); - [Useful Environment Variables](#env-variables); From 4ec26597c37a8ddb1345b587b6e5b23f3b33ecd7 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Thu, 11 Aug 2022 00:03:28 +0500 Subject: [PATCH 13/25] Fixed table of contents --- README.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 70ffe16..81ff067 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,13 @@ ## Table of contents -- [Technical stack](#Technical stack); -- [Architecture](#architecture); -- [Project Structure](#repo-structure); -- [Useful Environment Variables](#env-variables); -- [Setting up your environment and building/running/testing the solution](#setting-up); -- [GraphQL documentation and playground](#graphql-docs-and-playground); -- [Description of some of the frameworks/tools used in the solution](#frameworks-and-tools); -- [Test bonuses](#bonuses) -- [Further improvements](#further-improvements); +- [Technical stack] +- [Architecture] +- [Project Structure] +- [Environment Variables] +- [Building and running] +- [API Reference] +- [Implementation Details] ## Technical stack @@ -68,7 +66,7 @@ LOG_LEVEL # Log level of the application ``` -## Building and running(Locally) +## Building and running To manage the build and ship, some npm commands have been implemented in *package.json* file. #### Install required packages From f66a9f5801076d52cda3022d276e2f6ff0989fd9 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Thu, 11 Aug 2022 00:08:09 +0500 Subject: [PATCH 14/25] Linked table of contents --- README.md | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 81ff067..a0016cb 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,15 @@ ## Table of contents -- [Technical stack] -- [Architecture] -- [Project Structure] -- [Environment Variables] -- [Building and running] -- [API Reference] -- [Implementation Details] - +- [Technical stack](#tech-stack) +- [Architecture](#arch) +- [Project Structure](#proj-struct) +- [Environment Variables](#env-vars) +- [Building and running](#build-run) +- [API Reference](#api-ref) +- [Implementation Details](#impl-details) + + ## Technical stack - [**Node.js**](https://nodejs.org/en/) as runtime @@ -20,6 +21,7 @@ - [**GraphQL**](https://graphql.org/) as specification to develop API using **Apollo Server** - [**Terraform**](https://www.terraform.io/) as IaC + ## Architecture As the image shows, we have serverless architecture of this project built upon amazon web services. the first entry point for request is **Api Gateway** which redirects the request to corresponding lambda @@ -33,6 +35,7 @@ with this service to fetch the location data. ![solution-overall-architecture](./proj-arch.svg) + ## Project Structure Following is the directories arrangememnt in folder: ``` @@ -55,6 +58,7 @@ Following is the directories arrangememnt in folder: └───unit # Contains unit tests ``` + ## Environment Variables Following are the important environment variables to be set to run the application. For the scope of this project I have added env files for dev, test and aws environments having variables set in it. (Although, env files shouldn't @@ -65,7 +69,7 @@ GOOGLE_MAPS_KEY # Api key for maps api LOG_LEVEL # Log level of the application ``` - + ## Building and running To manage the build and ship, some npm commands have been implemented in *package.json* file. @@ -106,6 +110,7 @@ it will build the assets, run all the test suites, generate a coverage report, c create/update the terraform plan and apply it to deploy it to aws. Upon successful deplpyment, you shoudl be seeing lambda url in CLI output. + ## API Reference #### Get location coordinates @@ -138,6 +143,7 @@ shoudl be seeing lambda url in CLI output. message: } ``` + ## Implementation Details - Most important aspect of implementation is that it isusing Graphql for API specification. Following are some details of how components are designed. From b48685ad8b8a4a5807b78a9d4d28398750fdc355 Mon Sep 17 00:00:00 2001 From: mananhabib31 Date: Thu, 11 Aug 2022 00:10:36 +0500 Subject: [PATCH 15/25] Removed duplication --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a0016cb..18dc0db 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,6 @@ npm test ``` This will generate CLI report as well as report assets in *./coverage* folder. -This will generate CLI report as well as report assets in *./coverage* folder. #### Run locally In order to run the app locally, hit: ``` From e184ec1a01e7e7d7b4eadd9b09b3602108f9f021 Mon Sep 17 00:00:00 2001 From: Manan Habib Date: Thu, 11 Aug 2022 04:15:15 +0500 Subject: [PATCH 16/25] Changed aws key and id Added timeout in e2e tests to fix timeout issue --- coverage/clover.xml | 18 ++++----- coverage/coverage-final.json | 14 +++---- .../dataSources/datasources.ts.html | 2 +- coverage/lcov-report/dataSources/index.html | 2 +- coverage/lcov-report/index.html | 2 +- .../resolvers/coordinates/index.html | 2 +- .../resolvers/coordinates/query.ts.html | 2 +- coverage/lcov-report/resolvers/index.html | 2 +- .../lcov-report/resolvers/resolvers.ts.html | 2 +- .../lcov-report/schema/customScalars.ts.html | 2 +- coverage/lcov-report/schema/index.html | 2 +- coverage/lcov-report/schema/schema.ts.html | 2 +- coverage/lcov-report/services/index.html | 2 +- .../services/locationService.ts.html | 2 +- coverage/lcov-report/utils/helpers.ts.html | 4 +- coverage/lcov-report/utils/index.html | 2 +- iac/deployment/test/.gitignore | 0 main.tf | 4 +- package.linux.json | 38 +++++++++++++++++++ tests/e2e/getCoordinates.query.test.ts | 4 +- 20 files changed, 73 insertions(+), 35 deletions(-) create mode 100644 iac/deployment/test/.gitignore create mode 100644 package.linux.json diff --git a/coverage/clover.xml b/coverage/clover.xml index f475bd1..16c8cad 100644 --- a/coverage/clover.xml +++ b/coverage/clover.xml @@ -1,10 +1,10 @@ - - + + - + @@ -13,7 +13,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -48,7 +48,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -85,7 +85,7 @@ - + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index f0a3485..b557574 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,8 +1,8 @@ -{"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\dataSources\\datasources.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\dataSources\\datasources.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"2":{"start":{"line":4,"column":27},"end":{"line":6,"column":2}},"3":{"start":{"line":4,"column":34},"end":{"line":6,"column":2}},"4":{"start":{"line":4,"column":13},"end":{"line":4,"column":27}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":30}},"loc":{"start":{"line":4,"column":34},"end":{"line":6,"column":2}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":2,"4":1},"f":{"0":2},"b":{}} -,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\resolvers\\resolvers.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\resolvers\\resolvers.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":57}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":55}},"2":{"start":{"line":4,"column":27},"end":{"line":10,"column":null}},"3":{"start":{"line":6,"column":8},"end":{"line":8,"column":23}},"4":{"start":{"line":12,"column":14},"end":{"line":12,"column":36}},"5":{"start":{"line":14,"column":13},"end":{"line":19,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":17}},"loc":{"start":{"line":5,"column":26},"end":{"line":9,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":15},"end":{"line":8,"column":22}},"type":"cond-expr","locations":[{"start":{"line":7,"column":9},"end":{"line":7,"column":16}},{"start":{"line":8,"column":9},"end":{"line":8,"column":22}}]}},"s":{"0":1,"1":1,"2":1,"3":2,"4":1,"5":1},"f":{"0":2},"b":{"0":[1,1]}} -,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\resolvers\\coordinates\\query.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\resolvers\\coordinates\\query.ts","statementMap":{"0":{"start":{"line":3,"column":8},"end":{"line":3,"column":78}},"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":11},"end":{"line":2,"column":16}},"loc":{"start":{"line":2,"column":85},"end":{"line":4,"column":5}}}},"branchMap":{},"s":{"0":2,"1":1},"f":{"0":2},"b":{}} -,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\schema\\customScalars.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\schema\\customScalars.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":4,"column":13},"end":{"line":28,"column":5}},"2":{"start":{"line":8,"column":6},"end":{"line":10,"column":null}},"3":{"start":{"line":9,"column":8},"end":{"line":9,"column":77}},"4":{"start":{"line":11,"column":6},"end":{"line":13,"column":null}},"5":{"start":{"line":12,"column":8},"end":{"line":12,"column":80}},"6":{"start":{"line":15,"column":6},"end":{"line":15,"column":null}},"7":{"start":{"line":18,"column":8},"end":{"line":20,"column":null}},"8":{"start":{"line":19,"column":10},"end":{"line":19,"column":79}},"9":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"10":{"start":{"line":22,"column":10},"end":{"line":22,"column":82}},"11":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":15},"end":{"line":7,"column":16}},"loc":{"start":{"line":7,"column":42},"end":{"line":16,"column":5}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":16},"end":{"line":17,"column":17}},"loc":{"start":{"line":17,"column":43},"end":{"line":26,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":6},"end":{"line":10,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":6},"end":{"line":10,"column":null}}]},"1":{"loc":{"start":{"line":11,"column":6},"end":{"line":13,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":6},"end":{"line":13,"column":null}}]},"2":{"loc":{"start":{"line":18,"column":8},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":20,"column":null}}]},"3":{"loc":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":8},"end":{"line":23,"column":null}}]}},"s":{"0":2,"1":2,"2":3,"3":1,"4":2,"5":1,"6":1,"7":7,"8":1,"9":6,"10":1,"11":5},"f":{"0":3,"1":7},"b":{"0":[1],"1":[1],"2":[1],"3":[1]}} -,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\schema\\schema.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\schema\\schema.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":33}},"3":{"start":{"line":5,"column":15},"end":{"line":5,"column":69}},"4":{"start":{"line":6,"column":13},"end":{"line":8,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{}} -,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\services\\locationService.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\services\\locationService.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":67}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":45}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":39}},"5":{"start":{"line":9,"column":0},"end":{"line":52,"column":null}},"6":{"start":{"line":11,"column":8},"end":{"line":11,"column":16}},"7":{"start":{"line":10,"column":24},"end":{"line":10,"column":38}},"8":{"start":{"line":10,"column":54},"end":{"line":10,"column":62}},"9":{"start":{"line":15,"column":8},"end":{"line":15,"column":92}},"10":{"start":{"line":16,"column":8},"end":{"line":49,"column":null}},"11":{"start":{"line":17,"column":25},"end":{"line":20,"column":14}},"12":{"start":{"line":22,"column":12},"end":{"line":22,"column":75}},"13":{"start":{"line":24,"column":27},"end":{"line":24,"column":68}},"14":{"start":{"line":26,"column":12},"end":{"line":26,"column":73}},"15":{"start":{"line":28,"column":12},"end":{"line":45,"column":null}},"16":{"start":{"line":29,"column":37},"end":{"line":29,"column":79}},"17":{"start":{"line":31,"column":16},"end":{"line":31,"column":112}},"18":{"start":{"line":33,"column":16},"end":{"line":36,"column":null}},"19":{"start":{"line":39,"column":16},"end":{"line":39,"column":84}},"20":{"start":{"line":41,"column":16},"end":{"line":44,"column":null}},"21":{"start":{"line":9,"column":13},"end":{"line":52,"column":null}},"22":{"start":{"line":9,"column":13},"end":{"line":9,"column":28}}},"fnMap":{"0":{"name":"(anonymous_3)","decl":{"start":{"line":10,"column":4},"end":{"line":10,"column":24}},"loc":{"start":{"line":10,"column":68},"end":{"line":12,"column":5}}},"1":{"name":"(anonymous_4)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":16}},"loc":{"start":{"line":14,"column":47},"end":{"line":51,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":12},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":12},"end":{"line":45,"column":null}},{"start":{"line":38,"column":16},"end":{"line":45,"column":null}}]},"1":{"loc":{"start":{"line":28,"column":15},"end":{"line":28,"column":112}},"type":"binary-expr","locations":[{"start":{"line":28,"column":15},"end":{"line":28,"column":38}},{"start":{"line":28,"column":42},"end":{"line":28,"column":75}},{"start":{"line":28,"column":79},"end":{"line":28,"column":112}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":5,"7":5,"8":5,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":2,"17":2,"18":2,"19":4,"20":4,"21":2,"22":2},"f":{"0":5,"1":6},"b":{"0":[2,4],"1":[6,5,3]}} -,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\utils\\helpers.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\src\\utils\\helpers.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":44}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":31}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":39}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":57}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":44}},"7":{"start":{"line":11,"column":13},"end":{"line":11,"column":39}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{}} +{"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\dataSources\\datasources.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\dataSources\\datasources.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"2":{"start":{"line":4,"column":27},"end":{"line":6,"column":2}},"3":{"start":{"line":4,"column":34},"end":{"line":6,"column":2}},"4":{"start":{"line":4,"column":13},"end":{"line":4,"column":27}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":30}},"loc":{"start":{"line":4,"column":34},"end":{"line":6,"column":2}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":2,"4":1},"f":{"0":2},"b":{}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\resolvers\\resolvers.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\resolvers\\resolvers.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":57}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":55}},"2":{"start":{"line":4,"column":27},"end":{"line":10,"column":null}},"3":{"start":{"line":6,"column":8},"end":{"line":8,"column":23}},"4":{"start":{"line":12,"column":14},"end":{"line":12,"column":36}},"5":{"start":{"line":14,"column":13},"end":{"line":19,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":17}},"loc":{"start":{"line":5,"column":26},"end":{"line":9,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":15},"end":{"line":8,"column":22}},"type":"cond-expr","locations":[{"start":{"line":7,"column":9},"end":{"line":7,"column":16}},{"start":{"line":8,"column":9},"end":{"line":8,"column":22}}]}},"s":{"0":1,"1":1,"2":1,"3":2,"4":1,"5":1},"f":{"0":2},"b":{"0":[1,1]}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\resolvers\\coordinates\\query.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\resolvers\\coordinates\\query.ts","statementMap":{"0":{"start":{"line":3,"column":8},"end":{"line":3,"column":78}},"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":11},"end":{"line":2,"column":16}},"loc":{"start":{"line":2,"column":85},"end":{"line":4,"column":5}}}},"branchMap":{},"s":{"0":2,"1":1},"f":{"0":2},"b":{}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\schema\\customScalars.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\schema\\customScalars.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":4,"column":13},"end":{"line":28,"column":5}},"2":{"start":{"line":8,"column":6},"end":{"line":10,"column":null}},"3":{"start":{"line":9,"column":8},"end":{"line":9,"column":77}},"4":{"start":{"line":11,"column":6},"end":{"line":13,"column":null}},"5":{"start":{"line":12,"column":8},"end":{"line":12,"column":80}},"6":{"start":{"line":15,"column":6},"end":{"line":15,"column":null}},"7":{"start":{"line":18,"column":8},"end":{"line":20,"column":null}},"8":{"start":{"line":19,"column":10},"end":{"line":19,"column":79}},"9":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"10":{"start":{"line":22,"column":10},"end":{"line":22,"column":82}},"11":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":15},"end":{"line":7,"column":16}},"loc":{"start":{"line":7,"column":42},"end":{"line":16,"column":5}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":16},"end":{"line":17,"column":17}},"loc":{"start":{"line":17,"column":43},"end":{"line":26,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":6},"end":{"line":10,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":6},"end":{"line":10,"column":null}}]},"1":{"loc":{"start":{"line":11,"column":6},"end":{"line":13,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":6},"end":{"line":13,"column":null}}]},"2":{"loc":{"start":{"line":18,"column":8},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":20,"column":null}}]},"3":{"loc":{"start":{"line":21,"column":8},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":8},"end":{"line":23,"column":null}}]}},"s":{"0":2,"1":2,"2":3,"3":1,"4":2,"5":1,"6":1,"7":7,"8":1,"9":6,"10":1,"11":5},"f":{"0":3,"1":7},"b":{"0":[1],"1":[1],"2":[1],"3":[1]}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\schema\\schema.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\schema\\schema.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":33}},"3":{"start":{"line":5,"column":15},"end":{"line":5,"column":69}},"4":{"start":{"line":6,"column":13},"end":{"line":8,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\services\\locationService.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\services\\locationService.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":67}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":45}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":33}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":39}},"5":{"start":{"line":9,"column":0},"end":{"line":52,"column":null}},"6":{"start":{"line":11,"column":8},"end":{"line":11,"column":16}},"7":{"start":{"line":10,"column":24},"end":{"line":10,"column":38}},"8":{"start":{"line":10,"column":54},"end":{"line":10,"column":62}},"9":{"start":{"line":15,"column":8},"end":{"line":15,"column":92}},"10":{"start":{"line":16,"column":8},"end":{"line":49,"column":null}},"11":{"start":{"line":17,"column":25},"end":{"line":20,"column":14}},"12":{"start":{"line":22,"column":12},"end":{"line":22,"column":75}},"13":{"start":{"line":24,"column":27},"end":{"line":24,"column":68}},"14":{"start":{"line":26,"column":12},"end":{"line":26,"column":73}},"15":{"start":{"line":28,"column":12},"end":{"line":45,"column":null}},"16":{"start":{"line":29,"column":37},"end":{"line":29,"column":79}},"17":{"start":{"line":31,"column":16},"end":{"line":31,"column":112}},"18":{"start":{"line":33,"column":16},"end":{"line":36,"column":null}},"19":{"start":{"line":39,"column":16},"end":{"line":39,"column":84}},"20":{"start":{"line":41,"column":16},"end":{"line":44,"column":null}},"21":{"start":{"line":9,"column":13},"end":{"line":52,"column":null}},"22":{"start":{"line":9,"column":13},"end":{"line":9,"column":28}}},"fnMap":{"0":{"name":"(anonymous_3)","decl":{"start":{"line":10,"column":4},"end":{"line":10,"column":24}},"loc":{"start":{"line":10,"column":68},"end":{"line":12,"column":5}}},"1":{"name":"(anonymous_4)","decl":{"start":{"line":14,"column":11},"end":{"line":14,"column":16}},"loc":{"start":{"line":14,"column":47},"end":{"line":51,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":12},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":12},"end":{"line":45,"column":null}},{"start":{"line":38,"column":16},"end":{"line":45,"column":null}}]},"1":{"loc":{"start":{"line":28,"column":15},"end":{"line":28,"column":112}},"type":"binary-expr","locations":[{"start":{"line":28,"column":15},"end":{"line":28,"column":38}},{"start":{"line":28,"column":42},"end":{"line":28,"column":75}},{"start":{"line":28,"column":79},"end":{"line":28,"column":112}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":5,"7":5,"8":5,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":2,"17":2,"18":2,"19":4,"20":4,"21":2,"22":2},"f":{"0":5,"1":6},"b":{"0":[2,4],"1":[6,5,3]}} +,"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\utils\\helpers.ts": {"path":"E:\\Dev\\Temp Repos\\Superformula - Nodejs Challenge\\cloud-backend-test\\src\\utils\\helpers.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":44}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":31}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":39}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":57}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":44}},"7":{"start":{"line":11,"column":13},"end":{"line":11,"column":39}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{}} } diff --git a/coverage/lcov-report/dataSources/datasources.ts.html b/coverage/lcov-report/dataSources/datasources.ts.html index 8b0bd87..b710ac0 100644 --- a/coverage/lcov-report/dataSources/datasources.ts.html +++ b/coverage/lcov-report/dataSources/datasources.ts.html @@ -85,7 +85,7 @@

All files / dataSources