├── .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 |
16 |
17 |
18 |

Envia tu sugerencia

19 |

Esta pagina se mantiene gracias a sugerencias como la tuya!

20 |
21 | 22 |
23 |
24 | 25 |
26 |
27 | 28 |
29 |
30 | 31 |
32 |
33 | 34 |
35 |
36 | 37 | 38 |
39 |
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 | 44 |
45 |
46 |
47 |

USD 0.40

48 |
49 | 50 |
51 |
52 |
53 | 54 |
55 |
56 |

USD 1.75

57 |
58 |
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 | --------------------------------------------------------------------------------