├── .gitignore
├── pages
└── suggestion
│ ├── styles.css
│ ├── scripts.js
│ ├── index.html
│ └── form.css
├── README.md
├── assets
├── 231488.jpg
├── 234178.jpg
├── 240510.jpg
├── 240527.jpg
├── 241408.jpg
├── 241726.jpg
├── 241895.jpg
├── 242020.jpg
├── 299454.jpg
├── 299476.jpg
├── 472692.jpg
├── 590215.jpg
├── 590731.jpg
└── 740239-1.jpg
├── style.css
├── api
├── routes
│ └── suggestion.js
├── server.js
└── package-lock.json
├── product.json
├── versus.css
├── index.html
├── cards.css
├── carousel.css
├── carousel.js
└── scripts.js
/.gitignore:
--------------------------------------------------------------------------------
1 | */node_modules
--------------------------------------------------------------------------------
/pages/suggestion/styles.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | "# Uruguay-Vs-Argentina-Economy-Comparator"
2 |
--------------------------------------------------------------------------------
/assets/231488.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/231488.jpg
--------------------------------------------------------------------------------
/assets/234178.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/234178.jpg
--------------------------------------------------------------------------------
/assets/240510.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/240510.jpg
--------------------------------------------------------------------------------
/assets/240527.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/240527.jpg
--------------------------------------------------------------------------------
/assets/241408.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/241408.jpg
--------------------------------------------------------------------------------
/assets/241726.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/241726.jpg
--------------------------------------------------------------------------------
/assets/241895.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/241895.jpg
--------------------------------------------------------------------------------
/assets/242020.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/242020.jpg
--------------------------------------------------------------------------------
/assets/299454.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/299454.jpg
--------------------------------------------------------------------------------
/assets/299476.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/299476.jpg
--------------------------------------------------------------------------------
/assets/472692.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/472692.jpg
--------------------------------------------------------------------------------
/assets/590215.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/590215.jpg
--------------------------------------------------------------------------------
/assets/590731.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/590731.jpg
--------------------------------------------------------------------------------
/assets/740239-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/damiansire/Uruguay-Vs-Argentina-Economy-Comparator/HEAD/assets/740239-1.jpg
--------------------------------------------------------------------------------
/style.css:
--------------------------------------------------------------------------------
1 | html,
2 | body {
3 | padding: 0;
4 | margin: 0;
5 | width: 100%;
6 | height: 100%;
7 | background: #244b7b;
8 | }
--------------------------------------------------------------------------------
/api/routes/suggestion.js:
--------------------------------------------------------------------------------
1 | async function routes(fastify, options) {
2 | fastify.post('/api/v1/suggestion', async(request, reply) => {
3 | console.log(request.body)
4 | return { hello: 'world' }
5 | })
6 | }
7 |
8 | module.exports = routes
--------------------------------------------------------------------------------
/product.json:
--------------------------------------------------------------------------------
1 | {
2 | "products": [
3 | {
4 | "name": "Gaseosa Pepsi Black 1,5l",
5 | "img": "https://http2.mlstatic.com/D_NQ_NP_2X_813899-MLA46637636685_072021-F.webp",
6 | "precioAr": 79,
7 | "precioUy": 97
8 | }
9 | ]
10 | }
--------------------------------------------------------------------------------
/api/server.js:
--------------------------------------------------------------------------------
1 | // CommonJs
2 | const fastify = require('fastify')({
3 | logger: true
4 | })
5 |
6 | fastify.register(require('./routes/suggestion'))
7 |
8 | fastify.listen(3000, function(err, address) {
9 | if (err) {
10 | fastify.log.error(err)
11 | process.exit(1)
12 | }
13 | // Server is now listening on ${address}
14 | })
--------------------------------------------------------------------------------
/pages/suggestion/scripts.js:
--------------------------------------------------------------------------------
1 | const suggestionForm = document.getElementById("suggestionForm");
2 | let data;
3 |
4 | suggestionForm.addEventListener("submit", function(event) {
5 | event.preventDefault();
6 | const formData = new FormData(data.srcElement)
7 |
8 | })
9 |
10 | const apiUrl = "...";
11 |
12 | function sendFormDataToApi() {
13 |
14 | }
--------------------------------------------------------------------------------
/pages/suggestion/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/versus.css:
--------------------------------------------------------------------------------
1 | .sides {
2 | animation: 0.7s curtain cubic-bezier(0.86, 0, 0.07, 1) 0.4s both;
3 | display: grid;
4 | grid-template-columns: 50vw 50vw;
5 | }
6 |
7 | @keyframes curtain {
8 | 0% {
9 | grid-gap: 100vw;
10 | }
11 | 100% {
12 | grid-gap: 0;
13 | }
14 | }
15 |
16 | html,
17 | body {
18 | height: 100%;
19 | margin: 0;
20 | font-family: "Arial Black", sans-serif;
21 | }
22 |
23 | .intro {
24 | width: 100%;
25 | height: 100%;
26 | overflow: hidden;
27 | display: flex;
28 | justify-content: center;
29 | }
30 |
31 | .sides {
32 | position: relative;
33 | }
34 |
35 | .side {
36 | display: flex;
37 | flex-direction: column;
38 | align-items: center;
39 | font-size: 6vw;
40 | }
41 |
42 | .monkey {
43 | background-color: #dcc9a1;
44 | color: #534325;
45 | }
46 |
47 | .robot {
48 | background-color: #1b636f;
49 | color: #ffffff;
50 | flex-direction: column-reverse;
51 | }
52 |
53 | .name {
54 | margin: 0.3em;
55 | }
56 |
57 | .emoji {
58 | font-size: 3em;
59 | transition: 1s;
60 | }
61 |
62 | .emoji img {
63 | max-width: 225px;
64 | }
65 |
66 | .emoji:hover {
67 | transform: scale(1.3) rotate( -13deg);
68 | }
69 |
70 | .versus {
71 | position: absolute;
72 | width: 13vw;
73 | height: 13vw;
74 | background: #ffffff;
75 | border-radius: 50%;
76 | left: 0;
77 | right: 0;
78 | bottom: 0;
79 | top: 0;
80 | margin: auto;
81 | z-index: 3;
82 | display: flex;
83 | align-items: center;
84 | justify-content: center;
85 | font-size: 3.4vw;
86 | color: #123456;
87 | border-width: 10px;
88 | border-style: solid;
89 | border-color: #1b636f #dcc9a1 #dcc9a1 #1b636f;
90 | transition: .5s
91 | }
92 |
93 | .versus:hover {
94 | transform: scale(1.1) rotate(360deg);
95 | }
96 |
97 | .versus img {
98 | max-width: 167px;
99 | border-radius: 72px;
100 | overflow: hidden;
101 | }
102 |
103 | .versus span {
104 | transform: rotate(35deg);
105 | }
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
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 |
USD 0.40
48 |
49 |

