├── .gitignore ├── .gitattributes ├── views ├── includes │ ├── todo-list.pug │ ├── item-count.pug │ ├── edit-item.pug │ └── todo-item.pug └── index.pug ├── todomvc-htmx.gif ├── .editorconfig ├── package.json ├── readme.md ├── assets └── css │ ├── todomvc-common │ └── base.css │ └── todomvc-app-css │ └── index.css ├── server.js └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /views/includes/todo-list.pug: -------------------------------------------------------------------------------- 1 | each todo in todos 2 | include todo-item 3 | -------------------------------------------------------------------------------- /todomvc-htmx.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rajasegar/todomvc-htmx/HEAD/todomvc-htmx.gif -------------------------------------------------------------------------------- /views/includes/item-count.pug: -------------------------------------------------------------------------------- 1 | span#todo-count.todo-count(hx-swap-oob="true") 2 | strong #{itemsLeft} 3 | | item left 4 | -------------------------------------------------------------------------------- /views/includes/edit-item.pug: -------------------------------------------------------------------------------- 1 | form(hx-post="/todos/update/" + todo.id) 2 | input.edit(type="text", name="name",value=todo.name) 3 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | end_of_line = lf 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | 10 | [package.json] 11 | indent_style = space 12 | indent_size = 2 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "dependencies": { 4 | "body-parser": "^1.19.0", 5 | "express": "^4.17.1", 6 | "pug": "^3.0.2", 7 | "todomvc-app-css": "^2.0.0", 8 | "todomvc-common": "^1.0.0", 9 | "uuid": "^8.3.2" 10 | }, 11 | "scripts": { 12 | "start": "node server.js", 13 | "dev": "nodemon server.js" 14 | }, 15 | "devDependencies": { 16 | "nodemon": "^2.0.7" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /views/includes/todo-item.pug: -------------------------------------------------------------------------------- 1 | li(id='todo-' + todo.id, class={completed: todo.done === true}) 2 | .view 3 | input.toggle(hx-patch='/todos/' + todo.id, type='checkbox', checked=todo.done, hx-target='#todo-' + todo.id, hx-swap="outerHTML") 4 | label(hx-get='/todos/edit/' + todo.id, hx-target="#todo-" + todo.id, hx-swap="outerHTML") #{todo.name} 5 | button.destroy(hx-delete='/todos/' + todo.id, _="on htmx:afterOnLoad remove #todo-" + todo.id ) 6 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # htmx • [TodoMVC](http://todomvc.com) 2 | 3 | > htmx - high power tools for HTML 4 | 5 | 6 | ![todomvc htmx demo gif](todomvc-htmx.gif) 7 | 8 | ## Resources 9 | 10 | - [Website](https://htmx.org) 11 | - [Documentation](https://htmx.org/docs) 12 | - [Discord](https://htmx.org/discord) 13 | 14 | ### Articles 15 | 16 | - [Locality of Behavior](https://htmx.org/essays/locality-of-behaviour) 17 | - [Complexity Budget](https://htmx.org/essays/complexity-budget) 18 | - [SPA Alternative](https://htmx.org/essays/spa-alternative) 19 | 20 | ### Support 21 | 22 | - [Stack Overflow](http://stackoverflow.com/questions/tagged/htmx) 23 | - [Twitter](http://twitter.com/htmx_org) 24 | 25 | *Let us [know](https://github.com/tastejs/todomvc/issues) if you discover anything worth sharing.* 26 | 27 | 28 | ## Implementation 29 | 30 | This app was created as [express](https://expressjs.com)(Node.js) app in the backend and 31 | **No Javascript code** in the frontend, thanks to [htmx](https://htmx.org) and [hyperscript](https://hyperscript.org). 32 | 33 | ## Credit 34 | 35 | Created by [Rajasegar Chandran](https://twitter.com/rajasegar_c) 36 | -------------------------------------------------------------------------------- /assets/css/todomvc-common/base.css: -------------------------------------------------------------------------------- 1 | hr { 2 | margin: 20px 0; 3 | border: 0; 4 | border-top: 1px dashed #c5c5c5; 5 | border-bottom: 1px dashed #f7f7f7; 6 | } 7 | 8 | .learn a { 9 | font-weight: normal; 10 | text-decoration: none; 11 | color: #b83f45; 12 | } 13 | 14 | .learn a:hover { 15 | text-decoration: underline; 16 | color: #787e7e; 17 | } 18 | 19 | .learn h3, 20 | .learn h4, 21 | .learn h5 { 22 | margin: 10px 0; 23 | font-weight: 500; 24 | line-height: 1.2; 25 | color: #000; 26 | } 27 | 28 | .learn h3 { 29 | font-size: 24px; 30 | } 31 | 32 | .learn h4 { 33 | font-size: 18px; 34 | } 35 | 36 | .learn h5 { 37 | margin-bottom: 0; 38 | font-size: 14px; 39 | } 40 | 41 | .learn ul { 42 | padding: 0; 43 | margin: 0 0 30px 25px; 44 | } 45 | 46 | .learn li { 47 | line-height: 20px; 48 | } 49 | 50 | .learn p { 51 | font-size: 15px; 52 | font-weight: 300; 53 | line-height: 1.3; 54 | margin-top: 0; 55 | margin-bottom: 0; 56 | } 57 | 58 | #issue-count { 59 | display: none; 60 | } 61 | 62 | .quote { 63 | border: none; 64 | margin: 20px 0 60px 0; 65 | } 66 | 67 | .quote p { 68 | font-style: italic; 69 | } 70 | 71 | .quote p:before { 72 | content: '“'; 73 | font-size: 50px; 74 | opacity: .15; 75 | position: absolute; 76 | top: -20px; 77 | left: 3px; 78 | } 79 | 80 | .quote p:after { 81 | content: '”'; 82 | font-size: 50px; 83 | opacity: .15; 84 | position: absolute; 85 | bottom: -42px; 86 | right: 3px; 87 | } 88 | 89 | .quote footer { 90 | position: absolute; 91 | bottom: -40px; 92 | right: 0; 93 | } 94 | 95 | .quote footer img { 96 | border-radius: 3px; 97 | } 98 | 99 | .quote footer a { 100 | margin-left: 5px; 101 | vertical-align: middle; 102 | } 103 | 104 | .speech-bubble { 105 | position: relative; 106 | padding: 10px; 107 | background: rgba(0, 0, 0, .04); 108 | border-radius: 5px; 109 | } 110 | 111 | .speech-bubble:after { 112 | content: ''; 113 | position: absolute; 114 | top: 100%; 115 | right: 30px; 116 | border: 13px solid transparent; 117 | border-top-color: rgba(0, 0, 0, .04); 118 | } 119 | 120 | .learn-bar > .learn { 121 | position: absolute; 122 | width: 272px; 123 | top: 8px; 124 | left: -300px; 125 | padding: 10px; 126 | border-radius: 5px; 127 | background-color: rgba(255, 255, 255, .6); 128 | transition-property: left; 129 | transition-duration: 500ms; 130 | } 131 | 132 | @media (min-width: 899px) { 133 | .learn-bar { 134 | width: auto; 135 | padding-left: 300px; 136 | } 137 | 138 | .learn-bar > .learn { 139 | left: 8px; 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /views/index.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang='en') 3 | head 4 | meta(charset='utf-8') 5 | meta(name='viewport' content='width=device-width, initial-scale=1') 6 | title Template • TodoMVC 7 | link(rel='stylesheet' href='/css/todomvc-common/base.css') 8 | link(rel='stylesheet' href='/css/todomvc-app-css/index.css') 9 | // CSS overrides - remove if you don't need it 10 | //-link(rel='stylesheet' href='css/app.css') 11 | body 12 | section.todoapp 13 | header.header 14 | h1 todos 15 | form(hx-post="/todos", hx-target="#todo-list", hx-swap="afterbegin", _="on htmx:afterOnLoad set #txtTodo.value to ''") 16 | input#txtTodo.new-todo(name="todo",placeholder='What needs to be done?', autofocus='') 17 | // This section should be hidden by default and shown when there are todos 18 | section.main 19 | input#toggle-all.toggle-all(type='checkbox') 20 | label(for='toggle-all') Mark all as complete 21 | ul#todo-list.todo-list 22 | // These are here just to show the structure of the list items 23 | // List items should get the class `editing` when editing and `completed` when marked as completed 24 | each todo in todos 25 | include includes/todo-item 26 | 27 | // This footer should be hidden by default and shown when there are todos 28 | footer.footer 29 | // This should be `0 items left` by default 30 | include includes/item-count 31 | // Remove this if you don't implement routing 32 | ul.filters 33 | li 34 | a(href='/?filter=all', class={selected : filter === 'all'}) All 35 | li 36 | a(href='/?filter=active', class={selected: filter === 'active'}) Active 37 | li 38 | a(href='/?filter=completed', class={selected: filter === 'completed'}) Completed 39 | // Hidden if no completed items are left ↓ 40 | button.clear-completed(hx-post="/todos/clear-completed", hx-target='#todo-list') Clear completed 41 | footer.info 42 | p Click to edit a todo 43 | // Remove the below line ↓ 44 | p 45 | | Template by 46 | a(href='http://sindresorhus.com') Sindre Sorhus 47 | // Change this out with your name and url ↓ 48 | p 49 | | Created by 50 | a(href='https://twitter.com/rajasegar_c') Rajasegar Chandran 51 | p 52 | | Part of 53 | a(href='http://todomvc.com') TodoMVC 54 | // Scripts here. Don't remove ↓ 55 | //-script(src='node_modules/todomvc-common/base.js') 56 | //-script(src='js/app.js') 57 | script(src='https://unpkg.com/htmx.org@1.3.1') 58 | script(src='https://unpkg.com/hyperscript.org@0.0.5') 59 | 60 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const pug = require('pug'); 3 | const bodyParser = require('body-parser'); 4 | const path = require('path'); 5 | const { v4 : uuid } = require('uuid'); 6 | 7 | const PORT = process.env.PORT || 3000; 8 | 9 | let todos = [ 10 | { 11 | id: uuid(), 12 | name: 'Taste htmx', 13 | done: true 14 | }, 15 | { 16 | id: uuid(), 17 | name: 'Buy a unicorn', 18 | done: false 19 | } 20 | ]; 21 | 22 | const getItemsLeft = () => todos.filter(t => !t.done).length; 23 | 24 | const app = express(); 25 | app.set('view engine', 'pug'); 26 | 27 | app.use(bodyParser.json()); 28 | app.use(bodyParser.urlencoded({extended: true})); 29 | 30 | app.use(express.static(path.join(__dirname, 'assets'))); 31 | 32 | app.get('/', (req, res) => { 33 | const { filter } = req.query; 34 | let filteredTodos = []; 35 | switch(filter) { 36 | case 'all': 37 | filteredTodos = todos; 38 | break; 39 | case 'active': 40 | filteredTodos = todos.filter(t => !t.done); 41 | break; 42 | case 'completed': 43 | filteredTodos = todos.filter(t => t.done); 44 | break; 45 | default: 46 | filteredTodos = todos; 47 | } 48 | 49 | res.render('index', { todos: filteredTodos, filter, itemsLeft: getItemsLeft() }); 50 | }); 51 | 52 | app.post('/todos', (req, res) => { 53 | const { todo } = req.body; 54 | const newTodo = { 55 | id: uuid(), 56 | name: todo, 57 | done: false 58 | }; 59 | todos.push(newTodo); 60 | let template = pug.compileFile('views/includes/todo-item.pug'); 61 | let markup = template({ todo: newTodo}); 62 | template = pug.compileFile('views/includes/item-count.pug'); 63 | markup += template({ itemsLeft: getItemsLeft()}); 64 | res.send(markup); 65 | }); 66 | 67 | app.get('/todos/edit/:id', (req, res) => { 68 | const { id } = req.params; 69 | const todo = todos.find(t => t.id === id); 70 | let template = pug.compileFile('views/includes/edit-item.pug'); 71 | let markup = template({ todo }); 72 | res.send(markup); 73 | }); 74 | 75 | app.patch('/todos/:id', (req, res) => { 76 | const { id } = req.params; 77 | const todo = todos.find(t => t.id === id); 78 | todo.done = !todo.done; 79 | let template = pug.compileFile('views/includes/todo-item.pug'); 80 | let markup = template({ todo }); 81 | template = pug.compileFile('views/includes/item-count.pug'); 82 | markup += template({ itemsLeft: getItemsLeft()}); 83 | res.send(markup); 84 | }); 85 | 86 | app.post('/todos/update/:id', (req, res) => { 87 | const { id } = req.params; 88 | const { name } = req.body; 89 | const todo = todos.find(t => t.id === id); 90 | todo.name = name; 91 | let template = pug.compileFile('views/includes/todo-item.pug'); 92 | let markup = template({ todo }); 93 | template = pug.compileFile('views/includes/item-count.pug'); 94 | markup += template({ itemsLeft: getItemsLeft()}); 95 | res.send(markup); 96 | }); 97 | 98 | app.delete('/todos/:id', (req,res) => { 99 | const { id } = req.params; 100 | const idx = todos.find(t => t === id); 101 | todos.splice(idx, 1); 102 | const template = pug.compileFile('views/includes/item-count.pug'); 103 | const markup = template({ itemsLeft: getItemsLeft()}); 104 | res.send(markup); 105 | }); 106 | 107 | app.post('/todos/clear-completed', (req, res) => { 108 | const newTodos = todos.filter(t => !t.done); 109 | todos = [...newTodos]; 110 | let template = pug.compileFile('views/includes/todo-list.pug'); 111 | let markup = template({ todos }); 112 | template = pug.compileFile('views/includes/item-count.pug'); 113 | markup += template({ itemsLeft: getItemsLeft()}); 114 | res.send(markup); 115 | }); 116 | 117 | app.listen(PORT); 118 | 119 | console.log('Listening on port: ' + PORT); 120 | -------------------------------------------------------------------------------- /assets/css/todomvc-app-css/index.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | button { 8 | margin: 0; 9 | padding: 0; 10 | border: 0; 11 | background: none; 12 | font-size: 100%; 13 | vertical-align: baseline; 14 | font-family: inherit; 15 | font-weight: inherit; 16 | color: inherit; 17 | -webkit-appearance: none; 18 | appearance: none; 19 | -webkit-font-smoothing: antialiased; 20 | -moz-osx-font-smoothing: grayscale; 21 | } 22 | 23 | body { 24 | font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif; 25 | line-height: 1.4em; 26 | background: #f5f5f5; 27 | color: #111111; 28 | min-width: 230px; 29 | max-width: 550px; 30 | margin: 0 auto; 31 | -webkit-font-smoothing: antialiased; 32 | -moz-osx-font-smoothing: grayscale; 33 | font-weight: 300; 34 | } 35 | 36 | :focus { 37 | outline: 0; 38 | } 39 | 40 | .hidden { 41 | display: none; 42 | } 43 | 44 | .todoapp { 45 | background: #fff; 46 | margin: 130px 0 40px 0; 47 | position: relative; 48 | box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 49 | 0 25px 50px 0 rgba(0, 0, 0, 0.1); 50 | } 51 | 52 | .todoapp input::-webkit-input-placeholder { 53 | font-style: italic; 54 | font-weight: 300; 55 | color: rgba(0, 0, 0, 0.4); 56 | } 57 | 58 | .todoapp input::-moz-placeholder { 59 | font-style: italic; 60 | font-weight: 300; 61 | color: rgba(0, 0, 0, 0.4); 62 | } 63 | 64 | .todoapp input::input-placeholder { 65 | font-style: italic; 66 | font-weight: 300; 67 | color: rgba(0, 0, 0, 0.4); 68 | } 69 | 70 | .todoapp h1 { 71 | position: absolute; 72 | top: -140px; 73 | width: 100%; 74 | font-size: 80px; 75 | font-weight: 200; 76 | text-align: center; 77 | color: #b83f45; 78 | -webkit-text-rendering: optimizeLegibility; 79 | -moz-text-rendering: optimizeLegibility; 80 | text-rendering: optimizeLegibility; 81 | } 82 | 83 | .new-todo, 84 | .edit { 85 | position: relative; 86 | margin: 0; 87 | width: 100%; 88 | font-size: 24px; 89 | font-family: inherit; 90 | font-weight: inherit; 91 | line-height: 1.4em; 92 | color: inherit; 93 | padding: 6px; 94 | border: 1px solid #999; 95 | box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2); 96 | box-sizing: border-box; 97 | -webkit-font-smoothing: antialiased; 98 | -moz-osx-font-smoothing: grayscale; 99 | } 100 | 101 | .new-todo { 102 | padding: 16px 16px 16px 60px; 103 | border: none; 104 | background: rgba(0, 0, 0, 0.003); 105 | box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03); 106 | } 107 | 108 | .main { 109 | position: relative; 110 | z-index: 2; 111 | border-top: 1px solid #e6e6e6; 112 | } 113 | 114 | .toggle-all { 115 | width: 1px; 116 | height: 1px; 117 | border: none; /* Mobile Safari */ 118 | opacity: 0; 119 | position: absolute; 120 | right: 100%; 121 | bottom: 100%; 122 | } 123 | 124 | .toggle-all + label { 125 | width: 60px; 126 | height: 34px; 127 | font-size: 0; 128 | position: absolute; 129 | top: -52px; 130 | left: -13px; 131 | -webkit-transform: rotate(90deg); 132 | transform: rotate(90deg); 133 | } 134 | 135 | .toggle-all + label:before { 136 | content: '❯'; 137 | font-size: 22px; 138 | color: #e6e6e6; 139 | padding: 10px 27px 10px 27px; 140 | } 141 | 142 | .toggle-all:checked + label:before { 143 | color: #737373; 144 | } 145 | 146 | .todo-list { 147 | margin: 0; 148 | padding: 0; 149 | list-style: none; 150 | } 151 | 152 | .todo-list li { 153 | position: relative; 154 | font-size: 24px; 155 | border-bottom: 1px solid #ededed; 156 | } 157 | 158 | .todo-list li:last-child { 159 | border-bottom: none; 160 | } 161 | 162 | .todo-list li.editing { 163 | border-bottom: none; 164 | padding: 0; 165 | } 166 | 167 | .todo-list li.editing .edit { 168 | display: block; 169 | width: calc(100% - 43px); 170 | padding: 12px 16px; 171 | margin: 0 0 0 43px; 172 | } 173 | 174 | .todo-list li.editing .view { 175 | display: none; 176 | } 177 | 178 | .todo-list li .toggle { 179 | text-align: center; 180 | width: 40px; 181 | /* auto, since non-WebKit browsers doesn't support input styling */ 182 | height: auto; 183 | position: absolute; 184 | top: 0; 185 | bottom: 0; 186 | margin: auto 0; 187 | border: none; /* Mobile Safari */ 188 | -webkit-appearance: none; 189 | appearance: none; 190 | } 191 | 192 | .todo-list li .toggle { 193 | opacity: 0; 194 | } 195 | 196 | .todo-list li .toggle + label { 197 | /* 198 | Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433 199 | IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/ 200 | */ 201 | background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E'); 202 | background-repeat: no-repeat; 203 | background-position: center left; 204 | } 205 | 206 | .todo-list li .toggle:checked + label { 207 | background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E'); 208 | } 209 | 210 | .todo-list li label { 211 | word-break: break-all; 212 | padding: 15px 15px 15px 60px; 213 | display: block; 214 | line-height: 1.2; 215 | transition: color 0.4s; 216 | font-weight: 400; 217 | color: #4d4d4d; 218 | } 219 | 220 | .todo-list li.completed label { 221 | color: #cdcdcd; 222 | text-decoration: line-through; 223 | } 224 | 225 | .todo-list li .destroy { 226 | display: none; 227 | position: absolute; 228 | top: 0; 229 | right: 10px; 230 | bottom: 0; 231 | width: 40px; 232 | height: 40px; 233 | margin: auto 0; 234 | font-size: 30px; 235 | color: #cc9a9a; 236 | margin-bottom: 11px; 237 | transition: color 0.2s ease-out; 238 | } 239 | 240 | .todo-list li .destroy:hover { 241 | color: #af5b5e; 242 | } 243 | 244 | .todo-list li .destroy:after { 245 | content: '×'; 246 | } 247 | 248 | .todo-list li:hover .destroy { 249 | display: block; 250 | } 251 | 252 | .todo-list li .edit { 253 | display: none; 254 | } 255 | 256 | .todo-list li.editing:last-child { 257 | margin-bottom: -1px; 258 | } 259 | 260 | .footer { 261 | padding: 10px 15px; 262 | height: 20px; 263 | text-align: center; 264 | font-size: 15px; 265 | border-top: 1px solid #e6e6e6; 266 | } 267 | 268 | .footer:before { 269 | content: ''; 270 | position: absolute; 271 | right: 0; 272 | bottom: 0; 273 | left: 0; 274 | height: 50px; 275 | overflow: hidden; 276 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 277 | 0 8px 0 -3px #f6f6f6, 278 | 0 9px 1px -3px rgba(0, 0, 0, 0.2), 279 | 0 16px 0 -6px #f6f6f6, 280 | 0 17px 2px -6px rgba(0, 0, 0, 0.2); 281 | } 282 | 283 | .todo-count { 284 | float: left; 285 | text-align: left; 286 | } 287 | 288 | .todo-count strong { 289 | font-weight: 300; 290 | } 291 | 292 | .filters { 293 | margin: 0; 294 | padding: 0; 295 | list-style: none; 296 | position: absolute; 297 | right: 0; 298 | left: 0; 299 | } 300 | 301 | .filters li { 302 | display: inline; 303 | } 304 | 305 | .filters li a { 306 | color: inherit; 307 | margin: 3px; 308 | padding: 3px 7px; 309 | text-decoration: none; 310 | border: 1px solid transparent; 311 | border-radius: 3px; 312 | } 313 | 314 | .filters li a:hover { 315 | border-color: rgba(175, 47, 47, 0.1); 316 | } 317 | 318 | .filters li a.selected { 319 | border-color: rgba(175, 47, 47, 0.2); 320 | } 321 | 322 | .clear-completed, 323 | html .clear-completed:active { 324 | float: right; 325 | position: relative; 326 | line-height: 20px; 327 | text-decoration: none; 328 | cursor: pointer; 329 | } 330 | 331 | .clear-completed:hover { 332 | text-decoration: underline; 333 | } 334 | 335 | .info { 336 | margin: 65px auto 0; 337 | color: #4d4d4d; 338 | font-size: 11px; 339 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 340 | text-align: center; 341 | } 342 | 343 | .info p { 344 | line-height: 1; 345 | } 346 | 347 | .info a { 348 | color: inherit; 349 | text-decoration: none; 350 | font-weight: 400; 351 | } 352 | 353 | .info a:hover { 354 | text-decoration: underline; 355 | } 356 | 357 | /* 358 | Hack to remove background from Mobile Safari. 359 | Can't use it globally since it destroys checkboxes in Firefox 360 | */ 361 | @media screen and (-webkit-min-device-pixel-ratio:0) { 362 | .toggle-all, 363 | .todo-list li .toggle { 364 | background: none; 365 | } 366 | 367 | .todo-list li .toggle { 368 | height: 40px; 369 | } 370 | } 371 | 372 | @media (max-width: 430px) { 373 | .footer { 374 | height: 50px; 375 | } 376 | 377 | .filters { 378 | bottom: 10px; 379 | } 380 | } 381 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | body-parser: 1.19.0 3 | express: 4.17.1 4 | pug: 3.0.2 5 | todomvc-app-css: 2.3.0 6 | todomvc-common: 1.0.5 7 | uuid: 8.3.2 8 | devDependencies: 9 | nodemon: 2.0.7 10 | lockfileVersion: 5.2 11 | packages: 12 | /@babel/helper-validator-identifier/7.12.11: 13 | dev: false 14 | resolution: 15 | integrity: sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== 16 | /@babel/parser/7.13.11: 17 | dev: false 18 | engines: 19 | node: '>=6.0.0' 20 | hasBin: true 21 | resolution: 22 | integrity: sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q== 23 | /@babel/types/7.13.0: 24 | dependencies: 25 | '@babel/helper-validator-identifier': 7.12.11 26 | lodash: 4.17.21 27 | to-fast-properties: 2.0.0 28 | dev: false 29 | resolution: 30 | integrity: sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== 31 | /@sindresorhus/is/0.14.0: 32 | dev: true 33 | engines: 34 | node: '>=6' 35 | resolution: 36 | integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 37 | /@szmarczak/http-timer/1.1.2: 38 | dependencies: 39 | defer-to-connect: 1.1.3 40 | dev: true 41 | engines: 42 | node: '>=6' 43 | resolution: 44 | integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 45 | /abbrev/1.1.1: 46 | dev: true 47 | resolution: 48 | integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 49 | /accepts/1.3.7: 50 | dependencies: 51 | mime-types: 2.1.29 52 | negotiator: 0.6.2 53 | dev: false 54 | engines: 55 | node: '>= 0.6' 56 | resolution: 57 | integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 58 | /acorn/7.4.1: 59 | dev: false 60 | engines: 61 | node: '>=0.4.0' 62 | hasBin: true 63 | resolution: 64 | integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 65 | /ansi-align/3.0.0: 66 | dependencies: 67 | string-width: 3.1.0 68 | dev: true 69 | resolution: 70 | integrity: sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== 71 | /ansi-regex/4.1.0: 72 | dev: true 73 | engines: 74 | node: '>=6' 75 | resolution: 76 | integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 77 | /ansi-regex/5.0.0: 78 | dev: true 79 | engines: 80 | node: '>=8' 81 | resolution: 82 | integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 83 | /ansi-styles/4.3.0: 84 | dependencies: 85 | color-convert: 2.0.1 86 | dev: true 87 | engines: 88 | node: '>=8' 89 | resolution: 90 | integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 91 | /anymatch/3.1.1: 92 | dependencies: 93 | normalize-path: 3.0.0 94 | picomatch: 2.2.2 95 | dev: true 96 | engines: 97 | node: '>= 8' 98 | resolution: 99 | integrity: sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 100 | /array-flatten/1.1.1: 101 | dev: false 102 | resolution: 103 | integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 104 | /asap/2.0.6: 105 | dev: false 106 | resolution: 107 | integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= 108 | /assert-never/1.2.1: 109 | dev: false 110 | resolution: 111 | integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== 112 | /babel-walk/3.0.0-canary-5: 113 | dependencies: 114 | '@babel/types': 7.13.0 115 | dev: false 116 | engines: 117 | node: '>= 10.0.0' 118 | resolution: 119 | integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== 120 | /balanced-match/1.0.0: 121 | dev: true 122 | resolution: 123 | integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 124 | /binary-extensions/2.2.0: 125 | dev: true 126 | engines: 127 | node: '>=8' 128 | resolution: 129 | integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 130 | /body-parser/1.19.0: 131 | dependencies: 132 | bytes: 3.1.0 133 | content-type: 1.0.4 134 | debug: 2.6.9 135 | depd: 1.1.2 136 | http-errors: 1.7.2 137 | iconv-lite: 0.4.24 138 | on-finished: 2.3.0 139 | qs: 6.7.0 140 | raw-body: 2.4.0 141 | type-is: 1.6.18 142 | dev: false 143 | engines: 144 | node: '>= 0.8' 145 | resolution: 146 | integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 147 | /boxen/4.2.0: 148 | dependencies: 149 | ansi-align: 3.0.0 150 | camelcase: 5.3.1 151 | chalk: 3.0.0 152 | cli-boxes: 2.2.1 153 | string-width: 4.2.2 154 | term-size: 2.2.1 155 | type-fest: 0.8.1 156 | widest-line: 3.1.0 157 | dev: true 158 | engines: 159 | node: '>=8' 160 | resolution: 161 | integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== 162 | /brace-expansion/1.1.11: 163 | dependencies: 164 | balanced-match: 1.0.0 165 | concat-map: 0.0.1 166 | dev: true 167 | resolution: 168 | integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 169 | /braces/3.0.2: 170 | dependencies: 171 | fill-range: 7.0.1 172 | dev: true 173 | engines: 174 | node: '>=8' 175 | resolution: 176 | integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 177 | /bytes/3.1.0: 178 | dev: false 179 | engines: 180 | node: '>= 0.8' 181 | resolution: 182 | integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 183 | /cacheable-request/6.1.0: 184 | dependencies: 185 | clone-response: 1.0.2 186 | get-stream: 5.2.0 187 | http-cache-semantics: 4.1.0 188 | keyv: 3.1.0 189 | lowercase-keys: 2.0.0 190 | normalize-url: 4.5.0 191 | responselike: 1.0.2 192 | dev: true 193 | engines: 194 | node: '>=8' 195 | resolution: 196 | integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 197 | /call-bind/1.0.2: 198 | dependencies: 199 | function-bind: 1.1.1 200 | get-intrinsic: 1.1.1 201 | dev: false 202 | resolution: 203 | integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 204 | /camelcase/5.3.1: 205 | dev: true 206 | engines: 207 | node: '>=6' 208 | resolution: 209 | integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 210 | /chalk/3.0.0: 211 | dependencies: 212 | ansi-styles: 4.3.0 213 | supports-color: 7.2.0 214 | dev: true 215 | engines: 216 | node: '>=8' 217 | resolution: 218 | integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 219 | /character-parser/2.2.0: 220 | dependencies: 221 | is-regex: 1.1.2 222 | dev: false 223 | resolution: 224 | integrity: sha1-x84o821LzZdE5f/CxfzeHHMmH8A= 225 | /chokidar/3.5.1: 226 | dependencies: 227 | anymatch: 3.1.1 228 | braces: 3.0.2 229 | glob-parent: 5.1.2 230 | is-binary-path: 2.1.0 231 | is-glob: 4.0.1 232 | normalize-path: 3.0.0 233 | readdirp: 3.5.0 234 | dev: true 235 | engines: 236 | node: '>= 8.10.0' 237 | optionalDependencies: 238 | fsevents: 2.3.2 239 | resolution: 240 | integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== 241 | /ci-info/2.0.0: 242 | dev: true 243 | resolution: 244 | integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 245 | /cli-boxes/2.2.1: 246 | dev: true 247 | engines: 248 | node: '>=6' 249 | resolution: 250 | integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 251 | /clone-response/1.0.2: 252 | dependencies: 253 | mimic-response: 1.0.1 254 | dev: true 255 | resolution: 256 | integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 257 | /color-convert/2.0.1: 258 | dependencies: 259 | color-name: 1.1.4 260 | dev: true 261 | engines: 262 | node: '>=7.0.0' 263 | resolution: 264 | integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 265 | /color-name/1.1.4: 266 | dev: true 267 | resolution: 268 | integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 269 | /concat-map/0.0.1: 270 | dev: true 271 | resolution: 272 | integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 273 | /configstore/5.0.1: 274 | dependencies: 275 | dot-prop: 5.3.0 276 | graceful-fs: 4.2.6 277 | make-dir: 3.1.0 278 | unique-string: 2.0.0 279 | write-file-atomic: 3.0.3 280 | xdg-basedir: 4.0.0 281 | dev: true 282 | engines: 283 | node: '>=8' 284 | resolution: 285 | integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 286 | /constantinople/4.0.1: 287 | dependencies: 288 | '@babel/parser': 7.13.11 289 | '@babel/types': 7.13.0 290 | dev: false 291 | resolution: 292 | integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== 293 | /content-disposition/0.5.3: 294 | dependencies: 295 | safe-buffer: 5.1.2 296 | dev: false 297 | engines: 298 | node: '>= 0.6' 299 | resolution: 300 | integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 301 | /content-type/1.0.4: 302 | dev: false 303 | engines: 304 | node: '>= 0.6' 305 | resolution: 306 | integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 307 | /cookie-signature/1.0.6: 308 | dev: false 309 | resolution: 310 | integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 311 | /cookie/0.4.0: 312 | dev: false 313 | engines: 314 | node: '>= 0.6' 315 | resolution: 316 | integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 317 | /crypto-random-string/2.0.0: 318 | dev: true 319 | engines: 320 | node: '>=8' 321 | resolution: 322 | integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 323 | /debug/2.6.9: 324 | dependencies: 325 | ms: 2.0.0 326 | resolution: 327 | integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 328 | /debug/3.2.7: 329 | dependencies: 330 | ms: 2.1.3 331 | dev: true 332 | resolution: 333 | integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 334 | /decompress-response/3.3.0: 335 | dependencies: 336 | mimic-response: 1.0.1 337 | dev: true 338 | engines: 339 | node: '>=4' 340 | resolution: 341 | integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 342 | /deep-extend/0.6.0: 343 | dev: true 344 | engines: 345 | node: '>=4.0.0' 346 | resolution: 347 | integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 348 | /defer-to-connect/1.1.3: 349 | dev: true 350 | resolution: 351 | integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 352 | /depd/1.1.2: 353 | dev: false 354 | engines: 355 | node: '>= 0.6' 356 | resolution: 357 | integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 358 | /destroy/1.0.4: 359 | dev: false 360 | resolution: 361 | integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 362 | /doctypes/1.1.0: 363 | dev: false 364 | resolution: 365 | integrity: sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= 366 | /dot-prop/5.3.0: 367 | dependencies: 368 | is-obj: 2.0.0 369 | dev: true 370 | engines: 371 | node: '>=8' 372 | resolution: 373 | integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 374 | /duplexer3/0.1.4: 375 | dev: true 376 | resolution: 377 | integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 378 | /ee-first/1.1.1: 379 | dev: false 380 | resolution: 381 | integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 382 | /emoji-regex/7.0.3: 383 | dev: true 384 | resolution: 385 | integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 386 | /emoji-regex/8.0.0: 387 | dev: true 388 | resolution: 389 | integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 390 | /encodeurl/1.0.2: 391 | dev: false 392 | engines: 393 | node: '>= 0.8' 394 | resolution: 395 | integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 396 | /end-of-stream/1.4.4: 397 | dependencies: 398 | once: 1.4.0 399 | dev: true 400 | resolution: 401 | integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 402 | /escape-goat/2.1.1: 403 | dev: true 404 | engines: 405 | node: '>=8' 406 | resolution: 407 | integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 408 | /escape-html/1.0.3: 409 | dev: false 410 | resolution: 411 | integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 412 | /etag/1.8.1: 413 | dev: false 414 | engines: 415 | node: '>= 0.6' 416 | resolution: 417 | integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 418 | /express/4.17.1: 419 | dependencies: 420 | accepts: 1.3.7 421 | array-flatten: 1.1.1 422 | body-parser: 1.19.0 423 | content-disposition: 0.5.3 424 | content-type: 1.0.4 425 | cookie: 0.4.0 426 | cookie-signature: 1.0.6 427 | debug: 2.6.9 428 | depd: 1.1.2 429 | encodeurl: 1.0.2 430 | escape-html: 1.0.3 431 | etag: 1.8.1 432 | finalhandler: 1.1.2 433 | fresh: 0.5.2 434 | merge-descriptors: 1.0.1 435 | methods: 1.1.2 436 | on-finished: 2.3.0 437 | parseurl: 1.3.3 438 | path-to-regexp: 0.1.7 439 | proxy-addr: 2.0.6 440 | qs: 6.7.0 441 | range-parser: 1.2.1 442 | safe-buffer: 5.1.2 443 | send: 0.17.1 444 | serve-static: 1.14.1 445 | setprototypeof: 1.1.1 446 | statuses: 1.5.0 447 | type-is: 1.6.18 448 | utils-merge: 1.0.1 449 | vary: 1.1.2 450 | dev: false 451 | engines: 452 | node: '>= 0.10.0' 453 | resolution: 454 | integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 455 | /fill-range/7.0.1: 456 | dependencies: 457 | to-regex-range: 5.0.1 458 | dev: true 459 | engines: 460 | node: '>=8' 461 | resolution: 462 | integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 463 | /finalhandler/1.1.2: 464 | dependencies: 465 | debug: 2.6.9 466 | encodeurl: 1.0.2 467 | escape-html: 1.0.3 468 | on-finished: 2.3.0 469 | parseurl: 1.3.3 470 | statuses: 1.5.0 471 | unpipe: 1.0.0 472 | dev: false 473 | engines: 474 | node: '>= 0.8' 475 | resolution: 476 | integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 477 | /forwarded/0.1.2: 478 | dev: false 479 | engines: 480 | node: '>= 0.6' 481 | resolution: 482 | integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 483 | /fresh/0.5.2: 484 | dev: false 485 | engines: 486 | node: '>= 0.6' 487 | resolution: 488 | integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 489 | /fsevents/2.3.2: 490 | dev: true 491 | engines: 492 | node: ^8.16.0 || ^10.6.0 || >=11.0.0 493 | optional: true 494 | os: 495 | - darwin 496 | resolution: 497 | integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 498 | /function-bind/1.1.1: 499 | dev: false 500 | resolution: 501 | integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 502 | /get-intrinsic/1.1.1: 503 | dependencies: 504 | function-bind: 1.1.1 505 | has: 1.0.3 506 | has-symbols: 1.0.2 507 | dev: false 508 | resolution: 509 | integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 510 | /get-stream/4.1.0: 511 | dependencies: 512 | pump: 3.0.0 513 | dev: true 514 | engines: 515 | node: '>=6' 516 | resolution: 517 | integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 518 | /get-stream/5.2.0: 519 | dependencies: 520 | pump: 3.0.0 521 | dev: true 522 | engines: 523 | node: '>=8' 524 | resolution: 525 | integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 526 | /glob-parent/5.1.2: 527 | dependencies: 528 | is-glob: 4.0.1 529 | dev: true 530 | engines: 531 | node: '>= 6' 532 | resolution: 533 | integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 534 | /global-dirs/2.1.0: 535 | dependencies: 536 | ini: 1.3.7 537 | dev: true 538 | engines: 539 | node: '>=8' 540 | resolution: 541 | integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== 542 | /got/9.6.0: 543 | dependencies: 544 | '@sindresorhus/is': 0.14.0 545 | '@szmarczak/http-timer': 1.1.2 546 | cacheable-request: 6.1.0 547 | decompress-response: 3.3.0 548 | duplexer3: 0.1.4 549 | get-stream: 4.1.0 550 | lowercase-keys: 1.0.1 551 | mimic-response: 1.0.1 552 | p-cancelable: 1.1.0 553 | to-readable-stream: 1.0.0 554 | url-parse-lax: 3.0.0 555 | dev: true 556 | engines: 557 | node: '>=8.6' 558 | resolution: 559 | integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 560 | /graceful-fs/4.2.6: 561 | dev: true 562 | resolution: 563 | integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== 564 | /has-flag/3.0.0: 565 | dev: true 566 | engines: 567 | node: '>=4' 568 | resolution: 569 | integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 570 | /has-flag/4.0.0: 571 | dev: true 572 | engines: 573 | node: '>=8' 574 | resolution: 575 | integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 576 | /has-symbols/1.0.2: 577 | dev: false 578 | engines: 579 | node: '>= 0.4' 580 | resolution: 581 | integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 582 | /has-yarn/2.1.0: 583 | dev: true 584 | engines: 585 | node: '>=8' 586 | resolution: 587 | integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 588 | /has/1.0.3: 589 | dependencies: 590 | function-bind: 1.1.1 591 | dev: false 592 | engines: 593 | node: '>= 0.4.0' 594 | resolution: 595 | integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 596 | /http-cache-semantics/4.1.0: 597 | dev: true 598 | resolution: 599 | integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 600 | /http-errors/1.7.2: 601 | dependencies: 602 | depd: 1.1.2 603 | inherits: 2.0.3 604 | setprototypeof: 1.1.1 605 | statuses: 1.5.0 606 | toidentifier: 1.0.0 607 | dev: false 608 | engines: 609 | node: '>= 0.6' 610 | resolution: 611 | integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 612 | /http-errors/1.7.3: 613 | dependencies: 614 | depd: 1.1.2 615 | inherits: 2.0.4 616 | setprototypeof: 1.1.1 617 | statuses: 1.5.0 618 | toidentifier: 1.0.0 619 | dev: false 620 | engines: 621 | node: '>= 0.6' 622 | resolution: 623 | integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 624 | /iconv-lite/0.4.24: 625 | dependencies: 626 | safer-buffer: 2.1.2 627 | dev: false 628 | engines: 629 | node: '>=0.10.0' 630 | resolution: 631 | integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 632 | /ignore-by-default/1.0.1: 633 | dev: true 634 | resolution: 635 | integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 636 | /import-lazy/2.1.0: 637 | dev: true 638 | engines: 639 | node: '>=4' 640 | resolution: 641 | integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 642 | /imurmurhash/0.1.4: 643 | dev: true 644 | engines: 645 | node: '>=0.8.19' 646 | resolution: 647 | integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= 648 | /inherits/2.0.3: 649 | dev: false 650 | resolution: 651 | integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 652 | /inherits/2.0.4: 653 | dev: false 654 | resolution: 655 | integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 656 | /ini/1.3.7: 657 | dev: true 658 | resolution: 659 | integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== 660 | /ini/1.3.8: 661 | dev: true 662 | resolution: 663 | integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 664 | /ipaddr.js/1.9.1: 665 | dev: false 666 | engines: 667 | node: '>= 0.10' 668 | resolution: 669 | integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 670 | /is-binary-path/2.1.0: 671 | dependencies: 672 | binary-extensions: 2.2.0 673 | dev: true 674 | engines: 675 | node: '>=8' 676 | resolution: 677 | integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 678 | /is-ci/2.0.0: 679 | dependencies: 680 | ci-info: 2.0.0 681 | dev: true 682 | hasBin: true 683 | resolution: 684 | integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 685 | /is-core-module/2.2.0: 686 | dependencies: 687 | has: 1.0.3 688 | dev: false 689 | resolution: 690 | integrity: sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== 691 | /is-expression/4.0.0: 692 | dependencies: 693 | acorn: 7.4.1 694 | object-assign: 4.1.1 695 | dev: false 696 | resolution: 697 | integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== 698 | /is-extglob/2.1.1: 699 | dev: true 700 | engines: 701 | node: '>=0.10.0' 702 | resolution: 703 | integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 704 | /is-fullwidth-code-point/2.0.0: 705 | dev: true 706 | engines: 707 | node: '>=4' 708 | resolution: 709 | integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 710 | /is-fullwidth-code-point/3.0.0: 711 | dev: true 712 | engines: 713 | node: '>=8' 714 | resolution: 715 | integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 716 | /is-glob/4.0.1: 717 | dependencies: 718 | is-extglob: 2.1.1 719 | dev: true 720 | engines: 721 | node: '>=0.10.0' 722 | resolution: 723 | integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 724 | /is-installed-globally/0.3.2: 725 | dependencies: 726 | global-dirs: 2.1.0 727 | is-path-inside: 3.0.3 728 | dev: true 729 | engines: 730 | node: '>=8' 731 | resolution: 732 | integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== 733 | /is-npm/4.0.0: 734 | dev: true 735 | engines: 736 | node: '>=8' 737 | resolution: 738 | integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== 739 | /is-number/7.0.0: 740 | dev: true 741 | engines: 742 | node: '>=0.12.0' 743 | resolution: 744 | integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 745 | /is-obj/2.0.0: 746 | dev: true 747 | engines: 748 | node: '>=8' 749 | resolution: 750 | integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 751 | /is-path-inside/3.0.3: 752 | dev: true 753 | engines: 754 | node: '>=8' 755 | resolution: 756 | integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 757 | /is-promise/2.2.2: 758 | dev: false 759 | resolution: 760 | integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== 761 | /is-regex/1.1.2: 762 | dependencies: 763 | call-bind: 1.0.2 764 | has-symbols: 1.0.2 765 | dev: false 766 | engines: 767 | node: '>= 0.4' 768 | resolution: 769 | integrity: sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== 770 | /is-typedarray/1.0.0: 771 | dev: true 772 | resolution: 773 | integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 774 | /is-yarn-global/0.3.0: 775 | dev: true 776 | resolution: 777 | integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 778 | /js-stringify/1.0.2: 779 | dev: false 780 | resolution: 781 | integrity: sha1-Fzb939lyTyijaCrcYjCufk6Weds= 782 | /json-buffer/3.0.0: 783 | dev: true 784 | resolution: 785 | integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 786 | /jstransformer/1.0.0: 787 | dependencies: 788 | is-promise: 2.2.2 789 | promise: 7.3.1 790 | dev: false 791 | resolution: 792 | integrity: sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= 793 | /keyv/3.1.0: 794 | dependencies: 795 | json-buffer: 3.0.0 796 | dev: true 797 | resolution: 798 | integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 799 | /latest-version/5.1.0: 800 | dependencies: 801 | package-json: 6.5.0 802 | dev: true 803 | engines: 804 | node: '>=8' 805 | resolution: 806 | integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 807 | /lodash/4.17.21: 808 | dev: false 809 | resolution: 810 | integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 811 | /lowercase-keys/1.0.1: 812 | dev: true 813 | engines: 814 | node: '>=0.10.0' 815 | resolution: 816 | integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 817 | /lowercase-keys/2.0.0: 818 | dev: true 819 | engines: 820 | node: '>=8' 821 | resolution: 822 | integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 823 | /make-dir/3.1.0: 824 | dependencies: 825 | semver: 6.3.0 826 | dev: true 827 | engines: 828 | node: '>=8' 829 | resolution: 830 | integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 831 | /media-typer/0.3.0: 832 | dev: false 833 | engines: 834 | node: '>= 0.6' 835 | resolution: 836 | integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 837 | /merge-descriptors/1.0.1: 838 | dev: false 839 | resolution: 840 | integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 841 | /methods/1.1.2: 842 | dev: false 843 | engines: 844 | node: '>= 0.6' 845 | resolution: 846 | integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 847 | /mime-db/1.46.0: 848 | dev: false 849 | engines: 850 | node: '>= 0.6' 851 | resolution: 852 | integrity: sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== 853 | /mime-types/2.1.29: 854 | dependencies: 855 | mime-db: 1.46.0 856 | dev: false 857 | engines: 858 | node: '>= 0.6' 859 | resolution: 860 | integrity: sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== 861 | /mime/1.6.0: 862 | dev: false 863 | engines: 864 | node: '>=4' 865 | hasBin: true 866 | resolution: 867 | integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 868 | /mimic-response/1.0.1: 869 | dev: true 870 | engines: 871 | node: '>=4' 872 | resolution: 873 | integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 874 | /minimatch/3.0.4: 875 | dependencies: 876 | brace-expansion: 1.1.11 877 | dev: true 878 | resolution: 879 | integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 880 | /minimist/1.2.5: 881 | dev: true 882 | resolution: 883 | integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 884 | /ms/2.0.0: 885 | resolution: 886 | integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 887 | /ms/2.1.1: 888 | dev: false 889 | resolution: 890 | integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 891 | /ms/2.1.3: 892 | dev: true 893 | resolution: 894 | integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 895 | /negotiator/0.6.2: 896 | dev: false 897 | engines: 898 | node: '>= 0.6' 899 | resolution: 900 | integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 901 | /nodemon/2.0.7: 902 | dependencies: 903 | chokidar: 3.5.1 904 | debug: 3.2.7 905 | ignore-by-default: 1.0.1 906 | minimatch: 3.0.4 907 | pstree.remy: 1.1.8 908 | semver: 5.7.1 909 | supports-color: 5.5.0 910 | touch: 3.1.0 911 | undefsafe: 2.0.3 912 | update-notifier: 4.1.3 913 | dev: true 914 | engines: 915 | node: '>=8.10.0' 916 | hasBin: true 917 | requiresBuild: true 918 | resolution: 919 | integrity: sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA== 920 | /nopt/1.0.10: 921 | dependencies: 922 | abbrev: 1.1.1 923 | dev: true 924 | hasBin: true 925 | resolution: 926 | integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 927 | /normalize-path/3.0.0: 928 | dev: true 929 | engines: 930 | node: '>=0.10.0' 931 | resolution: 932 | integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 933 | /normalize-url/4.5.0: 934 | dev: true 935 | engines: 936 | node: '>=8' 937 | resolution: 938 | integrity: sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== 939 | /object-assign/4.1.1: 940 | dev: false 941 | engines: 942 | node: '>=0.10.0' 943 | resolution: 944 | integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 945 | /on-finished/2.3.0: 946 | dependencies: 947 | ee-first: 1.1.1 948 | dev: false 949 | engines: 950 | node: '>= 0.8' 951 | resolution: 952 | integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 953 | /once/1.4.0: 954 | dependencies: 955 | wrappy: 1.0.2 956 | dev: true 957 | resolution: 958 | integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 959 | /p-cancelable/1.1.0: 960 | dev: true 961 | engines: 962 | node: '>=6' 963 | resolution: 964 | integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 965 | /package-json/6.5.0: 966 | dependencies: 967 | got: 9.6.0 968 | registry-auth-token: 4.2.1 969 | registry-url: 5.1.0 970 | semver: 6.3.0 971 | dev: true 972 | engines: 973 | node: '>=8' 974 | resolution: 975 | integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 976 | /parseurl/1.3.3: 977 | dev: false 978 | engines: 979 | node: '>= 0.8' 980 | resolution: 981 | integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 982 | /path-parse/1.0.6: 983 | dev: false 984 | resolution: 985 | integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 986 | /path-to-regexp/0.1.7: 987 | dev: false 988 | resolution: 989 | integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 990 | /picomatch/2.2.2: 991 | dev: true 992 | engines: 993 | node: '>=8.6' 994 | resolution: 995 | integrity: sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 996 | /prepend-http/2.0.0: 997 | dev: true 998 | engines: 999 | node: '>=4' 1000 | resolution: 1001 | integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 1002 | /promise/7.3.1: 1003 | dependencies: 1004 | asap: 2.0.6 1005 | dev: false 1006 | resolution: 1007 | integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== 1008 | /proxy-addr/2.0.6: 1009 | dependencies: 1010 | forwarded: 0.1.2 1011 | ipaddr.js: 1.9.1 1012 | dev: false 1013 | engines: 1014 | node: '>= 0.10' 1015 | resolution: 1016 | integrity: sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 1017 | /pstree.remy/1.1.8: 1018 | dev: true 1019 | resolution: 1020 | integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 1021 | /pug-attrs/3.0.0: 1022 | dependencies: 1023 | constantinople: 4.0.1 1024 | js-stringify: 1.0.2 1025 | pug-runtime: 3.0.1 1026 | dev: false 1027 | resolution: 1028 | integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== 1029 | /pug-code-gen/3.0.2: 1030 | dependencies: 1031 | constantinople: 4.0.1 1032 | doctypes: 1.1.0 1033 | js-stringify: 1.0.2 1034 | pug-attrs: 3.0.0 1035 | pug-error: 2.0.0 1036 | pug-runtime: 3.0.1 1037 | void-elements: 3.1.0 1038 | with: 7.0.2 1039 | dev: false 1040 | resolution: 1041 | integrity: sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg== 1042 | /pug-error/2.0.0: 1043 | dev: false 1044 | resolution: 1045 | integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== 1046 | /pug-filters/4.0.0: 1047 | dependencies: 1048 | constantinople: 4.0.1 1049 | jstransformer: 1.0.0 1050 | pug-error: 2.0.0 1051 | pug-walk: 2.0.0 1052 | resolve: 1.20.0 1053 | dev: false 1054 | resolution: 1055 | integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== 1056 | /pug-lexer/5.0.1: 1057 | dependencies: 1058 | character-parser: 2.2.0 1059 | is-expression: 4.0.0 1060 | pug-error: 2.0.0 1061 | dev: false 1062 | resolution: 1063 | integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== 1064 | /pug-linker/4.0.0: 1065 | dependencies: 1066 | pug-error: 2.0.0 1067 | pug-walk: 2.0.0 1068 | dev: false 1069 | resolution: 1070 | integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== 1071 | /pug-load/3.0.0: 1072 | dependencies: 1073 | object-assign: 4.1.1 1074 | pug-walk: 2.0.0 1075 | dev: false 1076 | resolution: 1077 | integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== 1078 | /pug-parser/6.0.0: 1079 | dependencies: 1080 | pug-error: 2.0.0 1081 | token-stream: 1.0.0 1082 | dev: false 1083 | resolution: 1084 | integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== 1085 | /pug-runtime/3.0.1: 1086 | dev: false 1087 | resolution: 1088 | integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== 1089 | /pug-strip-comments/2.0.0: 1090 | dependencies: 1091 | pug-error: 2.0.0 1092 | dev: false 1093 | resolution: 1094 | integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== 1095 | /pug-walk/2.0.0: 1096 | dev: false 1097 | resolution: 1098 | integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== 1099 | /pug/3.0.2: 1100 | dependencies: 1101 | pug-code-gen: 3.0.2 1102 | pug-filters: 4.0.0 1103 | pug-lexer: 5.0.1 1104 | pug-linker: 4.0.0 1105 | pug-load: 3.0.0 1106 | pug-parser: 6.0.0 1107 | pug-runtime: 3.0.1 1108 | pug-strip-comments: 2.0.0 1109 | dev: false 1110 | resolution: 1111 | integrity: sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw== 1112 | /pump/3.0.0: 1113 | dependencies: 1114 | end-of-stream: 1.4.4 1115 | once: 1.4.0 1116 | dev: true 1117 | resolution: 1118 | integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1119 | /pupa/2.1.1: 1120 | dependencies: 1121 | escape-goat: 2.1.1 1122 | dev: true 1123 | engines: 1124 | node: '>=8' 1125 | resolution: 1126 | integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== 1127 | /qs/6.7.0: 1128 | dev: false 1129 | engines: 1130 | node: '>=0.6' 1131 | resolution: 1132 | integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1133 | /range-parser/1.2.1: 1134 | dev: false 1135 | engines: 1136 | node: '>= 0.6' 1137 | resolution: 1138 | integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1139 | /raw-body/2.4.0: 1140 | dependencies: 1141 | bytes: 3.1.0 1142 | http-errors: 1.7.2 1143 | iconv-lite: 0.4.24 1144 | unpipe: 1.0.0 1145 | dev: false 1146 | engines: 1147 | node: '>= 0.8' 1148 | resolution: 1149 | integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1150 | /rc/1.2.8: 1151 | dependencies: 1152 | deep-extend: 0.6.0 1153 | ini: 1.3.8 1154 | minimist: 1.2.5 1155 | strip-json-comments: 2.0.1 1156 | dev: true 1157 | hasBin: true 1158 | resolution: 1159 | integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1160 | /readdirp/3.5.0: 1161 | dependencies: 1162 | picomatch: 2.2.2 1163 | dev: true 1164 | engines: 1165 | node: '>=8.10.0' 1166 | resolution: 1167 | integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 1168 | /registry-auth-token/4.2.1: 1169 | dependencies: 1170 | rc: 1.2.8 1171 | dev: true 1172 | engines: 1173 | node: '>=6.0.0' 1174 | resolution: 1175 | integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== 1176 | /registry-url/5.1.0: 1177 | dependencies: 1178 | rc: 1.2.8 1179 | dev: true 1180 | engines: 1181 | node: '>=8' 1182 | resolution: 1183 | integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 1184 | /resolve/1.20.0: 1185 | dependencies: 1186 | is-core-module: 2.2.0 1187 | path-parse: 1.0.6 1188 | dev: false 1189 | resolution: 1190 | integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 1191 | /responselike/1.0.2: 1192 | dependencies: 1193 | lowercase-keys: 1.0.1 1194 | dev: true 1195 | resolution: 1196 | integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 1197 | /safe-buffer/5.1.2: 1198 | dev: false 1199 | resolution: 1200 | integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1201 | /safer-buffer/2.1.2: 1202 | dev: false 1203 | resolution: 1204 | integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1205 | /semver-diff/3.1.1: 1206 | dependencies: 1207 | semver: 6.3.0 1208 | dev: true 1209 | engines: 1210 | node: '>=8' 1211 | resolution: 1212 | integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 1213 | /semver/5.7.1: 1214 | dev: true 1215 | hasBin: true 1216 | resolution: 1217 | integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1218 | /semver/6.3.0: 1219 | dev: true 1220 | hasBin: true 1221 | resolution: 1222 | integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1223 | /send/0.17.1: 1224 | dependencies: 1225 | debug: 2.6.9 1226 | depd: 1.1.2 1227 | destroy: 1.0.4 1228 | encodeurl: 1.0.2 1229 | escape-html: 1.0.3 1230 | etag: 1.8.1 1231 | fresh: 0.5.2 1232 | http-errors: 1.7.3 1233 | mime: 1.6.0 1234 | ms: 2.1.1 1235 | on-finished: 2.3.0 1236 | range-parser: 1.2.1 1237 | statuses: 1.5.0 1238 | dev: false 1239 | engines: 1240 | node: '>= 0.8.0' 1241 | resolution: 1242 | integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 1243 | /serve-static/1.14.1: 1244 | dependencies: 1245 | encodeurl: 1.0.2 1246 | escape-html: 1.0.3 1247 | parseurl: 1.3.3 1248 | send: 0.17.1 1249 | dev: false 1250 | engines: 1251 | node: '>= 0.8.0' 1252 | resolution: 1253 | integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 1254 | /setprototypeof/1.1.1: 1255 | dev: false 1256 | resolution: 1257 | integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1258 | /signal-exit/3.0.3: 1259 | dev: true 1260 | resolution: 1261 | integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1262 | /statuses/1.5.0: 1263 | dev: false 1264 | engines: 1265 | node: '>= 0.6' 1266 | resolution: 1267 | integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1268 | /string-width/3.1.0: 1269 | dependencies: 1270 | emoji-regex: 7.0.3 1271 | is-fullwidth-code-point: 2.0.0 1272 | strip-ansi: 5.2.0 1273 | dev: true 1274 | engines: 1275 | node: '>=6' 1276 | resolution: 1277 | integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1278 | /string-width/4.2.2: 1279 | dependencies: 1280 | emoji-regex: 8.0.0 1281 | is-fullwidth-code-point: 3.0.0 1282 | strip-ansi: 6.0.0 1283 | dev: true 1284 | engines: 1285 | node: '>=8' 1286 | resolution: 1287 | integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 1288 | /strip-ansi/5.2.0: 1289 | dependencies: 1290 | ansi-regex: 4.1.0 1291 | dev: true 1292 | engines: 1293 | node: '>=6' 1294 | resolution: 1295 | integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1296 | /strip-ansi/6.0.0: 1297 | dependencies: 1298 | ansi-regex: 5.0.0 1299 | dev: true 1300 | engines: 1301 | node: '>=8' 1302 | resolution: 1303 | integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1304 | /strip-json-comments/2.0.1: 1305 | dev: true 1306 | engines: 1307 | node: '>=0.10.0' 1308 | resolution: 1309 | integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1310 | /supports-color/5.5.0: 1311 | dependencies: 1312 | has-flag: 3.0.0 1313 | dev: true 1314 | engines: 1315 | node: '>=4' 1316 | resolution: 1317 | integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1318 | /supports-color/7.2.0: 1319 | dependencies: 1320 | has-flag: 4.0.0 1321 | dev: true 1322 | engines: 1323 | node: '>=8' 1324 | resolution: 1325 | integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1326 | /term-size/2.2.1: 1327 | dev: true 1328 | engines: 1329 | node: '>=8' 1330 | resolution: 1331 | integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== 1332 | /to-fast-properties/2.0.0: 1333 | dev: false 1334 | engines: 1335 | node: '>=4' 1336 | resolution: 1337 | integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 1338 | /to-readable-stream/1.0.0: 1339 | dev: true 1340 | engines: 1341 | node: '>=6' 1342 | resolution: 1343 | integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 1344 | /to-regex-range/5.0.1: 1345 | dependencies: 1346 | is-number: 7.0.0 1347 | dev: true 1348 | engines: 1349 | node: '>=8.0' 1350 | resolution: 1351 | integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1352 | /todomvc-app-css/2.3.0: 1353 | dev: false 1354 | resolution: 1355 | integrity: sha512-RG8hxqoVn8Be3wxyuyHfOSAXiY1Z0N+PYQOe/jxzy3wpU1Obfwd1RF1i/fz/fR+MrYL+Q+BdrUt8SsXdtR7Oow== 1356 | /todomvc-common/1.0.5: 1357 | dev: false 1358 | resolution: 1359 | integrity: sha512-D8kEJmxVMQIWwztEdH+WeiAfXRbbSCpgXq4NkYi+gduJ2tr8CNq7sYLfJvjpQ10KD9QxJwig57rvMbV2QAESwQ== 1360 | /toidentifier/1.0.0: 1361 | dev: false 1362 | engines: 1363 | node: '>=0.6' 1364 | resolution: 1365 | integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1366 | /token-stream/1.0.0: 1367 | dev: false 1368 | resolution: 1369 | integrity: sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= 1370 | /touch/3.1.0: 1371 | dependencies: 1372 | nopt: 1.0.10 1373 | dev: true 1374 | hasBin: true 1375 | resolution: 1376 | integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 1377 | /type-fest/0.8.1: 1378 | dev: true 1379 | engines: 1380 | node: '>=8' 1381 | resolution: 1382 | integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1383 | /type-is/1.6.18: 1384 | dependencies: 1385 | media-typer: 0.3.0 1386 | mime-types: 2.1.29 1387 | dev: false 1388 | engines: 1389 | node: '>= 0.6' 1390 | resolution: 1391 | integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1392 | /typedarray-to-buffer/3.1.5: 1393 | dependencies: 1394 | is-typedarray: 1.0.0 1395 | dev: true 1396 | resolution: 1397 | integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1398 | /undefsafe/2.0.3: 1399 | dependencies: 1400 | debug: 2.6.9 1401 | dev: true 1402 | resolution: 1403 | integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== 1404 | /unique-string/2.0.0: 1405 | dependencies: 1406 | crypto-random-string: 2.0.0 1407 | dev: true 1408 | engines: 1409 | node: '>=8' 1410 | resolution: 1411 | integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1412 | /unpipe/1.0.0: 1413 | dev: false 1414 | engines: 1415 | node: '>= 0.8' 1416 | resolution: 1417 | integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1418 | /update-notifier/4.1.3: 1419 | dependencies: 1420 | boxen: 4.2.0 1421 | chalk: 3.0.0 1422 | configstore: 5.0.1 1423 | has-yarn: 2.1.0 1424 | import-lazy: 2.1.0 1425 | is-ci: 2.0.0 1426 | is-installed-globally: 0.3.2 1427 | is-npm: 4.0.0 1428 | is-yarn-global: 0.3.0 1429 | latest-version: 5.1.0 1430 | pupa: 2.1.1 1431 | semver-diff: 3.1.1 1432 | xdg-basedir: 4.0.0 1433 | dev: true 1434 | engines: 1435 | node: '>=8' 1436 | resolution: 1437 | integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== 1438 | /url-parse-lax/3.0.0: 1439 | dependencies: 1440 | prepend-http: 2.0.0 1441 | dev: true 1442 | engines: 1443 | node: '>=4' 1444 | resolution: 1445 | integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 1446 | /utils-merge/1.0.1: 1447 | dev: false 1448 | engines: 1449 | node: '>= 0.4.0' 1450 | resolution: 1451 | integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1452 | /uuid/8.3.2: 1453 | dev: false 1454 | hasBin: true 1455 | resolution: 1456 | integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 1457 | /vary/1.1.2: 1458 | dev: false 1459 | engines: 1460 | node: '>= 0.8' 1461 | resolution: 1462 | integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1463 | /void-elements/3.1.0: 1464 | dev: false 1465 | engines: 1466 | node: '>=0.10.0' 1467 | resolution: 1468 | integrity: sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= 1469 | /widest-line/3.1.0: 1470 | dependencies: 1471 | string-width: 4.2.2 1472 | dev: true 1473 | engines: 1474 | node: '>=8' 1475 | resolution: 1476 | integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 1477 | /with/7.0.2: 1478 | dependencies: 1479 | '@babel/parser': 7.13.11 1480 | '@babel/types': 7.13.0 1481 | assert-never: 1.2.1 1482 | babel-walk: 3.0.0-canary-5 1483 | dev: false 1484 | engines: 1485 | node: '>= 10.0.0' 1486 | resolution: 1487 | integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== 1488 | /wrappy/1.0.2: 1489 | dev: true 1490 | resolution: 1491 | integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1492 | /write-file-atomic/3.0.3: 1493 | dependencies: 1494 | imurmurhash: 0.1.4 1495 | is-typedarray: 1.0.0 1496 | signal-exit: 3.0.3 1497 | typedarray-to-buffer: 3.1.5 1498 | dev: true 1499 | resolution: 1500 | integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1501 | /xdg-basedir/4.0.0: 1502 | dev: true 1503 | engines: 1504 | node: '>=8' 1505 | resolution: 1506 | integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1507 | specifiers: 1508 | body-parser: ^1.19.0 1509 | express: ^4.17.1 1510 | nodemon: ^2.0.7 1511 | pug: ^3.0.2 1512 | todomvc-app-css: ^2.0.0 1513 | todomvc-common: ^1.0.0 1514 | uuid: ^8.3.2 1515 | --------------------------------------------------------------------------------