From 603c04cd6c02056ebe85a67286004811f78deb11 Mon Sep 17 00:00:00 2001 From: Kayanr Date: Thu, 25 Feb 2021 14:59:59 -0500 Subject: [PATCH 1/8] First commit - add create pokedex database and pokemons, types and pokemon_types tables First commit add create pokedex database and pokemons, types and pokemon_types tables. --- data/schema.sql | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/data/schema.sql b/data/schema.sql index e69de29..c3adf4f 100644 --- a/data/schema.sql +++ b/data/schema.sql @@ -0,0 +1,38 @@ +create database pokedex; +show databases; +use pokedex; +show tables; + +describe pokemon; + +#drop table pokemon; + +CREATE TABLE `pokemons` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(45) NOT NULL, + `url` varchar(50) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +describe type; + +#drop table type; +CREATE TABLE `types` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(45) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + + +CREATE TABLE `pokemon_types` ( + `ptid` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `pokemonId` smallint unsigned NOT NULL, + `typeId` smallint unsigned NOT NULL, + foreign key (pokemonId) references pokemons (id), + foreign key (typeId) references types (id), + primary key(ptid) +) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + + + + From 430a9911e551bb4e2b93b10409bf64ff9a2ca88f Mon Sep 17 00:00:00 2001 From: Kayanr Date: Thu, 25 Feb 2021 15:42:20 -0500 Subject: [PATCH 2/8] updated schema script. updated schema script. --- data/schema.sql | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/data/schema.sql b/data/schema.sql index c3adf4f..ead0dc5 100644 --- a/data/schema.sql +++ b/data/schema.sql @@ -1,9 +1,6 @@ create database pokedex; show databases; use pokedex; -show tables; - -describe pokemon; #drop table pokemon; @@ -14,7 +11,8 @@ CREATE TABLE `pokemons` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -describe type; +describe pokemons; + #drop table type; CREATE TABLE `types` ( @@ -23,6 +21,7 @@ CREATE TABLE `types` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +describe types; CREATE TABLE `pokemon_types` ( `ptid` smallint(5) unsigned NOT NULL AUTO_INCREMENT, @@ -33,6 +32,6 @@ CREATE TABLE `pokemon_types` ( primary key(ptid) ) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; - - +describe pokemon_types; +show tables; From 7873d648669cd238925fcbf5e4cfb5f34b687a06 Mon Sep 17 00:00:00 2001 From: Kayanr Date: Mon, 1 Mar 2021 17:05:25 -0500 Subject: [PATCH 3/8] add mysql connection add mysql connection --- data/schema.sql | 53 +++++++++++++++++++++++++++++++++++++-- main.js | 23 +++++++++++++++++ package-lock.json | 63 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- test.js | 19 ++++++++++++++ 5 files changed, 158 insertions(+), 3 deletions(-) create mode 100644 main.js create mode 100644 test.js diff --git a/data/schema.sql b/data/schema.sql index ead0dc5..60a8b2b 100644 --- a/data/schema.sql +++ b/data/schema.sql @@ -2,12 +2,12 @@ create database pokedex; show databases; use pokedex; -#drop table pokemon; +drop table pokemons; CREATE TABLE `pokemons` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, - `url` varchar(50) NOT NULL, + `url` varchar(500) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; @@ -35,3 +35,52 @@ CREATE TABLE `pokemon_types` ( describe pokemon_types; show tables; +use pokedex; +INSERT INTO types (id, name) values( null, 'grass'), +( null, 'poison'), +( null, 'fire'), +( null, 'flying'), +( null, 'water'), +( null, 'bug'); + +select * from types; + +INSERT INTO pokemons (id, name, url) values (null, 'bulbasaur', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png'), +(null, 'ivysaur', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/2.png'), +(null, 'venusaur', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/3.png'), +(null, 'charmander', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/4.png'), +(null, 'charmeleon', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/5.png'), +(null, 'charizard', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/6.png'), +(null, 'squirtle', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/7.png'), +(null, 'wartortle', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/8.png'), +(null, 'blastoise', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/9.png'), +(null, 'caterpie', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10.png'), +(null, 'metapod', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/11.png'), +(null, 'butterfree', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/12.png'); + +select * from pokemons; + +select * from pokemon_types; +INSERT INTO `pokedex`.`pokemon_types` values +(null, 123,123 ), +(null, 123, 124 ), +(null, 124, 123), +(null, 124,124 ), +(null, 125, 123 ), +(null, 125, 124), +(null, 126, 125), +(null, 127, 125), +(null, 128, 125), +(null, 128, 126), +(null, 129, 127), +(null, 130, 127), +(null, 131, 127), +(null, 132, 128), +(null, 133, 128), +(null, 134, 128), +(null, 134, 126); + + +select * from pokemons as p inner join pokemon_types as pt on p.id = pt.pokemonId +inner join types as t on t.id = pt.typeId +order by p.id; diff --git a/main.js b/main.js new file mode 100644 index 0000000..a68c076 --- /dev/null +++ b/main.js @@ -0,0 +1,23 @@ +let mysql = require("mysql"); + +let con = mysql = mysql.createConnection({ + host:"localhost", + user: "root", + password: "", + database:"pokedex" +}) + + +con.connect(err => { + if(err){ + throw err; + } + con.query("SELECT * FROM pokemons", (err, result, fields) => { + if(err){ + throw err; + } + console.log(result) + + }) +}); +con.end; diff --git a/package-lock.json b/package-lock.json index 1fca92a..d6e66a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -63,6 +68,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -192,6 +202,11 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -230,6 +245,17 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "requires": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -253,6 +279,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -283,6 +314,20 @@ "unpipe": "1.0.0" } }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -336,11 +381,24 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -360,6 +418,11 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/package.json b/package.json index 944e450..12f5abe 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ }, "homepage": "https://github.com/code-differently/Pokedex-App#readme", "dependencies": { - "express": "^4.17.1" + "express": "^4.17.1", + "mysql": "^2.18.1" } } diff --git a/test.js b/test.js new file mode 100644 index 0000000..23c234f --- /dev/null +++ b/test.js @@ -0,0 +1,19 @@ + +let password = ""; + +let mysql = require('mysql'); + +let con = mysql.createConnection({ +host: "localhost", +user: "root", +password: password, +database: "classicmodels" +}); + +con.query("SELECT * FROM customers", (err, result, fields) => { +console.log(result); +}); + + +//use classicmodels; -database +//SELECT * FROM customers; From d8b05f64e9747b9f77513803de5500a72815f27c Mon Sep 17 00:00:00 2001 From: Kayanr Date: Wed, 3 Mar 2021 15:52:13 -0500 Subject: [PATCH 4/8] add pokedex database and data add pokedex database and data --- index.js | 11 - main.js | 23 -- package-lock.json | 987 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 + rest/index.js | 62 ++- test.js | 19 - web/index.html | 16 +- web/script.js | 4 + web/style.css | 0 9 files changed, 1063 insertions(+), 63 deletions(-) delete mode 100644 index.js delete mode 100644 main.js delete mode 100644 test.js create mode 100644 web/script.js create mode 100644 web/style.css diff --git a/index.js b/index.js deleted file mode 100644 index bba5463..0000000 --- a/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const express = require('express') -const app = express() -const port = 3000 - -app.get('/', (req, res) => { - res.send('Hello World!') -}) - -app.listen(port, () => { - console.log(`Example app listening at http://localhost:${port}`) -}) \ No newline at end of file diff --git a/main.js b/main.js deleted file mode 100644 index a68c076..0000000 --- a/main.js +++ /dev/null @@ -1,23 +0,0 @@ -let mysql = require("mysql"); - -let con = mysql = mysql.createConnection({ - host:"localhost", - user: "root", - password: "", - database:"pokedex" -}) - - -con.connect(err => { - if(err){ - throw err; - } - con.query("SELECT * FROM pokemons", (err, result, fields) => { - if(err){ - throw err; - } - console.log(result) - - }) -}); -con.end; diff --git a/package-lock.json b/package-lock.json index d6e66a7..1902ce2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,27 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -13,16 +34,75 @@ "negotiator": "0.6.2" } }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, "bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -40,11 +120,183 @@ "type-is": "~1.6.17" } }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.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" + } + } + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -73,6 +325,21 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -81,6 +348,27 @@ "ms": "2.0.0" } }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -91,16 +379,52 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -148,6 +472,15 @@ "vary": "~1.1.2" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -172,6 +505,83 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "requires": { + "ini": "1.3.7" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -192,21 +602,177 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, "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-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==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "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 + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -240,6 +806,27 @@ "mime-db": "1.45.0" } }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -261,6 +848,67 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "nodemon": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", + "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "dev": true, + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.3", + "update-notifier": "^4.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "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==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "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==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -269,6 +917,41 @@ "ee-first": "1.1.1" } }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.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 + } + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -279,6 +962,18 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -293,6 +988,31 @@ "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==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -314,6 +1034,18 @@ "unpipe": "1.0.0" } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -328,6 +1060,42 @@ "util-deprecate": "~1.0.1" } }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -338,6 +1106,29 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "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 + } + } + }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -381,6 +1172,12 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, "sqlstring": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", @@ -391,6 +1188,46 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "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 + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -399,11 +1236,71 @@ "safe-buffer": "~5.1.0" } }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -413,11 +1310,68 @@ "mime-types": "~2.1.24" } }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -432,6 +1386,39 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true } } } diff --git a/package.json b/package.json index 12f5abe..5d57564 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,11 @@ }, "homepage": "https://github.com/code-differently/Pokedex-App#readme", "dependencies": { + "cors": "^2.8.5", "express": "^4.17.1", "mysql": "^2.18.1" + }, + "devDependencies": { + "nodemon": "^2.0.7" } } diff --git a/rest/index.js b/rest/index.js index bba5463..36bb1cc 100644 --- a/rest/index.js +++ b/rest/index.js @@ -1,11 +1,67 @@ +//The backend information goes here const express = require('express') +let mysql = require("mysql"); const app = express() const port = 3000 +//let cors = require('cors'); + +//app.use(cors()); + +/* +app.use((req, res, next) => { + res.header('Access-Control-Allow-Origin', '*'); + next(); +}); + +// Add Access Control Allow Origin headers + +app.use((req, res, next) => { + res.setHeader("Access-Control-Allow-Origin", 'http://localhost:3000'); + res.header( + "Access-Control-Allow-Headers", + "Origin, X-Requested-With, Content-Type, Accept" + ); + next(); +}); +*/ app.get('/', (req, res) => { - res.send('Hello World!') -}) + res.send('Hello World!'); +}); + app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`) -}) \ No newline at end of file +}); + +/* +app.use((req, res, next) => { + res.header("Access-Control-Allow-Origin", "*") +}) ; +*/ + +app.get('/pokemons', (req, res) => { + let pokemonData = getPokemonData(); + res.send(pokemonData); + //console.log("I am in /pokemons route:" + pokemonData); +} +); + +async function getPokemonData(){ +let con = mysql.createConnection({ + host: "localhost", + user: "root", + password: "password" ,/*remove b4 uploading to gitHub*/ + database: "pokedex" +}); + +let data = await new Promise((resolve, reject) => { + con.query("SELECT * FROM pokemons", (err, result, fields) => { + (err)? reject(err) : resolve(result); + //console.log("I am in Promise section: here are the results" + result); +}) + +}) +con.end(); +return data; +} \ No newline at end of file diff --git a/test.js b/test.js deleted file mode 100644 index 23c234f..0000000 --- a/test.js +++ /dev/null @@ -1,19 +0,0 @@ - -let password = ""; - -let mysql = require('mysql'); - -let con = mysql.createConnection({ -host: "localhost", -user: "root", -password: password, -database: "classicmodels" -}); - -con.query("SELECT * FROM customers", (err, result, fields) => { -console.log(result); -}); - - -//use classicmodels; -database -//SELECT * FROM customers; diff --git a/web/index.html b/web/index.html index 1de928b..55183be 100644 --- a/web/index.html +++ b/web/index.html @@ -1,11 +1,13 @@ - - - + + + Document - - + +