50 |
51 |
52 |
53 |

54 |
55 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/cards.css:
--------------------------------------------------------------------------------
1 | .app-container {
2 | box-sizing: border-box;
3 | display: flex;
4 | flex-direction: column;
5 | justify-content: space-between;
6 | align-items: center;
7 | font-family: "Montserrat", sans-serif;
8 | padding: 0 50px
9 | }
10 |
11 | .app-container h1 {
12 | width: 70vw;
13 | padding: 10px;
14 | margin-left: 20px;
15 | color: #F8F8F8;
16 | }
17 |
18 | .app-container h4 {
19 | width: 70vw;
20 | padding: 0px 10px;
21 | margin-top: -20px;
22 | margin-left: 20px;
23 | color: #8acbff;
24 | }
25 |
26 | .app-container p {
27 | color: #F8F8F8;
28 | }
29 |
30 | .app-container p a {
31 | color: #fff399;
32 | text-decoration: none;
33 | }
34 |
35 | .app-container p a:hover {
36 | text-decoration: underline;
37 | }
38 |
39 | .card {
40 | border: 1px solid #102a49;
41 | box-sizing: border-box;
42 | box-shadow: 2px 2px 10px #102a49;
43 | background: #102a49;
44 | display: flex;
45 | flex-direction: row;
46 | justify-content: flex-start;
47 | align-items: center;
48 | padding-left: 10px;
49 | flex: 1 1 45%;
50 | min-width: 320px;
51 | margin: 10px;
52 | transition: 0.5s;
53 | }
54 |
55 | .card:hover {
56 | transform: translateY(-5px);
57 | transition: 0.3s;
58 | }
59 |
60 | .card-container {
61 | display: flex;
62 | }
63 |
64 | .coin-data {
65 | display: flex;
66 | flex-direction: column;
67 | margin-left: 50px;
68 | }
69 |
70 | .coin-data p:nth-child(1) {
71 | margin-bottom: 13px;
72 | font-size: 1.3em;
73 | }
74 |
75 | .coin-data p:nth-of-type(2) {
76 | margin-top: 0;
77 | margin-bottom: 0.6em;
78 | }
79 |
80 | .coin-data p:nth-of-type(3) {
81 | margin-top: 0;
82 | margin-bottom: 0.8em;
83 | }
84 |
85 | .coin-data p span.legend {
86 | font-weight: bold;
87 | }
88 |
89 | .pos {
90 | color: #7cd382 !important;
91 | }
92 |
93 | .neg {
94 | color: #e86666 !important;
95 | }
96 |
97 | .card-container img {
98 | max-width: 75px;
99 | padding-left: 20px;
100 | padding-right: 0;
101 | }
102 |
103 | footer {
104 | height: 75px;
105 | width: 100%;
106 | bottom: 0;
107 | left: 0;
108 | padding: 25px 0px;
109 | background: #141414;
110 | display: flex;
111 | flex-direction: column;
112 | justify-content: center;
113 | align-items: center;
114 | }
115 |
116 | footer ul {
117 | display: flex;
118 | flex-direction: row;
119 | margin: 0;
120 | padding: 0;
121 | }
122 |
123 | footer ul li {
124 | list-style-type: none;
125 | }
126 |
127 | footer ul a {
128 | font-size: 1.5em;
129 | }
130 |
131 | footer ul i {
132 | width: 1em;
133 | padding: 0px 10px;
134 | text-align: center;
135 | color: #555;
136 | }
137 |
138 | footer ul i:hover {
139 | color: #F8F8F8;
140 | }
141 |
142 | footer p {
143 | color: #555 !important;
144 | font-family: "Montserrat", sans-serif;
145 | }
146 |
147 | footer p span {
148 | color: #555;
149 | }
--------------------------------------------------------------------------------
/carousel.css:
--------------------------------------------------------------------------------
1 | /* Parent wrapper to carousel. Width can be changed as needed. */
2 |
3 | .carousel-wrapper {
4 | overflow: hidden;
5 | margin: auto;
6 | margin-bottom: 10px;
7 | margin-top: 3px;
8 | }
9 |
10 |
11 | /* Apply 'border-box' to 'box-sizing' so border and padding is included in the width and height. */
12 |
13 | .carousel-wrapper * {
14 | box-sizing: border-box;
15 | }
16 |
17 |
18 | /* We'll be using the 'transform' property to move the carousel's items, so setting the 'transform-style' to 'preserve-3d' will make sure our nested elements are rendered properly in the 3D space. */
19 |
20 | .carousel {
21 | text-align-last: center;
22 | -webkit-transform-style: preserve-3d;
23 | -moz-transform-style: preserve-3d;
24 | transform-style: preserve-3d;
25 | }
26 |
27 |
28 | /* By default we're hiding items (except the initial one) until the JS initiates. Elements are absolutely positioned with a width of 100% (as we're styling for mobile first), letting the content's height dictate the height of the carousel. Our magic property here for all our animation needs is 'transition', taking the properties we wish to animate 'transform' and 'opacity', along with the length of time in seconds. */
29 |
30 | .carousel__photo {
31 | opacity: 0;
32 | position: absolute;
33 | top: 0;
34 | width: 13.8%;
35 | margin: auto;
36 | z-index: 100;
37 | transition: transform 0.5s, opacity 0.5s, z-index 0.5s;
38 | cursor: pointer;
39 | }
40 |
41 |
42 | /* Display the initial item and bring it to the front using 'z-index'. These styles also apply to the 'active' item. */
43 |
44 | .carousel__photo.initial,
45 | .carousel__photo.active {
46 | opacity: 1;
47 | position: relative;
48 | z-index: 900;
49 | }
50 |
51 |
52 | /* Set 'z-index' to sit behind our '.active' item. */
53 |
54 | .carousel__photo.prev,
55 | .carousel__photo.next {
56 | z-index: 800;
57 | }
58 |
59 |
60 | /* Translate previous item to the left */
61 |
62 | .carousel__photo.prev {
63 | transform: translateX(-100%);
64 | }
65 |
66 |
67 | /* Translate next item to the right */
68 |
69 | .carousel__photo.next {
70 | transform: translateX(100%);
71 | }
72 |
73 |
74 | /* Style navigation buttons to sit in the middle, either side of the carousel. */
75 |
76 | .carousel__button--prev,
77 | .carousel__button--next {
78 | position: absolute;
79 | top: 50%;
80 | width: 3rem;
81 | height: 3rem;
82 | background-color: #fff;
83 | transform: translateY(-50%);
84 | border-radius: 50%;
85 | cursor: pointer;
86 | z-index: 1001;
87 | /* Sit on top of everything */
88 | border: 1px solid black;
89 | /* opacity: 0; Hide buttons until carousel is initialised
90 | transition:opacity 1s;*/
91 | }
92 |
93 | .carousel__button--prev {
94 | left: 0;
95 | }
96 |
97 | .carousel__button--next {
98 | right: 0;
99 | }
100 |
101 |
102 | /* Use pseudo elements to insert arrows inside of navigation buttons */
103 |
104 | .carousel__button--prev::after,
105 | .carousel__button--next::after {
106 | content: " ";
107 | position: absolute;
108 | width: 10px;
109 | height: 10px;
110 | top: 50%;
111 | left: 54%;
112 | border-right: 2px solid black;
113 | border-bottom: 2px solid black;
114 | transform: translate(-50%, -50%) rotate(135deg);
115 | }
116 |
117 | .carousel__button--next::after {
118 | left: 47%;
119 | transform: translate(-50%, -50%) rotate(-45deg);
120 | }
--------------------------------------------------------------------------------
/carousel.js:
--------------------------------------------------------------------------------
1 | !(function(d) {
2 | // Variables to target our base class, get carousel items, count how many carousel items there are, set the slideFirst to 0 (which is the number that tells us the frame we're on), and set motion to true which disables interactivity.
3 | const itemClassName = "carousel__photo";
4 | const carouselPhotoWidth = document.getElementsByClassName("carousel__photo")[0].width;
5 | const carouselWidth = document.getElementsByClassName("carousel")[0].offsetWidth;
6 | const carouselCapacity = 7
7 | items = d.getElementsByClassName(itemClassName),
8 | totalItems = items.length,
9 | slideFirst = 0,
10 | moving = true;
11 |
12 | // To initialise the carousel we'll want to update the DOM with our own classes
13 | function setInitialClasses() {
14 | // Target the last, initial, and next items and give them the relevant class.
15 | // This assumes there are three or more items.
16 | for (let index = 0; index < 7; index++) {
17 | items[index].classList.add("active");
18 | }
19 | }
20 |
21 | // Set click events to navigation buttons
22 |
23 | function setEventListeners() {
24 | var next = d.getElementsByClassName('carousel__button--next')[0],
25 | prev = d.getElementsByClassName('carousel__button--prev')[0];
26 |
27 | next.addEventListener('click', moveNext);
28 | prev.addEventListener('click', movePrev);
29 | }
30 |
31 | // Disable interaction by setting 'moving' to true for the same duration as our transition (0.5s = 500ms)
32 | function disableInteraction() {
33 | moving = true;
34 |
35 | setTimeout(function() {
36 | moving = false
37 | }, 500);
38 | }
39 |
40 |
41 | // Next navigation handler
42 | function moveNext() {
43 | // Check if moving
44 | if (!moving) {
45 | slideFirst++;
46 | slideFirst = slideFirst % totalItems;
47 | // temporarily disable interactivity
48 | disableInteraction();
49 | //Obtengo el index de la anterior a slideFirst
50 | const slidePrev = slideFirst !== 0 ? slideFirst - 1 : totalItems - 1;
51 | //Removeme el elemento del carrusel
52 | items[slidePrev].classList.remove("active");
53 | //Hallo el index del nuevo item a agregar
54 | const lastItemIndex = (slideFirst + carouselCapacity - 1) % totalItems;
55 | //Lo hago visible
56 | items[lastItemIndex].classList.add("active");
57 | }
58 | }
59 |
60 | // Previous navigation handler
61 | function movePrev() {
62 | // Check if moving
63 | if (!moving) {
64 |
65 | let slidePrev;
66 | if (slideFirst === 0) {
67 | slideFirst = totalItems - 1;
68 | slidePrev = 6;
69 | } else {
70 | slideFirst--;
71 | slidePrev = (slideFirst + carouselCapacity) % 14;
72 | }
73 |
74 | // temporarily disable interactivity
75 | disableInteraction();
76 |
77 | items[slidePrev].classList.remove("active");
78 | items[slideFirst].classList.add("active");
79 | }
80 | }
81 |
82 | // Initialise carousel
83 | function initCarousel() {
84 | setInitialClasses();
85 | setEventListeners();
86 |
87 | // Set moving to false now that the carousel is ready
88 | moving = false;
89 | }
90 |
91 | // make it rain
92 | initCarousel();
93 |
94 | }(document));
--------------------------------------------------------------------------------
/pages/suggestion/form.css:
--------------------------------------------------------------------------------
1 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,400,300,600);
2 | * {
3 | margin: 0;
4 | padding: 0;
5 | box-sizing: border-box;
6 | -webkit-box-sizing: border-box;
7 | -moz-box-sizing: border-box;
8 | -webkit-font-smoothing: antialiased;
9 | -moz-font-smoothing: antialiased;
10 | -o-font-smoothing: antialiased;
11 | font-smoothing: antialiased;
12 | text-rendering: optimizeLegibility;
13 | }
14 |
15 | body {
16 | font-family: "Open Sans", Helvetica, Arial, sans-serif;
17 | font-weight: 300;
18 | font-size: 12px;
19 | line-height: 30px;
20 | color: #777;
21 | background: #0cf;
22 | }
23 |
24 | .container {
25 | max-width: 400px;
26 | width: 100%;
27 | margin: 0 auto;
28 | position: relative;
29 | }
30 |
31 | #suggestionForm input[type="text"],
32 | #suggestionForm input[type="email"],
33 | #suggestionForm input[type="tel"],
34 | #suggestionForm input[type="url"],
35 | #suggestionForm textarea,
36 | #suggestionForm button[type="submit"] {
37 | font: 400 12px/16px "Open Sans", Helvetica, Arial, sans-serif;
38 | }
39 |
40 | #suggestionForm {
41 | background: #f9f9f9;
42 | padding: 25px;
43 | margin: 50px 0;
44 | }
45 |
46 | #suggestionForm h3 {
47 | color: #f96;
48 | display: block;
49 | font-size: 30px;
50 | font-weight: 400;
51 | }
52 |
53 | #suggestionForm h4 {
54 | margin: 5px 0 15px;
55 | display: block;
56 | font-size: 13px;
57 | }
58 |
59 | fieldset {
60 | border: medium none !important;
61 | margin: 0 0 10px;
62 | min-width: 100%;
63 | padding: 0;
64 | width: 100%;
65 | }
66 |
67 | #suggestionForm input[type="text"],
68 | #suggestionForm input[type="email"],
69 | #suggestionForm input[type="tel"],
70 | #suggestionForm input[type="url"],
71 | #suggestionForm textarea {
72 | width: 100%;
73 | border: 1px solid #ccc;
74 | background: #fff;
75 | margin: 0 0 5px;
76 | padding: 10px;
77 | }
78 |
79 | #suggestionForm input[type="text"]:hover,
80 | #suggestionForm input[type="email"]:hover,
81 | #suggestionForm input[type="tel"]:hover,
82 | #suggestionForm input[type="url"]:hover,
83 | #suggestionForm textarea:hover {
84 | -webkit-transition: border-color 0.3s ease-in-out;
85 | -moz-transition: border-color 0.3s ease-in-out;
86 | transition: border-color 0.3s ease-in-out;
87 | border: 1px solid #aaa;
88 | }
89 |
90 | #suggestionForm textarea {
91 | height: 100px;
92 | max-width: 100%;
93 | resize: none;
94 | }
95 |
96 | #suggestionForm button[type="submit"] {
97 | cursor: pointer;
98 | width: 100%;
99 | border: none;
100 | background: #0cf;
101 | color: #fff;
102 | margin: 0 0 5px;
103 | padding: 10px;
104 | font-size: 15px;
105 | }
106 |
107 | #suggestionForm button[type="submit"]:hover {
108 | background: #09c;
109 | -webkit-transition: background 0.3s ease-in-out;
110 | -moz-transition: background 0.3s ease-in-out;
111 | transition: background-color 0.3s ease-in-out;
112 | }
113 |
114 | #suggestionForm button[type="submit"]:active {
115 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5);
116 | }
117 |
118 | #suggestionForm input:focus,
119 | #suggestionForm textarea:focus {
120 | outline: 0;
121 | border: 1px solid #999;
122 | }
123 |
124 | ::-webkit-input-placeholder {
125 | color: #888;
126 | }
127 |
128 | :-moz-placeholder {
129 | color: #888;
130 | }
131 |
132 | ::-moz-placeholder {
133 | color: #888;
134 | }
135 |
136 | :-ms-input-placeholder {
137 | color: #888;
138 | }
--------------------------------------------------------------------------------
/scripts.js:
--------------------------------------------------------------------------------
1 | //Modulo dolar UY
2 | const dolarUruguayApi = "https://cotizaciones-brou.herokuapp.com/api/currency/latest"
3 |
4 | let dolarUy;
5 |
6 | let dolarBlueAr;
7 |
8 | let dolarTuristaAr;
9 |
10 | let dolarOficialAr;
11 |
12 | const cardContainer = document.getElementsByClassName("card-container")[0];
13 |
14 | class DolarUy {
15 | constructor(responseData) {
16 | this.sell = responseData.rates["USD"].sell;
17 | this.buy = responseData.rates["USD"].buy;
18 | this.screenText = "Dolar Uruguay";
19 | this.img = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Uruguay.svg/1200px-Flag_of_Uruguay.svg.png";
20 | }
21 | }
22 |
23 | async function getDolarUyData() {
24 | const response = await fetch(dolarUruguayApi);
25 | const responseData = await response.json();
26 | dolarUy = new DolarUy(responseData);
27 | renderDolar(dolarUy);
28 | }
29 |
30 | getDolarUyData();
31 |
32 | //Modulo dolar AR
33 |
34 | const dolarArgentinaApi = "https://www.dolarsi.com/api/api.php?type=valoresprincipales";
35 |
36 | //Convertir esto en interfaces de typescript
37 | class DolarBlueAr {
38 | constructor(dolarData) {
39 | this.sell = dolarData.venta;
40 | this.buy = dolarData.compra;
41 | this.screenText = "Dolar Blue AR"
42 | this.img = "https://www.andbank.es/observatoriodelinversor/wp-content/uploads/2014/01/DOLAR_blue.jpg";
43 | }
44 | }
45 |
46 | class DolarTuristaAr {
47 | constructor(dolarData) {
48 | this.sell = dolarData.venta;
49 | this.buy = dolarData.compra;
50 | this.screenText = "Dolar Turista AR"
51 | this.img = "https://www.cronista.com/files/image/127/127578/5ff77245dc84c.jpg";
52 | }
53 | }
54 |
55 | class DolarOficialAr {
56 | constructor(dolarData) {
57 | this.sell = dolarData.venta;
58 | this.buy = dolarData.compra;
59 | this.screenText = "Dolar Oficial AR"
60 | this.img = "https://resizer.iproimg.com/unsafe/880x/filters:format(webp)/https://assets.iprofesional.com/assets/jpg/2020/08/501745.jpg?7.2.4";
61 | }
62 | }
63 |
64 | async function getDolarArData() {
65 | const response = await fetch(dolarArgentinaApi);
66 | const responseData = await response.json();
67 | const dolarData = responseData.map(x => x.casa)
68 | const filtredDolarData = dolarData.filter(dolar => ['Dolar Blue', 'Dolar turista', 'Dolar Oficial'].includes(dolar.nombre))
69 | console.log(filtredDolarData);
70 | saveDolarArData(filtredDolarData);
71 | renderDolar(dolarBlueAr);
72 | renderDolar(dolarTuristaAr);
73 | renderDolar(dolarOficialAr);
74 | }
75 |
76 | function saveDolarArData(filtredDolarData) {
77 | let dolarOficial = filtredDolarData.find(dolar => dolar.nombre == "Dolar Oficial");
78 | let dolarTurista = filtredDolarData.find(dolar => dolar.nombre == "Dolar turista");
79 | console.log(dolarTurista)
80 | let dolarBlue = filtredDolarData.find(dolar => dolar.nombre == "Dolar Blue");
81 | dolarBlueAr = new DolarBlueAr(dolarBlue);
82 | dolarTuristaAr = new DolarTuristaAr(dolarTurista);
83 | dolarOficialAr = new DolarOficialAr(dolarOficial);
84 | }
85 |
86 | getDolarArData();
87 |
88 | //Renderizado
89 |
90 | function getDolarHtml(dolar) {
91 | return `
93 |
94 |
${dolar.screenText}
95 |
Compra: $${dolar.buy}
96 |
Venta: $${dolar.sell}
97 |
98 |
99 | `
100 | }
101 |
102 | function renderDolar(dolar) {
103 | const dolarHtml = getDolarHtml(dolar)
104 | cardContainer.insertAdjacentHTML("beforeend", dolarHtml);
105 | }
--------------------------------------------------------------------------------
/api/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "requires": true,
3 | "lockfileVersion": 1,
4 | "dependencies": {
5 | "@fastify/ajv-compiler": {
6 | "version": "1.1.0",
7 | "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz",
8 | "integrity": "sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg==",
9 | "requires": {
10 | "ajv": "^6.12.6"
11 | }
12 | },
13 | "abstract-logging": {
14 | "version": "2.0.1",
15 | "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz",
16 | "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA=="
17 | },
18 | "ajv": {
19 | "version": "6.12.6",
20 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
21 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
22 | "requires": {
23 | "fast-deep-equal": "^3.1.1",
24 | "fast-json-stable-stringify": "^2.0.0",
25 | "json-schema-traverse": "^0.4.1",
26 | "uri-js": "^4.2.2"
27 | }
28 | },
29 | "archy": {
30 | "version": "1.0.0",
31 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
32 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
33 | },
34 | "atomic-sleep": {
35 | "version": "1.0.0",
36 | "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
37 | "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="
38 | },
39 | "avvio": {
40 | "version": "7.2.2",
41 | "resolved": "https://registry.npmjs.org/avvio/-/avvio-7.2.2.tgz",
42 | "integrity": "sha512-XW2CMCmZaCmCCsIaJaLKxAzPwF37fXi1KGxNOvedOpeisLdmxZnblGc3hpHWYnlP+KOUxZsazh43WXNHgXpbqw==",
43 | "requires": {
44 | "archy": "^1.0.0",
45 | "debug": "^4.0.0",
46 | "fastq": "^1.6.1",
47 | "queue-microtask": "^1.1.2"
48 | }
49 | },
50 | "cookie": {
51 | "version": "0.4.1",
52 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
53 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
54 | },
55 | "debug": {
56 | "version": "4.3.2",
57 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
58 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
59 | "requires": {
60 | "ms": "2.1.2"
61 | }
62 | },
63 | "deepmerge": {
64 | "version": "4.2.2",
65 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
66 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
67 | },
68 | "fast-decode-uri-component": {
69 | "version": "1.0.1",
70 | "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz",
71 | "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="
72 | },
73 | "fast-deep-equal": {
74 | "version": "3.1.3",
75 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
76 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
77 | },
78 | "fast-json-stable-stringify": {
79 | "version": "2.1.0",
80 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
81 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
82 | },
83 | "fast-json-stringify": {
84 | "version": "2.7.11",
85 | "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.11.tgz",
86 | "integrity": "sha512-J6rw31EvrT/PTZ4xi5Sf/NjYt5jF8tAPVzIi82qmfD4niAwBbHvUB99H6ipHWEaNQKXXpoyG7THBVsbVPo9prw==",
87 | "requires": {
88 | "ajv": "^6.11.0",
89 | "deepmerge": "^4.2.2",
90 | "rfdc": "^1.2.0",
91 | "string-similarity": "^4.0.1"
92 | }
93 | },
94 | "fast-redact": {
95 | "version": "3.0.2",
96 | "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz",
97 | "integrity": "sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg=="
98 | },
99 | "fast-safe-stringify": {
100 | "version": "2.1.1",
101 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
102 | "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
103 | },
104 | "fastify": {
105 | "version": "3.22.1",
106 | "resolved": "https://registry.npmjs.org/fastify/-/fastify-3.22.1.tgz",
107 | "integrity": "sha512-TeA4+TzI7VuJrjTNqoxtSXwPEYfCwpT8j9Z3j9WrL8nrt+1bE9G0rP9hLJyvbg4it56p68YsHVhKOee69xyfmA==",
108 | "requires": {
109 | "@fastify/ajv-compiler": "^1.0.0",
110 | "abstract-logging": "^2.0.0",
111 | "avvio": "^7.1.2",
112 | "fast-json-stringify": "^2.5.2",
113 | "fastify-error": "^0.3.0",
114 | "fastify-warning": "^0.2.0",
115 | "find-my-way": "^4.1.0",
116 | "flatstr": "^1.0.12",
117 | "light-my-request": "^4.2.0",
118 | "pino": "^6.13.0",
119 | "proxy-addr": "^2.0.7",
120 | "rfdc": "^1.1.4",
121 | "secure-json-parse": "^2.0.0",
122 | "semver": "^7.3.2",
123 | "tiny-lru": "^7.0.0"
124 | }
125 | },
126 | "fastify-error": {
127 | "version": "0.3.1",
128 | "resolved": "https://registry.npmjs.org/fastify-error/-/fastify-error-0.3.1.tgz",
129 | "integrity": "sha512-oCfpcsDndgnDVgiI7bwFKAun2dO+4h84vBlkWsWnz/OUK9Reff5UFoFl241xTiLeHWX/vU9zkDVXqYUxjOwHcQ=="
130 | },
131 | "fastify-warning": {
132 | "version": "0.2.0",
133 | "resolved": "https://registry.npmjs.org/fastify-warning/-/fastify-warning-0.2.0.tgz",
134 | "integrity": "sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw=="
135 | },
136 | "fastq": {
137 | "version": "1.13.0",
138 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
139 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
140 | "requires": {
141 | "reusify": "^1.0.4"
142 | }
143 | },
144 | "find-my-way": {
145 | "version": "4.3.3",
146 | "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.3.3.tgz",
147 | "integrity": "sha512-5E4bRdaATB1MewjOCBjx4xvD205a4t2ripCnXB+YFhYEJ0NABtrcC7XLXLq0TPoFe/WYGUFqys3Qk3HCOGeNcw==",
148 | "requires": {
149 | "fast-decode-uri-component": "^1.0.1",
150 | "fast-deep-equal": "^3.1.3",
151 | "safe-regex2": "^2.0.0",
152 | "semver-store": "^0.3.0"
153 | }
154 | },
155 | "flatstr": {
156 | "version": "1.0.12",
157 | "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz",
158 | "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw=="
159 | },
160 | "forwarded": {
161 | "version": "0.2.0",
162 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
163 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
164 | },
165 | "ipaddr.js": {
166 | "version": "1.9.1",
167 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
168 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
169 | },
170 | "json-schema-traverse": {
171 | "version": "0.4.1",
172 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
173 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
174 | },
175 | "light-my-request": {
176 | "version": "4.6.0",
177 | "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-4.6.0.tgz",
178 | "integrity": "sha512-wQWGwMr7l7fzYPzzzutRoEI1vuREpIpJpTi3t8cHlGdsnBrOF5iR559Bkh+nkDGgnUJtNuuutjnqbxP7zPWKkA==",
179 | "requires": {
180 | "ajv": "^8.1.0",
181 | "cookie": "^0.4.0",
182 | "fastify-warning": "^0.2.0",
183 | "set-cookie-parser": "^2.4.1"
184 | },
185 | "dependencies": {
186 | "ajv": {
187 | "version": "8.6.3",
188 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz",
189 | "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==",
190 | "requires": {
191 | "fast-deep-equal": "^3.1.1",
192 | "json-schema-traverse": "^1.0.0",
193 | "require-from-string": "^2.0.2",
194 | "uri-js": "^4.2.2"
195 | }
196 | },
197 | "json-schema-traverse": {
198 | "version": "1.0.0",
199 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
200 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
201 | }
202 | }
203 | },
204 | "lru-cache": {
205 | "version": "6.0.0",
206 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
207 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
208 | "requires": {
209 | "yallist": "^4.0.0"
210 | }
211 | },
212 | "ms": {
213 | "version": "2.1.2",
214 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
215 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
216 | },
217 | "pino": {
218 | "version": "6.13.3",
219 | "resolved": "https://registry.npmjs.org/pino/-/pino-6.13.3.tgz",
220 | "integrity": "sha512-tJy6qVgkh9MwNgqX1/oYi3ehfl2Y9H0uHyEEMsBe74KinESIjdMrMQDWpcZPpPicg3VV35d/GLQZmo4QgU2Xkg==",
221 | "requires": {
222 | "fast-redact": "^3.0.0",
223 | "fast-safe-stringify": "^2.0.8",
224 | "fastify-warning": "^0.2.0",
225 | "flatstr": "^1.0.12",
226 | "pino-std-serializers": "^3.1.0",
227 | "quick-format-unescaped": "^4.0.3",
228 | "sonic-boom": "^1.0.2"
229 | }
230 | },
231 | "pino-std-serializers": {
232 | "version": "3.2.0",
233 | "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz",
234 | "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg=="
235 | },
236 | "proxy-addr": {
237 | "version": "2.0.7",
238 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
239 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
240 | "requires": {
241 | "forwarded": "0.2.0",
242 | "ipaddr.js": "1.9.1"
243 | }
244 | },
245 | "punycode": {
246 | "version": "2.1.1",
247 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
248 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
249 | },
250 | "queue-microtask": {
251 | "version": "1.2.3",
252 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
253 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
254 | },
255 | "quick-format-unescaped": {
256 | "version": "4.0.4",
257 | "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
258 | "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="
259 | },
260 | "require-from-string": {
261 | "version": "2.0.2",
262 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
263 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
264 | },
265 | "ret": {
266 | "version": "0.2.2",
267 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz",
268 | "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ=="
269 | },
270 | "reusify": {
271 | "version": "1.0.4",
272 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
273 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
274 | },
275 | "rfdc": {
276 | "version": "1.3.0",
277 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
278 | "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
279 | },
280 | "safe-regex2": {
281 | "version": "2.0.0",
282 | "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz",
283 | "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==",
284 | "requires": {
285 | "ret": "~0.2.0"
286 | }
287 | },
288 | "secure-json-parse": {
289 | "version": "2.4.0",
290 | "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz",
291 | "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg=="
292 | },
293 | "semver": {
294 | "version": "7.3.5",
295 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
296 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
297 | "requires": {
298 | "lru-cache": "^6.0.0"
299 | }
300 | },
301 | "semver-store": {
302 | "version": "0.3.0",
303 | "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz",
304 | "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg=="
305 | },
306 | "set-cookie-parser": {
307 | "version": "2.4.8",
308 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz",
309 | "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg=="
310 | },
311 | "sonic-boom": {
312 | "version": "1.4.1",
313 | "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz",
314 | "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==",
315 | "requires": {
316 | "atomic-sleep": "^1.0.0",
317 | "flatstr": "^1.0.12"
318 | }
319 | },
320 | "string-similarity": {
321 | "version": "4.0.4",
322 | "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz",
323 | "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ=="
324 | },
325 | "tiny-lru": {
326 | "version": "7.0.6",
327 | "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-7.0.6.tgz",
328 | "integrity": "sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow=="
329 | },
330 | "uri-js": {
331 | "version": "4.4.1",
332 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
333 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
334 | "requires": {
335 | "punycode": "^2.1.0"
336 | }
337 | },
338 | "yallist": {
339 | "version": "4.0.0",
340 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
341 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
342 | }
343 | }
344 | }
345 |
--------------------------------------------------------------------------------