├── .gitignore ├── LICENSE.md ├── README.md ├── index.js ├── insomnia.json ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2019 - Rocketseat 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | GoStack 3 |

4 | 5 |

6 | Desafio 1: Conceitos do NodeJS 7 |

8 | 9 |

“Sua única limitação é você mesmo”! 10 | 11 |

12 | GitHub language count 13 | 14 | 15 | Made by Rocketseat 16 | 17 | 18 | License 19 | 20 | 21 | Stargazers 22 | 23 |

24 | 25 |

26 | Sobre o desafio   |    27 | Entrega   |    28 | Licença 29 |

30 | 31 | ## :rocket: Sobre o desafio 32 | 33 | Crie uma aplicação para armazenar projetos e suas tarefas do zero utilizando [Express](https://expressjs.com/pt-br/). 34 | 35 | ### Rotas 36 | 37 | - `POST /projects`: A rota deve receber `id` e `title` dentro do corpo e cadastrar um novo projeto dentro de um array no seguinte formato: `{ id: "1", title: 'Novo projeto', tasks: [] }`; Certifique-se de enviar tanto o ID quanto o título do projeto no formato string com aspas duplas. 38 | 39 | - `GET /projects`: Rota que lista todos projetos e suas tarefas; 40 | 41 | - `PUT /projects/:id`: A rota deve alterar apenas o título do projeto com o `id` presente nos parâmetros da rota; 42 | 43 | - `DELETE /projects/:id`: A rota deve deletar o projeto com o `id` presente nos parâmetros da rota; 44 | 45 | - `POST /projects/:id/tasks`: A rota deve receber um campo `title` e armazenar uma nova tarefa no array de tarefas de um projeto específico escolhido através do `id` presente nos parâmetros da rota; 46 | 47 | ### Exemplo 48 | 49 | Se eu chamar a rota `POST /projects` repassando `{ id: 1, title: 'Novo projeto' }` e a rota `POST /projects/1/tasks` com `{ title: 'Nova tarefa' }`, meu array de projetos deve ficar assim: 50 | 51 | ```js 52 | [ 53 | { 54 | id: "1", 55 | title: "Novo projeto", 56 | tasks: ["Nova tarefa"] 57 | } 58 | ]; 59 | ``` 60 | 61 | ### Middlewares 62 | 63 | - Crie um middleware que será utilizado em todas rotas que recebem o ID do projeto nos parâmetros da URL que verifica se o projeto com aquele ID existe. Se não existir retorne um erro, caso contrário permita a requisição continuar normalmente; 64 | 65 | - Crie um middleware global chamado em todas requisições que imprime (`console.log`) uma contagem de quantas requisições foram feitas na aplicação até então; 66 | 67 | ## 📅 Entrega 68 | 69 | Esse desafio **não precisa ser entregue** e não receberá correção, mas você pode ver o resultado do [código do desafio aqui](https://github.com/Rocketseat/bootcamp-gostack-desafio-01/blob/master/index.js). Após concluir o desafio, adicionar esse código ao seu Github é uma boa forma de demonstrar seus conhecimentos para oportunidades futuras. 70 | 71 | ## :memo: Licença 72 | 73 | Esse projeto está sob a licença MIT. Veja o arquivo [LICENSE](LICENSE.md) para mais detalhes. 74 | 75 | --- 76 | 77 | Feito com ♥ by Rocketseat :wave: [Entre na nossa comunidade!](https://discordapp.com/invite/gCRAFhc) 78 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | 3 | const server = express(); 4 | 5 | server.use(express.json()); 6 | 7 | /** 8 | * A variável `projects` pode ser `const` porque um `array` 9 | * pode receber adições ou exclusões mesmo sendo uma constante. 10 | */ 11 | const projects = []; 12 | 13 | /** 14 | * Middleware que checa se o projeto existe 15 | */ 16 | function checkProjectExists(req, res, next) { 17 | const { id } = req.params; 18 | const project = projects.find(p => p.id == id); 19 | 20 | if (!project) { 21 | return res.status(400).json({ error: 'Project not found' }); 22 | } 23 | 24 | return next(); 25 | } 26 | 27 | /** 28 | * Middleware que dá log no número de requisições 29 | */ 30 | function logRequests(req, res, next) { 31 | 32 | console.count("Número de requisições"); 33 | 34 | return next(); 35 | } 36 | 37 | server.use(logRequests); 38 | 39 | /** 40 | * Retorna todos os projetos 41 | */ 42 | server.get('/projects', (req, res) => { 43 | return res.json(projects); 44 | }); 45 | 46 | /** 47 | * Request body: id, title 48 | * Cadastra um novo projeto 49 | */ 50 | server.post('/projects', (req, res) => { 51 | const { id, title } = req.body; 52 | 53 | const project = { 54 | id, 55 | title, 56 | tasks: [] 57 | }; 58 | 59 | projects.push(project); 60 | 61 | return res.json(project); 62 | }); 63 | 64 | /** 65 | * Route params: id 66 | * Request body: title 67 | * Altera o título do projeto com o id presente nos parâmetros da rota. 68 | */ 69 | server.put('/projects/:id', checkProjectExists, (req, res) => { 70 | const { id } = req.params; 71 | const { title } = req.body; 72 | 73 | const project = projects.find(p => p.id == id); 74 | 75 | project.title = title; 76 | 77 | return res.json(project); 78 | }); 79 | 80 | /** 81 | * Route params: id 82 | * Deleta o projeto associado ao id presente nos parâmetros da rota. 83 | */ 84 | server.delete('/projects/:id', checkProjectExists, (req, res) => { 85 | const { id } = req.params; 86 | 87 | const projectIndex = projects.findIndex(p => p.id == id); 88 | 89 | projects.splice(projectIndex, 1); 90 | 91 | return res.send(); 92 | }); 93 | 94 | /** 95 | * Route params: id; 96 | * Adiciona uma nova tarefa no projeto escolhido via id; 97 | */ 98 | server.post('/projects/:id/tasks', checkProjectExists, (req, res) => { 99 | const { id } = req.params; 100 | const { title } = req.body; 101 | 102 | const project = projects.find(p => p.id == id); 103 | 104 | project.tasks.push(title); 105 | 106 | return res.json(project); 107 | }); 108 | 109 | server.listen(4000); 110 | -------------------------------------------------------------------------------- /insomnia.json: -------------------------------------------------------------------------------- 1 | {"_type":"export","__export_format":4,"__export_date":"2019-06-19T16:29:03.230Z","__export_source":"insomnia.desktop.app:v6.5.4","resources":[{"_id":"req_90a5cfa970d84355ba3f3fa744169c09","authentication":{},"body":{"mimeType":"application/json","text":"{\n\t\"title\": \"Nova tarefa 3\"\n}"},"created":1560961603688,"description":"","headers":[{"id":"pair_130cd6366549447fafb61b8d47c94a8d","name":"Content-Type","value":"application/json"}],"isPrivate":false,"metaSortKey":-1560961603688,"method":"POST","modified":1560961710710,"name":"Create","parameters":[],"parentId":"fld_9b53182f8fce46a488098de50c4abb6f","settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingSendCookies":true,"settingStoreCookies":true,"url":"http://localhost:3000/projects/1/tasks","_type":"request"},{"_id":"fld_9b53182f8fce46a488098de50c4abb6f","created":1560961598060,"description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1560961598060,"modified":1560961598060,"name":"Tasks","parentId":"wrk_8f8a2a9209e848ddbd11c6aad3081ebc","_type":"request_group"},{"_id":"wrk_8f8a2a9209e848ddbd11c6aad3081ebc","created":1560957940867,"description":"","modified":1560957940867,"name":"Bootcamp Desafio #01","parentId":null,"_type":"workspace"},{"_id":"req_b52a606f707d4d5491bb79912c7de62d","authentication":{},"body":{},"created":1560957956157,"description":"","headers":[],"isPrivate":false,"metaSortKey":-1560961386309,"method":"GET","modified":1560961435102,"name":"List","parameters":[],"parentId":"fld_3f35a2de26d34c43b43d0aa9bcbd0b62","settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingSendCookies":true,"settingStoreCookies":true,"url":"http://localhost:3000/projects","_type":"request"},{"_id":"fld_3f35a2de26d34c43b43d0aa9bcbd0b62","created":1560957944119,"description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1560957944119,"modified":1560957944119,"name":"Projects","parentId":"wrk_8f8a2a9209e848ddbd11c6aad3081ebc","_type":"request_group"},{"_id":"req_2c9e2fd4cfb34d5b9d79158e03549f59","authentication":{},"body":{"mimeType":"application/json","text":"{\n\t\"id\": \"1\",\n\t\"title\": \"Novo projeto\"\n}"},"created":1560961386259,"description":"","headers":[{"id":"pair_fb538acf70db425bbf86830d52a24b4d","name":"Content-Type","value":"application/json"}],"isPrivate":false,"metaSortKey":-1560961386259,"method":"POST","modified":1560961414118,"name":"Create","parameters":[],"parentId":"fld_3f35a2de26d34c43b43d0aa9bcbd0b62","settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingSendCookies":true,"settingStoreCookies":true,"url":"http://localhost:3000/projects","_type":"request"},{"_id":"req_fbc9fe1a6de245d6a6967f23fcf8e7bc","authentication":{},"body":{"mimeType":"application/json","text":"{\n\t\"title\": \"Novo projeto 2\"\n}"},"created":1560961431591,"description":"","headers":[{"id":"pair_fb538acf70db425bbf86830d52a24b4d","name":"Content-Type","value":"application/json"}],"isPrivate":false,"metaSortKey":-1560959671208.5,"method":"PUT","modified":1560961444194,"name":"Update","parameters":[],"parentId":"fld_3f35a2de26d34c43b43d0aa9bcbd0b62","settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingSendCookies":true,"settingStoreCookies":true,"url":"http://localhost:3000/projects/1","_type":"request"},{"_id":"req_9300477160a34c7997492c350aa04736","authentication":{},"body":{},"created":1560961526353,"description":"","headers":[],"isPrivate":false,"metaSortKey":-1560574253735.75,"method":"DELETE","modified":1560961534635,"name":"Delete","parameters":[],"parentId":"fld_3f35a2de26d34c43b43d0aa9bcbd0b62","settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingSendCookies":true,"settingStoreCookies":true,"url":"http://localhost:3000/projects/1","_type":"request"},{"_id":"env_0a7e6e1c1764259594dea275fe6d1c6b2c9b6248","color":null,"created":1560957941005,"data":{},"dataPropertyOrder":null,"isPrivate":false,"metaSortKey":1560957941005,"modified":1560957941005,"name":"Base Environment","parentId":"wrk_8f8a2a9209e848ddbd11c6aad3081ebc","_type":"environment"},{"_id":"jar_0a7e6e1c1764259594dea275fe6d1c6b2c9b6248","cookies":[],"created":1560957941007,"modified":1560957941007,"name":"Default Jar","parentId":"wrk_8f8a2a9209e848ddbd11c6aad3081ebc","_type":"cookie_jar"}]} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mod01", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "express": "^4.17.1" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.7: 6 | version "1.3.7" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 8 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 9 | dependencies: 10 | mime-types "~2.1.24" 11 | negotiator "0.6.2" 12 | 13 | array-flatten@1.1.1: 14 | version "1.1.1" 15 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 16 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 17 | 18 | body-parser@1.19.0: 19 | version "1.19.0" 20 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 21 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 22 | dependencies: 23 | bytes "3.1.0" 24 | content-type "~1.0.4" 25 | debug "2.6.9" 26 | depd "~1.1.2" 27 | http-errors "1.7.2" 28 | iconv-lite "0.4.24" 29 | on-finished "~2.3.0" 30 | qs "6.7.0" 31 | raw-body "2.4.0" 32 | type-is "~1.6.17" 33 | 34 | bytes@3.1.0: 35 | version "3.1.0" 36 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 37 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 38 | 39 | content-disposition@0.5.3: 40 | version "0.5.3" 41 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 42 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 43 | dependencies: 44 | safe-buffer "5.1.2" 45 | 46 | content-type@~1.0.4: 47 | version "1.0.4" 48 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 49 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 50 | 51 | cookie-signature@1.0.6: 52 | version "1.0.6" 53 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 54 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 55 | 56 | cookie@0.4.0: 57 | version "0.4.0" 58 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 59 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 60 | 61 | debug@2.6.9: 62 | version "2.6.9" 63 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 64 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 65 | dependencies: 66 | ms "2.0.0" 67 | 68 | depd@~1.1.2: 69 | version "1.1.2" 70 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 71 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 72 | 73 | destroy@~1.0.4: 74 | version "1.0.4" 75 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 76 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 77 | 78 | ee-first@1.1.1: 79 | version "1.1.1" 80 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 81 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 82 | 83 | encodeurl@~1.0.2: 84 | version "1.0.2" 85 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 86 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 87 | 88 | escape-html@~1.0.3: 89 | version "1.0.3" 90 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 91 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 92 | 93 | etag@~1.8.1: 94 | version "1.8.1" 95 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 96 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 97 | 98 | express@^4.17.1: 99 | version "4.17.1" 100 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 101 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 102 | dependencies: 103 | accepts "~1.3.7" 104 | array-flatten "1.1.1" 105 | body-parser "1.19.0" 106 | content-disposition "0.5.3" 107 | content-type "~1.0.4" 108 | cookie "0.4.0" 109 | cookie-signature "1.0.6" 110 | debug "2.6.9" 111 | depd "~1.1.2" 112 | encodeurl "~1.0.2" 113 | escape-html "~1.0.3" 114 | etag "~1.8.1" 115 | finalhandler "~1.1.2" 116 | fresh "0.5.2" 117 | merge-descriptors "1.0.1" 118 | methods "~1.1.2" 119 | on-finished "~2.3.0" 120 | parseurl "~1.3.3" 121 | path-to-regexp "0.1.7" 122 | proxy-addr "~2.0.5" 123 | qs "6.7.0" 124 | range-parser "~1.2.1" 125 | safe-buffer "5.1.2" 126 | send "0.17.1" 127 | serve-static "1.14.1" 128 | setprototypeof "1.1.1" 129 | statuses "~1.5.0" 130 | type-is "~1.6.18" 131 | utils-merge "1.0.1" 132 | vary "~1.1.2" 133 | 134 | finalhandler@~1.1.2: 135 | version "1.1.2" 136 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 137 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 138 | dependencies: 139 | debug "2.6.9" 140 | encodeurl "~1.0.2" 141 | escape-html "~1.0.3" 142 | on-finished "~2.3.0" 143 | parseurl "~1.3.3" 144 | statuses "~1.5.0" 145 | unpipe "~1.0.0" 146 | 147 | forwarded@~0.1.2: 148 | version "0.1.2" 149 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 150 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 151 | 152 | fresh@0.5.2: 153 | version "0.5.2" 154 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 155 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 156 | 157 | http-errors@1.7.2, http-errors@~1.7.2: 158 | version "1.7.2" 159 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 160 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 161 | dependencies: 162 | depd "~1.1.2" 163 | inherits "2.0.3" 164 | setprototypeof "1.1.1" 165 | statuses ">= 1.5.0 < 2" 166 | toidentifier "1.0.0" 167 | 168 | iconv-lite@0.4.24: 169 | version "0.4.24" 170 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 171 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 172 | dependencies: 173 | safer-buffer ">= 2.1.2 < 3" 174 | 175 | inherits@2.0.3: 176 | version "2.0.3" 177 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 178 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 179 | 180 | ipaddr.js@1.9.0: 181 | version "1.9.0" 182 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" 183 | integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== 184 | 185 | media-typer@0.3.0: 186 | version "0.3.0" 187 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 188 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 189 | 190 | merge-descriptors@1.0.1: 191 | version "1.0.1" 192 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 193 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 194 | 195 | methods@~1.1.2: 196 | version "1.1.2" 197 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 198 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 199 | 200 | mime-db@1.40.0: 201 | version "1.40.0" 202 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 203 | integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 204 | 205 | mime-types@~2.1.24: 206 | version "2.1.24" 207 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 208 | integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== 209 | dependencies: 210 | mime-db "1.40.0" 211 | 212 | mime@1.6.0: 213 | version "1.6.0" 214 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 215 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 216 | 217 | ms@2.0.0: 218 | version "2.0.0" 219 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 220 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 221 | 222 | ms@2.1.1: 223 | version "2.1.1" 224 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 225 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 226 | 227 | negotiator@0.6.2: 228 | version "0.6.2" 229 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 230 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 231 | 232 | on-finished@~2.3.0: 233 | version "2.3.0" 234 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 235 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 236 | dependencies: 237 | ee-first "1.1.1" 238 | 239 | parseurl@~1.3.3: 240 | version "1.3.3" 241 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 242 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 243 | 244 | path-to-regexp@0.1.7: 245 | version "0.1.7" 246 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 247 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 248 | 249 | proxy-addr@~2.0.5: 250 | version "2.0.5" 251 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" 252 | integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== 253 | dependencies: 254 | forwarded "~0.1.2" 255 | ipaddr.js "1.9.0" 256 | 257 | qs@6.7.0: 258 | version "6.7.0" 259 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 260 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 261 | 262 | range-parser@~1.2.1: 263 | version "1.2.1" 264 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 265 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 266 | 267 | raw-body@2.4.0: 268 | version "2.4.0" 269 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 270 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 271 | dependencies: 272 | bytes "3.1.0" 273 | http-errors "1.7.2" 274 | iconv-lite "0.4.24" 275 | unpipe "1.0.0" 276 | 277 | safe-buffer@5.1.2: 278 | version "5.1.2" 279 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 280 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 281 | 282 | "safer-buffer@>= 2.1.2 < 3": 283 | version "2.1.2" 284 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 285 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 286 | 287 | send@0.17.1: 288 | version "0.17.1" 289 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 290 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 291 | dependencies: 292 | debug "2.6.9" 293 | depd "~1.1.2" 294 | destroy "~1.0.4" 295 | encodeurl "~1.0.2" 296 | escape-html "~1.0.3" 297 | etag "~1.8.1" 298 | fresh "0.5.2" 299 | http-errors "~1.7.2" 300 | mime "1.6.0" 301 | ms "2.1.1" 302 | on-finished "~2.3.0" 303 | range-parser "~1.2.1" 304 | statuses "~1.5.0" 305 | 306 | serve-static@1.14.1: 307 | version "1.14.1" 308 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 309 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 310 | dependencies: 311 | encodeurl "~1.0.2" 312 | escape-html "~1.0.3" 313 | parseurl "~1.3.3" 314 | send "0.17.1" 315 | 316 | setprototypeof@1.1.1: 317 | version "1.1.1" 318 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 319 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 320 | 321 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 322 | version "1.5.0" 323 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 324 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 325 | 326 | toidentifier@1.0.0: 327 | version "1.0.0" 328 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 329 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 330 | 331 | type-is@~1.6.17, type-is@~1.6.18: 332 | version "1.6.18" 333 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 334 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 335 | dependencies: 336 | media-typer "0.3.0" 337 | mime-types "~2.1.24" 338 | 339 | unpipe@1.0.0, unpipe@~1.0.0: 340 | version "1.0.0" 341 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 342 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 343 | 344 | utils-merge@1.0.1: 345 | version "1.0.1" 346 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 347 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 348 | 349 | vary@~1.1.2: 350 | version "1.1.2" 351 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 352 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 353 | --------------------------------------------------------------------------------