Hello Pokemon!

- - \ No newline at end of file + +
+ + diff --git a/web/script.js b/web/script.js new file mode 100644 index 0000000..6fc2c98 --- /dev/null +++ b/web/script.js @@ -0,0 +1,4 @@ +fetch("http://localhost:3000/pokemons").then((response) => + response.json()).then(pokemons => { + document.getElementById("test").innerHTML = pokemons.map(pokemon => `
${pokemons.id}
`).join('') + }) diff --git a/web/style.css b/web/style.css new file mode 100644 index 0000000..e69de29 From b464c7dd5d7e40d71d963336ca0723811a12afe9 Mon Sep 17 00:00:00 2001 From: Kayanr Date: Thu, 4 Mar 2021 16:46:24 -0500 Subject: [PATCH 5/8] create xhr object and display 12 pokemon from database on webpage create xhr object and display 12 pokemon from database on webpage --- rest/index.js | 80 +++++++++++++++++--------------------------------- web/index.html | 7 +++-- web/script.js | 49 ++++++++++++++++++++++++++++--- web/style.css | 27 +++++++++++++++++ 4 files changed, 104 insertions(+), 59 deletions(-) diff --git a/rest/index.js b/rest/index.js index 36bb1cc..8b8dc58 100644 --- a/rest/index.js +++ b/rest/index.js @@ -1,67 +1,41 @@ //The backend information goes here -const express = require('express') +const express = require("express"); let mysql = require("mysql"); -const app = express() -const port = 3000 -//let cors = require('cors'); +const app = express(); +const port = 3000; -//app.use(cors()); -/* -app.use((req, res, next) => { - res.header('Access-Control-Allow-Origin', '*'); - next(); +app.get("/", (req, res) => { + res.send("Hello World!"); }); -// Add Access Control Allow Origin headers - -app.use((req, res, next) => { - res.setHeader("Access-Control-Allow-Origin", 'http://localhost:3000'); - res.header( - "Access-Control-Allow-Headers", - "Origin, X-Requested-With, Content-Type, Accept" - ); - next(); -}); -*/ - -app.get('/', (req, res) => { - res.send('Hello World!'); -}); - - app.listen(port, () => { - console.log(`Example app listening at http://localhost:${port}`) + console.log(`Example app listening at http://localhost:${port}`); }); -/* -app.use((req, res, next) => { - res.header("Access-Control-Allow-Origin", "*") -}) ; -*/ -app.get('/pokemons', (req, res) => { - let pokemonData = getPokemonData(); +app.get("/pokemons", async (req, res) => { + res.header("Access-Control-Allow-Origin", "*"); + let pokemonData = await getPokemonData(); res.send(pokemonData); - //console.log("I am in /pokemons route:" + pokemonData); -} -); - -async function getPokemonData(){ -let con = mysql.createConnection({ - host: "localhost", - user: "root", - password: "password" ,/*remove b4 uploading to gitHub*/ - database: "pokedex" + }); -let data = await new Promise((resolve, reject) => { - con.query("SELECT * FROM pokemons", (err, result, fields) => { - (err)? reject(err) : resolve(result); - //console.log("I am in Promise section: here are the results" + result); -}) +async function getPokemonData() { + let con = mysql.createConnection({ + host: "localhost", + user: "root", + password: "password" /*remove b4 uploading to gitHub*/, + database: "Pokedex", + }); + + let data = await new Promise((resolve, reject) => { + con.query("SELECT * FROM pokemons", (err, result, fields) => { + err ? reject(err) : resolve(result); + }); + }); -}) -con.end(); -return data; -} \ No newline at end of file + con.end(); + + return data; +} diff --git a/web/index.html b/web/index.html index 55183be..abf3a31 100644 --- a/web/index.html +++ b/web/index.html @@ -3,11 +3,14 @@ - Document + PokeDex Full Stack App +

Hello Pokemon!

- +
    + + diff --git a/web/script.js b/web/script.js index 6fc2c98..d32d24e 100644 --- a/web/script.js +++ b/web/script.js @@ -1,4 +1,45 @@ -fetch("http://localhost:3000/pokemons").then((response) => - response.json()).then(pokemons => { - document.getElementById("test").innerHTML = pokemons.map(pokemon => `
    ${pokemons.id}
    `).join('') - }) +// create an XHR object +let pokedex = document.getElementById("pokedex"); + +//console.log(pokedex); + +const xhr = new XMLHttpRequest(); + + +// listen for `onload` event +xhr.onload = () => { + // process response + if (xhr.status == 200) { + // parse JSON data + + let pokemonDatas = JSON.parse(xhr.response); + + displayPokemon(pokemonDatas); + } else { + console.error("Error!"); + } +}; + +// create a `GET` request +xhr.open("GET", "http://localhost:3000/pokemons"); + +// send request +xhr.send(); + +const displayPokemon = (pokemon) => { + console.log("In displayPokemon" + pokemon); + + const pokemonHTMLString = pokemon.map( pokeman => ` +
  1. +

    ${pokeman.name} #${pokeman.id}

    + + +

    Type:

    +
  2. + ` + ).join('') + + pokedex.innerHTML = pokemonHTMLString; + +} + diff --git a/web/style.css b/web/style.css index e69de29..755b1c3 100644 --- a/web/style.css +++ b/web/style.css @@ -0,0 +1,27 @@ +body{ + background-color: orangered; + margin: 0px; +} + +span{ + text-align: right; +} + +.card{ + list-style: none; + padding: 40px; + background-color: #f4f4f4; + color:#222 +} + +.card-title{ + text-transform: uppercase; + font-size: 32px; + font-weight: normal; +} +#pokedex{ + padding-inline-start: 0; + display:grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)) ; + grid-gap: 20px; +} \ No newline at end of file From 667c882e15430b5a46462788d6eb82eb2b9582de Mon Sep 17 00:00:00 2001 From: Kayanr Date: Sat, 6 Mar 2021 12:54:11 -0500 Subject: [PATCH 6/8] adjust index.html, script.js, style.js and index,js adjusted index.html, script.js, style.js and index,js : to add border bottom to card headings, add "Pokedex" heading and centered it, create loadPokemonData function --- rest/index.js | 22 +++++++++++++++++++--- web/index.html | 2 +- web/script.js | 2 +- web/style.css | 20 +++++++++++++++----- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/rest/index.js b/rest/index.js index 8b8dc58..564ee62 100644 --- a/rest/index.js +++ b/rest/index.js @@ -4,7 +4,6 @@ let mysql = require("mysql"); const app = express(); const port = 3000; - app.get("/", (req, res) => { res.send("Hello World!"); }); @@ -13,12 +12,10 @@ app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); }); - app.get("/pokemons", async (req, res) => { res.header("Access-Control-Allow-Origin", "*"); let pokemonData = await getPokemonData(); res.send(pokemonData); - }); async function getPokemonData() { @@ -39,3 +36,22 @@ async function getPokemonData() { return data; } + +async function LoadPokemonData() { + let con = mysql.createConnection({ + host: "localhost", + user: "root", + password: "password" /*remove b4 uploading to gitHub*/, + database: "Pokedex", + }); + + let data = await new Promise((resolve, reject) => { + con.query("SELECT * FROM pokemons", (err, result, fields) => { + err ? reject(err) : resolve(result); + }); + }); + + con.end(); + + return data; +} diff --git a/web/index.html b/web/index.html index abf3a31..f9d79a2 100644 --- a/web/index.html +++ b/web/index.html @@ -7,7 +7,7 @@ -

    Hello Pokemon!

    +

    Pokedex

      diff --git a/web/script.js b/web/script.js index d32d24e..47e1dd1 100644 --- a/web/script.js +++ b/web/script.js @@ -31,7 +31,7 @@ const displayPokemon = (pokemon) => { const pokemonHTMLString = pokemon.map( pokeman => `
    1. -

      ${pokeman.name} #${pokeman.id}

      +

      ${pokeman.name} #${pokeman.id}

      Type:

      diff --git a/web/style.css b/web/style.css index 755b1c3..c52de7b 100644 --- a/web/style.css +++ b/web/style.css @@ -1,17 +1,26 @@ body{ - background-color: orangered; + background-color: #de6f21; margin: 0px; } -span{ - text-align: right; +h1{ + text-align: center; +} +.card-header{ + display: grid; + grid-template-columns:2fr 1fr ; + border-bottom-color: grey; + border-bottom-style: solid; + border-bottom-width: 10px; + } .card{ list-style: none; - padding: 40px; + padding: 0px; background-color: #f4f4f4; - color:#222 + color:#222; + margin: 0px; } .card-title{ @@ -24,4 +33,5 @@ span{ display:grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)) ; grid-gap: 20px; + margin:5px; } \ No newline at end of file From 024ddb97b485e3b9c4a215b010fe918bea74d204 Mon Sep 17 00:00:00 2001 From: Kayanr Date: Mon, 8 Mar 2021 14:47:17 -0500 Subject: [PATCH 7/8] change schema and add getFromAPI function change schema and add getFromAPI function --- data/schema copy.sql | 86 ++++++++++++++++++++++++++++++++++++++++ data/schema.sql | 93 ++++++++------------------------------------ rest/index.js | 26 +++++++++++-- 3 files changed, 125 insertions(+), 80 deletions(-) create mode 100644 data/schema copy.sql diff --git a/data/schema copy.sql b/data/schema copy.sql new file mode 100644 index 0000000..60a8b2b --- /dev/null +++ b/data/schema copy.sql @@ -0,0 +1,86 @@ +create database pokedex; +show databases; +use pokedex; + +drop table pokemons; + +CREATE TABLE `pokemons` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(45) NOT NULL, + `url` varchar(500) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +describe pokemons; + + +#drop table type; +CREATE TABLE `types` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(45) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +describe types; + +CREATE TABLE `pokemon_types` ( + `ptid` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `pokemonId` smallint unsigned NOT NULL, + `typeId` smallint unsigned NOT NULL, + foreign key (pokemonId) references pokemons (id), + foreign key (typeId) references types (id), + primary key(ptid) +) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +describe pokemon_types; +show tables; + +use pokedex; +INSERT INTO types (id, name) values( null, 'grass'), +( null, 'poison'), +( null, 'fire'), +( null, 'flying'), +( null, 'water'), +( null, 'bug'); + +select * from types; + +INSERT INTO pokemons (id, name, url) values (null, 'bulbasaur', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png'), +(null, 'ivysaur', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/2.png'), +(null, 'venusaur', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/3.png'), +(null, 'charmander', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/4.png'), +(null, 'charmeleon', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/5.png'), +(null, 'charizard', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/6.png'), +(null, 'squirtle', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/7.png'), +(null, 'wartortle', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/8.png'), +(null, 'blastoise', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/9.png'), +(null, 'caterpie', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10.png'), +(null, 'metapod', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/11.png'), +(null, 'butterfree', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/12.png'); + +select * from pokemons; + +select * from pokemon_types; +INSERT INTO `pokedex`.`pokemon_types` values +(null, 123,123 ), +(null, 123, 124 ), +(null, 124, 123), +(null, 124,124 ), +(null, 125, 123 ), +(null, 125, 124), +(null, 126, 125), +(null, 127, 125), +(null, 128, 125), +(null, 128, 126), +(null, 129, 127), +(null, 130, 127), +(null, 131, 127), +(null, 132, 128), +(null, 133, 128), +(null, 134, 128), +(null, 134, 126); + + +select * from pokemons as p inner join pokemon_types as pt on p.id = pt.pokemonId +inner join types as t on t.id = pt.typeId +order by p.id; diff --git a/data/schema.sql b/data/schema.sql index 60a8b2b..8e71ac1 100644 --- a/data/schema.sql +++ b/data/schema.sql @@ -1,86 +1,25 @@ -create database pokedex; +create database pokedex2; show databases; -use pokedex; +use pokedex2; -drop table pokemons; +#drop table pokemons; CREATE TABLE `pokemons` ( - `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(45) NOT NULL, - `url` varchar(500) NOT NULL, + `id` INT PRIMARY KEY NOT NULL, + `name` varchar(50), + `url` varchar(256), PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +); -describe pokemons; - - -#drop table type; CREATE TABLE `types` ( - `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(45) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; - -describe types; + `id` INT PRIMARY KEY NOT NULL, + `name` varchar(32), +); CREATE TABLE `pokemon_types` ( - `ptid` smallint(5) unsigned NOT NULL AUTO_INCREMENT, - `pokemonId` smallint unsigned NOT NULL, - `typeId` smallint unsigned NOT NULL, - foreign key (pokemonId) references pokemons (id), - foreign key (typeId) references types (id), - primary key(ptid) -) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; - -describe pokemon_types; -show tables; - -use pokedex; -INSERT INTO types (id, name) values( null, 'grass'), -( null, 'poison'), -( null, 'fire'), -( null, 'flying'), -( null, 'water'), -( null, 'bug'); - -select * from types; - -INSERT INTO pokemons (id, name, url) values (null, 'bulbasaur', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png'), -(null, 'ivysaur', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/2.png'), -(null, 'venusaur', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/3.png'), -(null, 'charmander', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/4.png'), -(null, 'charmeleon', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/5.png'), -(null, 'charizard', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/6.png'), -(null, 'squirtle', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/7.png'), -(null, 'wartortle', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/8.png'), -(null, 'blastoise', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/9.png'), -(null, 'caterpie', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10.png'), -(null, 'metapod', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/11.png'), -(null, 'butterfree', 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/12.png'); - -select * from pokemons; - -select * from pokemon_types; -INSERT INTO `pokedex`.`pokemon_types` values -(null, 123,123 ), -(null, 123, 124 ), -(null, 124, 123), -(null, 124,124 ), -(null, 125, 123 ), -(null, 125, 124), -(null, 126, 125), -(null, 127, 125), -(null, 128, 125), -(null, 128, 126), -(null, 129, 127), -(null, 130, 127), -(null, 131, 127), -(null, 132, 128), -(null, 133, 128), -(null, 134, 128), -(null, 134, 126); - - -select * from pokemons as p inner join pokemon_types as pt on p.id = pt.pokemonId -inner join types as t on t.id = pt.typeId -order by p.id; + `id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + `pokemonId` INT NOT NULL, + `typeId` INT NOT NULL, + foreign key (pokemonId) references pokemons(id), + foreign key (typeId) references types(id), + ); \ No newline at end of file diff --git a/rest/index.js b/rest/index.js index 564ee62..55ba1a7 100644 --- a/rest/index.js +++ b/rest/index.js @@ -22,7 +22,7 @@ async function getPokemonData() { let con = mysql.createConnection({ host: "localhost", user: "root", - password: "password" /*remove b4 uploading to gitHub*/, + password: "password", database: "Pokedex", }); @@ -37,11 +37,31 @@ async function getPokemonData() { return data; } -async function LoadPokemonData() { +async function getFromAPI() { + let promises = []; + + for (let i = 1; i <= 151; i++) { + let response = axios.get(`https://pokeapi.co/api/v2/pokemon${i}`); + promises.push(response); + } + + let responses = await Promise.all(promise); + + return responses + .map((response) => response.data) + .map((data) => ({ + id: data.id, + name: data.name, + types: data.types.map((type) => type.type.name), + img: data.sprites["other"]["official-artwork"]["front_default"], + })); +} + +async function loadPokemonData() { let con = mysql.createConnection({ host: "localhost", user: "root", - password: "password" /*remove b4 uploading to gitHub*/, + password: "password", database: "Pokedex", }); From f473e3e69d2ef99185f255cc770df56be99ec90c Mon Sep 17 00:00:00 2001 From: Kayanr Date: Tue, 9 Mar 2021 10:05:17 -0500 Subject: [PATCH 8/8] add loadDatabase function to load pokemon data to pokedex2 database tables 1) add loadDatabase function to load pokemon data to pokedex2 database tables 2) Loaded 30 pokemon to database 3) Display 30 pokemon from database via Express. Only display 1 of 2 types currently. 4) modify styling (padding, margings) on pokemon cards --- package-lock.json | 13 +++++++ package.json | 1 + rest/index.js | 98 +++++++++++++++++++++++++++++++++++++---------- web/script.js | 26 ++++++------- web/style.css | 71 +++++++++++++++++++--------------- 5 files changed, 145 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1902ce2..003558f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -86,6 +86,14 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -495,6 +503,11 @@ "unpipe": "~1.0.0" } }, + "follow-redirects": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", diff --git a/package.json b/package.json index 5d57564..87d4acc 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ }, "homepage": "https://github.com/code-differently/Pokedex-App#readme", "dependencies": { + "axios": "^0.21.1", "cors": "^2.8.5", "express": "^4.17.1", "mysql": "^2.18.1" diff --git a/rest/index.js b/rest/index.js index 55ba1a7..f2f0bba 100644 --- a/rest/index.js +++ b/rest/index.js @@ -1,8 +1,10 @@ -//The backend information goes here const express = require("express"); -let mysql = require("mysql"); +const mysql = require("mysql"); +const cors = require("cors"); +const axios = require("axios"); const app = express(); const port = 3000; +app.use(cors()); app.get("/", (req, res) => { res.send("Hello World!"); @@ -11,23 +13,31 @@ app.get("/", (req, res) => { app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); }); +// app.get("/v3/pokemons", async (req, res) => { +// let pokedex2 = await getPokemonsFromDatabase(); +// res.send(pokedex2); +// }) app.get("/pokemons", async (req, res) => { res.header("Access-Control-Allow-Origin", "*"); - let pokemonData = await getPokemonData(); + let pokemonData = await getPokemonsFromDatabase(); res.send(pokemonData); }); -async function getPokemonData() { +async function getPokemonsFromDatabase() { let con = mysql.createConnection({ host: "localhost", user: "root", - password: "password", - database: "Pokedex", + password: "password" /*remove b4 uploading to gitHub*/, + database: "Pokedex2", }); let data = await new Promise((resolve, reject) => { - con.query("SELECT * FROM pokemons", (err, result, fields) => { + con.query(`select p.id AS id, p.name AS name, p.url AS url, min(t.name) AS TypeName + from pokemons AS p inner join pokemon_types AS pt on p.id = pt.pokemonId + inner join types AS t on pt.typeId = t.id + group by id, name, url + order by p.id;`, (err, result, fields) => { err ? reject(err) : resolve(result); }); }); @@ -39,14 +49,11 @@ async function getPokemonData() { async function getFromAPI() { let promises = []; - - for (let i = 1; i <= 151; i++) { - let response = axios.get(`https://pokeapi.co/api/v2/pokemon${i}`); + for (let i = 1; i <= 30; i++) { + let response = axios.get(`https://pokeapi.co/api/v2/pokemon/${i}`); promises.push(response); } - - let responses = await Promise.all(promise); - + let responses = await Promise.all(promises); return responses .map((response) => response.data) .map((data) => ({ @@ -57,21 +64,70 @@ async function getFromAPI() { })); } -async function loadPokemonData() { +async function loadDatabase() { let con = mysql.createConnection({ host: "localhost", user: "root", password: "password", - database: "Pokedex", + database: "pokedex2", }); - let data = await new Promise((resolve, reject) => { - con.query("SELECT * FROM pokemons", (err, result, fields) => { - err ? reject(err) : resolve(result); - }); + let data = await getFromAPI(); + console.log(data); + //Insert pokemon into pokemons table ... Do first + + /*data.forEach((pokemon) => { + con.query( + `INSERT INTO pokemons (id, name, url) VALUES (${pokemon.id}, "${pokemon.name}", "${pokemon.img}");` + ); }); + */ - con.end(); + let uniqueTypes = new Set(); + data.forEach((pokemon) => { + pokemon.types.forEach((type) => { + uniqueTypes.add(type); + }); + }); + uniqueTypes = [...uniqueTypes]; + //Do 2nd ...Insert into the Types Table + // for(let i = 0; i < uniqueTypes.length; i++) { + // con.query(`INSERT INTO types (id, name) VALUES (${i+1}, "${uniqueTypes[i]}");`) + // } - return data; + data.forEach((pokemon) => { + pokemon.types.forEach((type) => { + let typeId = uniqueTypes.indexOf(type) + 1; + con.query( + `INSERT INTO pokemon_types (pokemonId, typeId) VALUES (${pokemon.id}, ${typeId});` + ); + }); + }); + console.log(data); } + +//for testing purpose */ +//loadDatabase() +// app.get("/pokemon", async (req, res) => { +// let pokedex = await getPokedex(); +// res.send(pokedex); +// }) +// app.listen(port, () => { +// console.log(`Example app listening at http://localhost:${port}`) +// }) +// async function getPokedex(){ +// let con = mysql.createConnection({ +// host:"localhost", +// user: "root", +// password: "password", +// database:"pokedex2" +// }); +// let data = await new Promise((resolve, reject) => { +// con.query("SELECT * FROM pokeman", (err, result) => { +// (err) ? reject(err) : resolve(result); +// }) +// }) +// con.end(); +// return data; +//} +// getPokedex().then(console.log); diff --git a/web/script.js b/web/script.js index 47e1dd1..e3dec76 100644 --- a/web/script.js +++ b/web/script.js @@ -5,7 +5,6 @@ let pokedex = document.getElementById("pokedex"); const xhr = new XMLHttpRequest(); - // listen for `onload` event xhr.onload = () => { // process response @@ -13,8 +12,8 @@ xhr.onload = () => { // parse JSON data let pokemonDatas = JSON.parse(xhr.response); - - displayPokemon(pokemonDatas); + + displayPokemon(pokemonDatas); } else { console.error("Error!"); } @@ -29,17 +28,18 @@ xhr.send(); const displayPokemon = (pokemon) => { console.log("In displayPokemon" + pokemon); - const pokemonHTMLString = pokemon.map( pokeman => ` + const pokemonHTMLString = pokemon + .map( + (pokeman) => `
    2. -

      ${pokeman.name} #${pokeman.id}

      - - -

      Type:

      +

      ${pokeman.name} #${pokeman.id}

      + +

      Type: ${pokeman.TypeName}

      +
    3. ` - ).join('') - - pokedex.innerHTML = pokemonHTMLString; - -} + ) + .join(""); + pokedex.innerHTML = pokemonHTMLString; +}; diff --git a/web/style.css b/web/style.css index c52de7b..a615f50 100644 --- a/web/style.css +++ b/web/style.css @@ -1,37 +1,48 @@ -body{ - background-color: #de6f21; - margin: 0px; +body { + background-color: #de6f21; + margin: 0px; } -h1{ - text-align: center; +h1 { + text-align: center; } -.card-header{ - display: grid; - grid-template-columns:2fr 1fr ; - border-bottom-color: grey; - border-bottom-style: solid; - border-bottom-width: 10px; - +.card-header { + display: grid; + grid-template-columns: 2fr 1fr; + border-bottom-color: grey; + border-bottom-style: solid; + border-bottom-width: 10px; } -.card{ - list-style: none; - padding: 0px; - background-color: #f4f4f4; - color:#222; - margin: 0px; +.card { + list-style: none; + padding: 0px; + background-color: #f4f4f4; + color: #222; + margin: 0px; } -.card-title{ - text-transform: uppercase; - font-size: 32px; - font-weight: normal; -} -#pokedex{ - padding-inline-start: 0; - display:grid; - grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)) ; - grid-gap: 20px; - margin:5px; -} \ No newline at end of file +.card-image { + text-transform: uppercase; + font-size: 32px; + font-weight: normal; + width: 50%; + height: 50%; + margin: 20px; + padding: 20px; +} +#pokedex { + padding-inline-start: 0; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + grid-gap: 20px; + margin: 5px; +} +.right { + text-align: right; + padding-right: 20px; +} + +.left{ + padding-left: 20px; +}