├── .gitattributes ├── .gitignore ├── README.md ├── app.js ├── cypress.json ├── cypress ├── fixtures │ ├── fiveTodos.json │ ├── threeTodos.json │ └── twoTodos.json └── integration │ ├── 01-using-should.js │ ├── 02-using-then.js │ ├── 03-using-each.js │ ├── 04-first-position-fail.js │ ├── 05-first-position-pass.js │ └── 06-using-should-function.js ├── data.json ├── img ├── dragndrop.gif ├── login.png └── signup.png ├── index.html ├── json-server.json ├── middleware.js ├── package-lock.json ├── package.json └── vendor ├── Sortable.min.js ├── axios.min.js ├── cypress-icon.png ├── index.css ├── polyfill.min.js ├── vue-observe-visibility.min.js ├── vue-router.js ├── vue.js └── vuex.js /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # todomvc-expanded 2 | Expanded todomvc with login, signup and drag and drop 3 | 4 | Simple todoMVC app build with Vue.js, originally forked from [testing-workshop-cypress](https://github.com/cypress-io/testing-workshop-cypress). I expanded the appliaction and added a couple of features. 5 | 6 | ## Features 7 | ### drag & drop 8 | Reorder todos in list. 9 | TBD: make sure the reorder keeps it’s state after refresh 🙂 10 | ![Drag and drop](/img/dragndrop.gif "Drag and drop") 11 | 12 | ### signup page 13 | Signup page with ability to send a real welcome email. Using [sendmail](https://www.npmjs.com/package/sendmail) to do that. Signups are stored in data.json, in plain text. So, yeah. 14 | ![Signup](/img/signup.png "Signup") 15 | 16 | ### login page 17 | Works with previously signed up emails. Server returns an auth cookie in form of auth=true, LOL 😆 18 | ![Login](/img/login.png "Login") 19 | 20 | ## api 21 | Backend is a json-server on a static json file. Middleware handles couple of cases. Some of these are: 22 | 23 | ### POST /reset 24 | Deletes all todos and all accounts, that were created on signup page. 25 | 26 | ### DELETE /todos 27 | Deletes all todos 28 | 29 | ### DELETE /accounts 30 | Deletes all accounts, created on signup page 31 | 32 | ## Installation 33 | 1. `npm i` 34 | 2. `npm start` 35 | 36 | App runs on localhost:3000 by default. -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | /* global Vue, Vuex, axios, VueRouter, Sortable */ 2 | /* eslint-disable no-console */ 3 | (function () { 4 | Vue.use(Vuex); 5 | 6 | function randomId () { 7 | return Math.random() 8 | .toString() 9 | .substr(2, 10); 10 | } 11 | 12 | const store = new Vuex.Store({ 13 | state: { 14 | loading: true, 15 | sendEmail: false, 16 | todos: [], 17 | newTodo: '', 18 | email: '', 19 | password: '', 20 | errorMessage: { 21 | show: false, 22 | text: '' 23 | }, 24 | loggedIn: false, 25 | }, 26 | getters: { 27 | newTodo: state => state.newTodo, 28 | todos: state => state.todos, 29 | loading: state => state.loading, 30 | errorMessage: state => state.errorMessage, 31 | loggedIn: state => state.loggedIn, 32 | email: state => state.email, 33 | password: state => state.password, 34 | sendEmail: state => state.sendEmail 35 | }, 36 | mutations: { 37 | SET_LOADING (state, flag) { 38 | state.loading = flag; 39 | }, 40 | SHOW_ERROR (state) { 41 | state.errorMessage.show = true; 42 | setTimeout(() => { 43 | state.errorMessage.show = false; 44 | }, 4000); 45 | }, 46 | ERROR_MESSAGE ( state, message ) { 47 | state.errorMessage.text = message; 48 | }, 49 | LOGGED_IN_MESSAGE (state) { 50 | state.loggedIn = true; 51 | setTimeout(() => { 52 | state.loggedIn = false; 53 | }, 4000); 54 | }, 55 | SIGNED_UP_MESSAGE (state) { 56 | state.signedUp = true; 57 | setTimeout(() => { 58 | state.signedUp = false; 59 | }, 4000); 60 | }, 61 | SET_TODOS (state, todos) { 62 | state.todos = todos; 63 | }, 64 | SET_NEW_TODO (state, todo) { 65 | state.newTodo = todo; 66 | }, 67 | ADD_TODO (state, todoObject) { 68 | console.log('add todo', todoObject); 69 | state.todos.push(todoObject); 70 | }, 71 | COMPLETE_TODO (todo) { 72 | console.log('complete todo ' + todo.id); 73 | }, 74 | REMOVE_TODO (state, todo) { 75 | let todos = state.todos; 76 | console.log('removing todo'); 77 | todos.splice(todos.indexOf(todo), 1); 78 | }, 79 | CLEAR_NEW_TODO (state) { 80 | state.newTodo = ''; 81 | console.log('clearing new todo'); 82 | }, 83 | SET_EMAIL (state, email) { 84 | state.email = email; 85 | }, 86 | SET_PASSWORD (state, password) { 87 | state.password = password; 88 | }, 89 | SEND_EMAIL_FLAG (state, flag) { 90 | console.log('I’m doing something'); 91 | state.sendEmail = flag; 92 | } 93 | }, 94 | actions: { 95 | loadTodos ({ commit }) { 96 | commit('SET_LOADING', true); 97 | 98 | axios 99 | .get('/todos') 100 | .then(r => r.data) 101 | .then(todos => { 102 | console.log('got %d todos', todos.length); 103 | commit('SET_TODOS', todos); 104 | commit('SET_LOADING', false); 105 | }) 106 | .catch(e => { 107 | console.error('could not load todos'); 108 | console.error(e.message); 109 | console.error(e.response.data); 110 | }); 111 | }, 112 | setNewTodo ({ commit }, todo) { 113 | commit('SET_NEW_TODO', todo); 114 | }, 115 | addTodo ({ commit, state }) { 116 | if (!state.newTodo) { 117 | // do not add empty todos 118 | return; 119 | } 120 | const todo = { 121 | title: state.newTodo, 122 | completed: false, 123 | id: randomId() 124 | }; 125 | axios.post('/todos', todo).then(() => { 126 | commit('ADD_TODO', todo); 127 | }).catch( () => { 128 | commit('SHOW_ERROR'); 129 | commit('ERROR_MESSAGE', 'Sorry. There was an error creating todo item.'); 130 | }); 131 | }, 132 | completeTodo ({ commit }, todo) { 133 | axios.patch(`/todos/${todo.id}`, {completed: !todo.completed}); 134 | commit('COMPLETE_TODO'); 135 | }, 136 | removeTodo ({ commit }, todo) { 137 | axios.delete(`/todos/${todo.id}`).then(() => { 138 | console.log('removed todo', todo.id, 'from the server'); 139 | commit('REMOVE_TODO', todo); 140 | }); 141 | }, 142 | clearNewTodo ({ commit }) { 143 | commit('CLEAR_NEW_TODO'); 144 | }, 145 | setEmail ({ commit }, email) { 146 | commit('SET_EMAIL', email); 147 | }, 148 | setPassword ({ commit }, password) { 149 | commit('SET_PASSWORD', password); 150 | }, 151 | login ({ commit, state }) { 152 | const credentials = { 153 | email: state.email, 154 | password: state.password 155 | }; 156 | axios.post('/login', credentials ).then(() => { 157 | commit('LOGGED_IN_MESSAGE'); 158 | router.push({ path: '/' }); 159 | }).catch( () => { 160 | commit('SHOW_ERROR'); 161 | commit('ERROR_MESSAGE', 'Wrong email or password'); 162 | }); 163 | }, 164 | loggedIn ({ commit }) { 165 | commit('LOGGED_IN_MESSAGE'); 166 | }, 167 | signup ({ commit, state }) { 168 | const credentials = { 169 | email: state.email, 170 | password: state.password 171 | }; 172 | const emailFlag = state.sendEmail; 173 | axios({ 174 | method: 'POST', 175 | url: '/signup', 176 | data: credentials, 177 | headers: { 178 | sendWelcomeEmail: emailFlag 179 | } 180 | }).then(() => { 181 | commit('LOGGED_IN_MESSAGE'); 182 | router.push({ path: '/' }); 183 | }).catch( () => { 184 | commit('SHOW_ERROR'); 185 | commit('ERROR_MESSAGE', 'Could not sign up'); 186 | }); 187 | }, 188 | sendEmailFlag({ commit }, checked) { 189 | commit('SEND_EMAIL_FLAG', checked); 190 | } 191 | } 192 | }); 193 | 194 | const login = Vue.component('login', { 195 | template: '#login', 196 | computed: { 197 | email () { 198 | return this.$store.getters.email; 199 | }, 200 | password () { 201 | return this.$store.getters.password; 202 | } 203 | }, 204 | methods: { 205 | setEmail (e) { 206 | this.$store.dispatch('setEmail', e.target.value); 207 | }, 208 | setPassword (e) { 209 | this.$store.dispatch('setPassword', e.target.value); 210 | }, 211 | loginSend () { 212 | this.$store.dispatch('login'); 213 | } 214 | } 215 | }); 216 | 217 | const signup = Vue.component('signup', { 218 | template: '#signup', 219 | computed: { 220 | email () { 221 | return this.$store.getters.email; 222 | }, 223 | password () { 224 | return this.$store.getters.password; 225 | }, 226 | sendEmail () { 227 | return this.$store.getters.sendEmail; 228 | } 229 | }, 230 | methods: { 231 | setEmail (e) { 232 | this.$store.dispatch('setEmail', e.target.value); 233 | }, 234 | setPassword (e) { 235 | this.$store.dispatch('setPassword', e.target.value); 236 | }, 237 | signupSend () { 238 | this.$store.dispatch('signup'); 239 | }, 240 | sendEmailFlag (e) { 241 | this.$store.dispatch('sendEmailFlag', e.target.checked); 242 | } 243 | } 244 | }); 245 | 246 | const todoapp = Vue.component('todoapp-template', { 247 | template: '#todoapp-template', 248 | data() { 249 | return { 250 | showByIndex: null 251 | }; 252 | }, 253 | created () { 254 | this.$store.dispatch('loadTodos'); 255 | }, 256 | computed: { 257 | loading () { 258 | return this.$store.getters.loading; 259 | }, 260 | newTodo () { 261 | return this.$store.getters.newTodo; 262 | }, 263 | todos () { 264 | return this.$store.getters.todos; 265 | } 266 | }, 267 | methods: { 268 | setNewTodo (e) { 269 | this.$store.dispatch('setNewTodo', e.target.value); 270 | }, 271 | addTodo (e) { 272 | e.target.value = ''; 273 | this.$store.dispatch('addTodo'); 274 | this.$store.dispatch('clearNewTodo'); 275 | }, 276 | completeTodo (todo) { 277 | this.$store.dispatch('completeTodo', todo); 278 | }, 279 | removeTodo (todo) { 280 | this.$store.dispatch('removeTodo', todo); 281 | } 282 | 283 | } 284 | }); 285 | 286 | const router = new VueRouter({ 287 | mode: 'history', 288 | routes: [ 289 | { path: '/', name: 'todoapp', component: todoapp }, 290 | { path: '/login', name: 'login', component: login }, 291 | { path: '/signup', name: 'signup', component: signup }, 292 | { path: '*', redirect: {name: 'todoapp'} } 293 | ] 294 | }); 295 | 296 | // app Vue instance 297 | new Vue({ 298 | router, 299 | store, 300 | created() { 301 | if (getCookie('auth')) { 302 | this.$store.dispatch('loggedIn'); 303 | } 304 | }, 305 | computed: { 306 | errorMessage () { 307 | return this.$store.getters.errorMessage; 308 | }, 309 | loggedIn() { 310 | return this.$store.getters.loggedIn; 311 | } 312 | } 313 | }).$mount('#app'); 314 | 315 | function getCookie(name){ 316 | var pattern = RegExp(name + '=.[^;]*'); 317 | var matched = document.cookie.match(pattern); 318 | if (matched) { 319 | return true; 320 | } 321 | return false; 322 | } 323 | 324 | var el = document.getElementById('todo-list'); 325 | if (el) { 326 | Sortable.create(el, { 327 | animation: 150 328 | }); 329 | } 330 | 331 | })(); 332 | -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "viewportWidth": 600, 3 | "viewportHeight": 800, 4 | "baseUrl": "http://localhost:3000", 5 | "defaultCommandTimeout": 4000, 6 | "$schema": "https://on.cypress.io/cypress.schema.json" 7 | } 8 | -------------------------------------------------------------------------------- /cypress/fixtures/fiveTodos.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "title": "buy milk", 4 | "completed": false, 5 | "id": "1" 6 | }, 7 | { 8 | "title": "wash dishes", 9 | "completed": false, 10 | "id": "2" 11 | }, 12 | { 13 | "title": "clean windows", 14 | "completed": false, 15 | "id": "3" 16 | }, 17 | { 18 | "title": "clean up bedroom", 19 | "completed": false, 20 | "id": "4" 21 | }, 22 | { 23 | "title": "wash clothes", 24 | "completed": false, 25 | "id": "5" 26 | } 27 | ] -------------------------------------------------------------------------------- /cypress/fixtures/threeTodos.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "title": "buy milk", 4 | "completed": false, 5 | "id": "1" 6 | }, 7 | { 8 | "title": "wash dishes", 9 | "completed": false, 10 | "id": "2" 11 | }, 12 | { 13 | "title": "clean windows", 14 | "completed": false, 15 | "id": "3" 16 | } 17 | ] -------------------------------------------------------------------------------- /cypress/fixtures/twoTodos.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "title": "buy milk", 4 | "completed": false, 5 | "id": "1" 6 | }, 7 | { 8 | "title": "wash dishes", 9 | "completed": false, 10 | "id": "2" 11 | } 12 | ] -------------------------------------------------------------------------------- /cypress/integration/01-using-should.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | const todos = require('../fixtures/twoTodos') 4 | 5 | beforeEach( () => { 6 | 7 | cy 8 | .request('POST', '/todos/seed', todos) 9 | 10 | cy 11 | .visit('localhost:3000'); 12 | 13 | }); 14 | 15 | it('Checks texts of todo items', () => { 16 | 17 | cy 18 | .get('.todo') 19 | .eq(0) 20 | .should('contain.text', 'buy milk'); 21 | 22 | cy 23 | .get('.todo') 24 | .eq(1) 25 | .should('contain.text', 'wash dishes'); 26 | 27 | }); -------------------------------------------------------------------------------- /cypress/integration/02-using-then.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | const todos = require('../fixtures/twoTodos') 4 | 5 | beforeEach( () => { 6 | 7 | cy 8 | .request('POST', '/todos/seed', todos) 9 | 10 | cy 11 | .visit('localhost:3000'); 12 | 13 | }); 14 | 15 | it('Checks texts of todos items', () => { 16 | 17 | cy 18 | .get('.todo').then( items => { 19 | 20 | expect(items[0]).to.contain.text('buy milk') 21 | expect(items[1]).to.contain.text('wash dishes') 22 | 23 | }) 24 | 25 | }); -------------------------------------------------------------------------------- /cypress/integration/03-using-each.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | const todos = require('../fixtures/fiveTodos') 4 | const todosTitles = ["buy milk", "wash dishes", "clean windows", "clean up bedroom", "wash clothes"] 5 | 6 | beforeEach( () => { 7 | 8 | cy 9 | .request('POST', '/todos/seed', todos) 10 | 11 | cy 12 | .visit('localhost:3000'); 13 | 14 | }); 15 | 16 | it('Checks texts of todos item', () => { 17 | 18 | cy 19 | .get('.todo').each( (item, index) => { 20 | 21 | cy 22 | .wrap(item) 23 | .should('contain.text', todosTitles[index]) 24 | 25 | }) 26 | 27 | }); -------------------------------------------------------------------------------- /cypress/integration/04-first-position-fail.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | const todos = require('../fixtures/threeTodos') 4 | 5 | beforeEach( () => { 6 | 7 | cy 8 | .request('POST', '/todos/seed', todos) 9 | 10 | cy 11 | .visit('localhost:3000'); 12 | 13 | }); 14 | 15 | it('Has first todo item with text "wash dishes"', () => { 16 | 17 | cy 18 | .get('.todo') 19 | .eq(0) 20 | .should('contain.text', 'wash dishes'); 21 | 22 | }); -------------------------------------------------------------------------------- /cypress/integration/05-first-position-pass.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | const todos = require('../fixtures/threeTodos') 4 | 5 | beforeEach( () => { 6 | 7 | cy 8 | .request('POST', '/todos/seed', todos) 9 | 10 | cy 11 | .visit('localhost:3000'); 12 | 13 | }); 14 | 15 | it('Has first todo item with text "wash dishes"', () => { 16 | 17 | cy 18 | .get('.todo') 19 | .should('have.length', 2) 20 | .eq(0) 21 | .should('contain.text', 'wash dishes'); 22 | 23 | }); -------------------------------------------------------------------------------- /cypress/integration/06-using-should-function.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | const todos = require('../fixtures/twoTodos') 4 | 5 | beforeEach( () => { 6 | 7 | cy 8 | .request('POST', '/todos/seed', todos) 9 | 10 | cy 11 | .visit('localhost:3000'); 12 | 13 | }); 14 | 15 | it('Has first todo item with text "wash dishes"', () => { 16 | 17 | cy 18 | .get('.todo').should( items => { 19 | 20 | expect(items[0]).to.contain.text('wash dishes') 21 | expect(items[1]).to.contain.text('buy milk') 22 | 23 | }) 24 | 25 | }); -------------------------------------------------------------------------------- /data.json: -------------------------------------------------------------------------------- 1 | { 2 | "todos": [ 3 | { 4 | "title": "buy milk", 5 | "completed": false, 6 | "id": "1" 7 | }, 8 | { 9 | "title": "wash dishes", 10 | "completed": false, 11 | "id": "2" 12 | } 13 | ], 14 | "accounts": [] 15 | } -------------------------------------------------------------------------------- /img/dragndrop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filiphric/testing-lists/11b0ed7c1653e6661a3b995cb0ff0807d9c1304f/img/dragndrop.gif -------------------------------------------------------------------------------- /img/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filiphric/testing-lists/11b0ed7c1653e6661a3b995cb0ff0807d9c1304f/img/login.png -------------------------------------------------------------------------------- /img/signup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filiphric/testing-lists/11b0ed7c1653e6661a3b995cb0ff0807d9c1304f/img/signup.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | TodoMVC - Test automation in Cypress 8 | 9 | 10 | 15 | 16 | 17 | 18 | 40 | 52 | 67 | 68 |
69 | 70 | 78 |
{{ errorMessage.text }}
79 |
User is logged in
80 |
81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /json-server.json: -------------------------------------------------------------------------------- 1 | { 2 | "port": 3000 3 | } -------------------------------------------------------------------------------- /middleware.js: -------------------------------------------------------------------------------- 1 | const sendmail = require('sendmail')(); 2 | 3 | module.exports = (req, res, next) => { 4 | 5 | const db = req.app.db; 6 | 7 | if (req.method === 'GET' && req.path === '/login') { 8 | return res.sendFile(`${__dirname}/index.html`); 9 | } 10 | 11 | if (req.method === 'GET' && req.path === '/signup') { 12 | return res.sendFile(`${__dirname}/index.html`); 13 | } 14 | 15 | if (req.method === 'POST' && req.path === '/signup') { 16 | 17 | if (!req.body.email || !req.body.password) { 18 | let response = res.status(401).jsonp({ 19 | error: 'email and password are required' 20 | }); 21 | return response; 22 | } 23 | 24 | if (db.get('accounts').find({email: req.body.email}).value()) { 25 | let response = res.status(409).jsonp({ 26 | error: 'email is already taken' 27 | }); 28 | return response; 29 | } else { 30 | 31 | // return auth cookie 32 | res.header('Set-Cookie', 'auth=true;'); 33 | 34 | // send welcome email if header is true 35 | if (req.headers.sendwelcomeemail === 'true') { 36 | 37 | sendmail({ 38 | from: 'todomvc@filiphric.sk', 39 | to: req.body.email, 40 | subject: 'Welcome to TodoMVC app', 41 | html: 'Your account was successfully created!\nIn the meantime, subscribe to my YouTube channel for Cypress tips!', 42 | }, function(err, reply) { 43 | console.log(err && err.stack); 44 | console.dir(reply); 45 | }); 46 | 47 | } 48 | 49 | db.get('accounts').push(req.body).write(); 50 | let response = res.status(201).jsonp(req.body); 51 | return response; 52 | } 53 | 54 | } 55 | 56 | if (req.method === 'POST' && req.path === '/reset') { 57 | db 58 | .setState({ 59 | 'todos': [], 60 | 'accounts': [] 61 | }) 62 | .write(); 63 | 64 | return res.sendStatus(204); 65 | } 66 | 67 | if (req.method === 'DELETE' && req.path === '/todos') { 68 | db.set('todos', []).write(); 69 | 70 | return res.sendStatus(204); 71 | } 72 | 73 | if (req.method === 'POST' && req.path === '/todos/seed') { 74 | 75 | db.set('todos', req.body).write(); 76 | 77 | return res.sendStatus(201); 78 | } 79 | 80 | if (req.method === 'DELETE' && req.path === '/accounts') { 81 | db.set('accounts', []).write(); 82 | 83 | return res.sendStatus(204); 84 | } 85 | 86 | if (req.method === 'POST' && req.path === '/login') { 87 | 88 | if (db.get('accounts').find(req.body).value()) { 89 | res.header('Set-Cookie', 'auth=true;'); 90 | let response = res.status(200).jsonp({ 91 | message: 'User is logged in' 92 | }); 93 | return response; 94 | 95 | } else { 96 | 97 | return res.sendStatus(401); 98 | 99 | } 100 | 101 | } 102 | 103 | next(); 104 | 105 | }; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "todomvc-testing", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sindresorhus/is": { 8 | "version": "0.14.0", 9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", 10 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", 11 | "dev": true 12 | }, 13 | "@szmarczak/http-timer": { 14 | "version": "1.1.2", 15 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", 16 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", 17 | "dev": true, 18 | "requires": { 19 | "defer-to-connect": "^1.0.1" 20 | } 21 | }, 22 | "accepts": { 23 | "version": "1.3.7", 24 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 25 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 26 | "dev": true, 27 | "requires": { 28 | "mime-types": "~2.1.24", 29 | "negotiator": "0.6.2" 30 | } 31 | }, 32 | "addressparser": { 33 | "version": "1.0.1", 34 | "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", 35 | "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", 36 | "dev": true 37 | }, 38 | "ajv": { 39 | "version": "6.12.0", 40 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", 41 | "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", 42 | "dev": true, 43 | "requires": { 44 | "fast-deep-equal": "^3.1.1", 45 | "fast-json-stable-stringify": "^2.0.0", 46 | "json-schema-traverse": "^0.4.1", 47 | "uri-js": "^4.2.2" 48 | } 49 | }, 50 | "ansi-align": { 51 | "version": "3.0.0", 52 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", 53 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", 54 | "dev": true, 55 | "requires": { 56 | "string-width": "^3.0.0" 57 | } 58 | }, 59 | "ansi-regex": { 60 | "version": "4.1.0", 61 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 62 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 63 | "dev": true 64 | }, 65 | "ansi-styles": { 66 | "version": "3.2.1", 67 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 68 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 69 | "dev": true, 70 | "requires": { 71 | "color-convert": "^1.9.0" 72 | } 73 | }, 74 | "array-flatten": { 75 | "version": "1.1.1", 76 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 77 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", 78 | "dev": true 79 | }, 80 | "asn1": { 81 | "version": "0.2.4", 82 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 83 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 84 | "dev": true, 85 | "requires": { 86 | "safer-buffer": "~2.1.0" 87 | } 88 | }, 89 | "assert-plus": { 90 | "version": "1.0.0", 91 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 92 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 93 | "dev": true 94 | }, 95 | "asynckit": { 96 | "version": "0.4.0", 97 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 98 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 99 | "dev": true 100 | }, 101 | "aws-sign2": { 102 | "version": "0.7.0", 103 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 104 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 105 | "dev": true 106 | }, 107 | "aws4": { 108 | "version": "1.9.1", 109 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", 110 | "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", 111 | "dev": true 112 | }, 113 | "basic-auth": { 114 | "version": "2.0.1", 115 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 116 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 117 | "dev": true, 118 | "requires": { 119 | "safe-buffer": "5.1.2" 120 | } 121 | }, 122 | "bcrypt-pbkdf": { 123 | "version": "1.0.2", 124 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 125 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 126 | "dev": true, 127 | "requires": { 128 | "tweetnacl": "^0.14.3" 129 | } 130 | }, 131 | "body-parser": { 132 | "version": "1.19.0", 133 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 134 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 135 | "dev": true, 136 | "requires": { 137 | "bytes": "3.1.0", 138 | "content-type": "~1.0.4", 139 | "debug": "2.6.9", 140 | "depd": "~1.1.2", 141 | "http-errors": "1.7.2", 142 | "iconv-lite": "0.4.24", 143 | "on-finished": "~2.3.0", 144 | "qs": "6.7.0", 145 | "raw-body": "2.4.0", 146 | "type-is": "~1.6.17" 147 | } 148 | }, 149 | "boxen": { 150 | "version": "3.2.0", 151 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", 152 | "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", 153 | "dev": true, 154 | "requires": { 155 | "ansi-align": "^3.0.0", 156 | "camelcase": "^5.3.1", 157 | "chalk": "^2.4.2", 158 | "cli-boxes": "^2.2.0", 159 | "string-width": "^3.0.0", 160 | "term-size": "^1.2.0", 161 | "type-fest": "^0.3.0", 162 | "widest-line": "^2.0.0" 163 | } 164 | }, 165 | "buildmail": { 166 | "version": "3.10.0", 167 | "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-3.10.0.tgz", 168 | "integrity": "sha1-xoJtcW55RbtvaxQ0tTmF4CmgMVk=", 169 | "dev": true, 170 | "requires": { 171 | "addressparser": "1.0.1", 172 | "libbase64": "0.1.0", 173 | "libmime": "2.1.0", 174 | "libqp": "1.1.0", 175 | "nodemailer-fetch": "1.6.0", 176 | "nodemailer-shared": "1.1.0" 177 | }, 178 | "dependencies": { 179 | "iconv-lite": { 180 | "version": "0.4.13", 181 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", 182 | "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", 183 | "dev": true 184 | }, 185 | "libmime": { 186 | "version": "2.1.0", 187 | "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz", 188 | "integrity": "sha1-Ubx23iKDFh65BRxLyArtcT5P0c0=", 189 | "dev": true, 190 | "requires": { 191 | "iconv-lite": "0.4.13", 192 | "libbase64": "0.1.0", 193 | "libqp": "1.1.0" 194 | } 195 | } 196 | } 197 | }, 198 | "bytes": { 199 | "version": "3.1.0", 200 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 201 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", 202 | "dev": true 203 | }, 204 | "cacheable-request": { 205 | "version": "6.1.0", 206 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", 207 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", 208 | "dev": true, 209 | "requires": { 210 | "clone-response": "^1.0.2", 211 | "get-stream": "^5.1.0", 212 | "http-cache-semantics": "^4.0.0", 213 | "keyv": "^3.0.0", 214 | "lowercase-keys": "^2.0.0", 215 | "normalize-url": "^4.1.0", 216 | "responselike": "^1.0.2" 217 | }, 218 | "dependencies": { 219 | "get-stream": { 220 | "version": "5.1.0", 221 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", 222 | "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", 223 | "dev": true, 224 | "requires": { 225 | "pump": "^3.0.0" 226 | } 227 | }, 228 | "lowercase-keys": { 229 | "version": "2.0.0", 230 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 231 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", 232 | "dev": true 233 | } 234 | } 235 | }, 236 | "camelcase": { 237 | "version": "5.3.1", 238 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 239 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 240 | "dev": true 241 | }, 242 | "caseless": { 243 | "version": "0.12.0", 244 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 245 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 246 | "dev": true 247 | }, 248 | "chalk": { 249 | "version": "2.4.2", 250 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 251 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 252 | "dev": true, 253 | "requires": { 254 | "ansi-styles": "^3.2.1", 255 | "escape-string-regexp": "^1.0.5", 256 | "supports-color": "^5.3.0" 257 | } 258 | }, 259 | "ci-info": { 260 | "version": "2.0.0", 261 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", 262 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", 263 | "dev": true 264 | }, 265 | "cli-boxes": { 266 | "version": "2.2.0", 267 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", 268 | "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", 269 | "dev": true 270 | }, 271 | "cliui": { 272 | "version": "5.0.0", 273 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 274 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 275 | "dev": true, 276 | "requires": { 277 | "string-width": "^3.1.0", 278 | "strip-ansi": "^5.2.0", 279 | "wrap-ansi": "^5.1.0" 280 | } 281 | }, 282 | "clone-response": { 283 | "version": "1.0.2", 284 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 285 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 286 | "dev": true, 287 | "requires": { 288 | "mimic-response": "^1.0.0" 289 | } 290 | }, 291 | "color-convert": { 292 | "version": "1.9.3", 293 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 294 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 295 | "dev": true, 296 | "requires": { 297 | "color-name": "1.1.3" 298 | } 299 | }, 300 | "color-name": { 301 | "version": "1.1.3", 302 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 303 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 304 | "dev": true 305 | }, 306 | "combined-stream": { 307 | "version": "1.0.8", 308 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 309 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 310 | "dev": true, 311 | "requires": { 312 | "delayed-stream": "~1.0.0" 313 | } 314 | }, 315 | "compressible": { 316 | "version": "2.0.18", 317 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", 318 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", 319 | "dev": true, 320 | "requires": { 321 | "mime-db": ">= 1.43.0 < 2" 322 | } 323 | }, 324 | "compression": { 325 | "version": "1.7.4", 326 | "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", 327 | "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", 328 | "dev": true, 329 | "requires": { 330 | "accepts": "~1.3.5", 331 | "bytes": "3.0.0", 332 | "compressible": "~2.0.16", 333 | "debug": "2.6.9", 334 | "on-headers": "~1.0.2", 335 | "safe-buffer": "5.1.2", 336 | "vary": "~1.1.2" 337 | }, 338 | "dependencies": { 339 | "bytes": { 340 | "version": "3.0.0", 341 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 342 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", 343 | "dev": true 344 | } 345 | } 346 | }, 347 | "configstore": { 348 | "version": "4.0.0", 349 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", 350 | "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", 351 | "dev": true, 352 | "requires": { 353 | "dot-prop": "^4.1.0", 354 | "graceful-fs": "^4.1.2", 355 | "make-dir": "^1.0.0", 356 | "unique-string": "^1.0.0", 357 | "write-file-atomic": "^2.0.0", 358 | "xdg-basedir": "^3.0.0" 359 | } 360 | }, 361 | "connect-pause": { 362 | "version": "0.1.1", 363 | "resolved": "https://registry.npmjs.org/connect-pause/-/connect-pause-0.1.1.tgz", 364 | "integrity": "sha1-smmyu4Ldsaw9tQmcD7WCq6mfs3o=", 365 | "dev": true 366 | }, 367 | "content-disposition": { 368 | "version": "0.5.3", 369 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 370 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 371 | "dev": true, 372 | "requires": { 373 | "safe-buffer": "5.1.2" 374 | } 375 | }, 376 | "content-type": { 377 | "version": "1.0.4", 378 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 379 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 380 | "dev": true 381 | }, 382 | "cookie": { 383 | "version": "0.4.0", 384 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 385 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", 386 | "dev": true 387 | }, 388 | "cookie-signature": { 389 | "version": "1.0.6", 390 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 391 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", 392 | "dev": true 393 | }, 394 | "core-util-is": { 395 | "version": "1.0.2", 396 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 397 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 398 | "dev": true 399 | }, 400 | "cors": { 401 | "version": "2.8.5", 402 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 403 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 404 | "dev": true, 405 | "requires": { 406 | "object-assign": "^4", 407 | "vary": "^1" 408 | } 409 | }, 410 | "cross-spawn": { 411 | "version": "5.1.0", 412 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 413 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 414 | "dev": true, 415 | "requires": { 416 | "lru-cache": "^4.0.1", 417 | "shebang-command": "^1.2.0", 418 | "which": "^1.2.9" 419 | } 420 | }, 421 | "crypto-random-string": { 422 | "version": "1.0.0", 423 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 424 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", 425 | "dev": true 426 | }, 427 | "dashdash": { 428 | "version": "1.14.1", 429 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 430 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 431 | "dev": true, 432 | "requires": { 433 | "assert-plus": "^1.0.0" 434 | } 435 | }, 436 | "debug": { 437 | "version": "2.6.9", 438 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 439 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 440 | "dev": true, 441 | "requires": { 442 | "ms": "2.0.0" 443 | } 444 | }, 445 | "decamelize": { 446 | "version": "1.2.0", 447 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 448 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 449 | "dev": true 450 | }, 451 | "decompress-response": { 452 | "version": "3.3.0", 453 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 454 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 455 | "dev": true, 456 | "requires": { 457 | "mimic-response": "^1.0.0" 458 | } 459 | }, 460 | "deep-extend": { 461 | "version": "0.6.0", 462 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 463 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 464 | "dev": true 465 | }, 466 | "defer-to-connect": { 467 | "version": "1.1.3", 468 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 469 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", 470 | "dev": true 471 | }, 472 | "delayed-stream": { 473 | "version": "1.0.0", 474 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 475 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 476 | "dev": true 477 | }, 478 | "depd": { 479 | "version": "1.1.2", 480 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 481 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 482 | "dev": true 483 | }, 484 | "destroy": { 485 | "version": "1.0.4", 486 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 487 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", 488 | "dev": true 489 | }, 490 | "dkim-signer": { 491 | "version": "0.2.2", 492 | "resolved": "https://registry.npmjs.org/dkim-signer/-/dkim-signer-0.2.2.tgz", 493 | "integrity": "sha1-qoHsBx7u02IngbqpIgRNeADl8wg=", 494 | "dev": true, 495 | "requires": { 496 | "libmime": "^2.0.3" 497 | } 498 | }, 499 | "dot-prop": { 500 | "version": "4.2.0", 501 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 502 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 503 | "dev": true, 504 | "requires": { 505 | "is-obj": "^1.0.0" 506 | } 507 | }, 508 | "duplexer3": { 509 | "version": "0.1.4", 510 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 511 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 512 | "dev": true 513 | }, 514 | "ecc-jsbn": { 515 | "version": "0.1.2", 516 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 517 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 518 | "dev": true, 519 | "requires": { 520 | "jsbn": "~0.1.0", 521 | "safer-buffer": "^2.1.0" 522 | } 523 | }, 524 | "ee-first": { 525 | "version": "1.1.1", 526 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 527 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 528 | "dev": true 529 | }, 530 | "emoji-regex": { 531 | "version": "7.0.3", 532 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 533 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 534 | "dev": true 535 | }, 536 | "encodeurl": { 537 | "version": "1.0.2", 538 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 539 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 540 | "dev": true 541 | }, 542 | "end-of-stream": { 543 | "version": "1.4.4", 544 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 545 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 546 | "dev": true, 547 | "requires": { 548 | "once": "^1.4.0" 549 | } 550 | }, 551 | "errorhandler": { 552 | "version": "1.5.1", 553 | "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", 554 | "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", 555 | "dev": true, 556 | "requires": { 557 | "accepts": "~1.3.7", 558 | "escape-html": "~1.0.3" 559 | } 560 | }, 561 | "escape-html": { 562 | "version": "1.0.3", 563 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 564 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", 565 | "dev": true 566 | }, 567 | "escape-string-regexp": { 568 | "version": "1.0.5", 569 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 570 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 571 | "dev": true 572 | }, 573 | "etag": { 574 | "version": "1.8.1", 575 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 576 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 577 | "dev": true 578 | }, 579 | "execa": { 580 | "version": "0.7.0", 581 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 582 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 583 | "dev": true, 584 | "requires": { 585 | "cross-spawn": "^5.0.1", 586 | "get-stream": "^3.0.0", 587 | "is-stream": "^1.1.0", 588 | "npm-run-path": "^2.0.0", 589 | "p-finally": "^1.0.0", 590 | "signal-exit": "^3.0.0", 591 | "strip-eof": "^1.0.0" 592 | } 593 | }, 594 | "express": { 595 | "version": "4.17.1", 596 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 597 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 598 | "dev": true, 599 | "requires": { 600 | "accepts": "~1.3.7", 601 | "array-flatten": "1.1.1", 602 | "body-parser": "1.19.0", 603 | "content-disposition": "0.5.3", 604 | "content-type": "~1.0.4", 605 | "cookie": "0.4.0", 606 | "cookie-signature": "1.0.6", 607 | "debug": "2.6.9", 608 | "depd": "~1.1.2", 609 | "encodeurl": "~1.0.2", 610 | "escape-html": "~1.0.3", 611 | "etag": "~1.8.1", 612 | "finalhandler": "~1.1.2", 613 | "fresh": "0.5.2", 614 | "merge-descriptors": "1.0.1", 615 | "methods": "~1.1.2", 616 | "on-finished": "~2.3.0", 617 | "parseurl": "~1.3.3", 618 | "path-to-regexp": "0.1.7", 619 | "proxy-addr": "~2.0.5", 620 | "qs": "6.7.0", 621 | "range-parser": "~1.2.1", 622 | "safe-buffer": "5.1.2", 623 | "send": "0.17.1", 624 | "serve-static": "1.14.1", 625 | "setprototypeof": "1.1.1", 626 | "statuses": "~1.5.0", 627 | "type-is": "~1.6.18", 628 | "utils-merge": "1.0.1", 629 | "vary": "~1.1.2" 630 | } 631 | }, 632 | "express-urlrewrite": { 633 | "version": "1.2.0", 634 | "resolved": "https://registry.npmjs.org/express-urlrewrite/-/express-urlrewrite-1.2.0.tgz", 635 | "integrity": "sha1-jmZ7d2H/HH/9sO+gXWQDU4fII+s=", 636 | "dev": true, 637 | "requires": { 638 | "debug": "*", 639 | "path-to-regexp": "^1.0.3" 640 | }, 641 | "dependencies": { 642 | "path-to-regexp": { 643 | "version": "1.8.0", 644 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", 645 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", 646 | "dev": true, 647 | "requires": { 648 | "isarray": "0.0.1" 649 | } 650 | } 651 | } 652 | }, 653 | "extend": { 654 | "version": "3.0.2", 655 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 656 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 657 | "dev": true 658 | }, 659 | "extsprintf": { 660 | "version": "1.3.0", 661 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 662 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 663 | "dev": true 664 | }, 665 | "fast-deep-equal": { 666 | "version": "3.1.1", 667 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 668 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", 669 | "dev": true 670 | }, 671 | "fast-json-stable-stringify": { 672 | "version": "2.1.0", 673 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 674 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 675 | "dev": true 676 | }, 677 | "finalhandler": { 678 | "version": "1.1.2", 679 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 680 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 681 | "dev": true, 682 | "requires": { 683 | "debug": "2.6.9", 684 | "encodeurl": "~1.0.2", 685 | "escape-html": "~1.0.3", 686 | "on-finished": "~2.3.0", 687 | "parseurl": "~1.3.3", 688 | "statuses": "~1.5.0", 689 | "unpipe": "~1.0.0" 690 | } 691 | }, 692 | "find-up": { 693 | "version": "3.0.0", 694 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 695 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 696 | "dev": true, 697 | "requires": { 698 | "locate-path": "^3.0.0" 699 | } 700 | }, 701 | "forever-agent": { 702 | "version": "0.6.1", 703 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 704 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 705 | "dev": true 706 | }, 707 | "form-data": { 708 | "version": "2.3.3", 709 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 710 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 711 | "dev": true, 712 | "requires": { 713 | "asynckit": "^0.4.0", 714 | "combined-stream": "^1.0.6", 715 | "mime-types": "^2.1.12" 716 | } 717 | }, 718 | "forwarded": { 719 | "version": "0.1.2", 720 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 721 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", 722 | "dev": true 723 | }, 724 | "fresh": { 725 | "version": "0.5.2", 726 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 727 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 728 | "dev": true 729 | }, 730 | "get-caller-file": { 731 | "version": "2.0.5", 732 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 733 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 734 | "dev": true 735 | }, 736 | "get-stream": { 737 | "version": "3.0.0", 738 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 739 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 740 | "dev": true 741 | }, 742 | "getpass": { 743 | "version": "0.1.7", 744 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 745 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 746 | "dev": true, 747 | "requires": { 748 | "assert-plus": "^1.0.0" 749 | } 750 | }, 751 | "global-dirs": { 752 | "version": "0.1.1", 753 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 754 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 755 | "dev": true, 756 | "requires": { 757 | "ini": "^1.3.4" 758 | } 759 | }, 760 | "got": { 761 | "version": "9.6.0", 762 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", 763 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", 764 | "dev": true, 765 | "requires": { 766 | "@sindresorhus/is": "^0.14.0", 767 | "@szmarczak/http-timer": "^1.1.2", 768 | "cacheable-request": "^6.0.0", 769 | "decompress-response": "^3.3.0", 770 | "duplexer3": "^0.1.4", 771 | "get-stream": "^4.1.0", 772 | "lowercase-keys": "^1.0.1", 773 | "mimic-response": "^1.0.1", 774 | "p-cancelable": "^1.0.0", 775 | "to-readable-stream": "^1.0.0", 776 | "url-parse-lax": "^3.0.0" 777 | }, 778 | "dependencies": { 779 | "get-stream": { 780 | "version": "4.1.0", 781 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 782 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 783 | "dev": true, 784 | "requires": { 785 | "pump": "^3.0.0" 786 | } 787 | } 788 | } 789 | }, 790 | "graceful-fs": { 791 | "version": "4.2.3", 792 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 793 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 794 | "dev": true 795 | }, 796 | "har-schema": { 797 | "version": "2.0.0", 798 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 799 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 800 | "dev": true 801 | }, 802 | "har-validator": { 803 | "version": "5.1.3", 804 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 805 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 806 | "dev": true, 807 | "requires": { 808 | "ajv": "^6.5.5", 809 | "har-schema": "^2.0.0" 810 | } 811 | }, 812 | "has-flag": { 813 | "version": "3.0.0", 814 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 815 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 816 | "dev": true 817 | }, 818 | "has-yarn": { 819 | "version": "2.1.0", 820 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", 821 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", 822 | "dev": true 823 | }, 824 | "http-cache-semantics": { 825 | "version": "4.1.0", 826 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 827 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", 828 | "dev": true 829 | }, 830 | "http-errors": { 831 | "version": "1.7.2", 832 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 833 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 834 | "dev": true, 835 | "requires": { 836 | "depd": "~1.1.2", 837 | "inherits": "2.0.3", 838 | "setprototypeof": "1.1.1", 839 | "statuses": ">= 1.5.0 < 2", 840 | "toidentifier": "1.0.0" 841 | } 842 | }, 843 | "http-signature": { 844 | "version": "1.2.0", 845 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 846 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 847 | "dev": true, 848 | "requires": { 849 | "assert-plus": "^1.0.0", 850 | "jsprim": "^1.2.2", 851 | "sshpk": "^1.7.0" 852 | } 853 | }, 854 | "iconv-lite": { 855 | "version": "0.4.24", 856 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 857 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 858 | "dev": true, 859 | "requires": { 860 | "safer-buffer": ">= 2.1.2 < 3" 861 | } 862 | }, 863 | "import-lazy": { 864 | "version": "2.1.0", 865 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 866 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", 867 | "dev": true 868 | }, 869 | "imurmurhash": { 870 | "version": "0.1.4", 871 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 872 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 873 | "dev": true 874 | }, 875 | "inherits": { 876 | "version": "2.0.3", 877 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 878 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 879 | "dev": true 880 | }, 881 | "ini": { 882 | "version": "1.3.5", 883 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 884 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 885 | "dev": true 886 | }, 887 | "ipaddr.js": { 888 | "version": "1.9.1", 889 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 890 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 891 | "dev": true 892 | }, 893 | "is-ci": { 894 | "version": "2.0.0", 895 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", 896 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", 897 | "dev": true, 898 | "requires": { 899 | "ci-info": "^2.0.0" 900 | } 901 | }, 902 | "is-fullwidth-code-point": { 903 | "version": "2.0.0", 904 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 905 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 906 | "dev": true 907 | }, 908 | "is-installed-globally": { 909 | "version": "0.1.0", 910 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", 911 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 912 | "dev": true, 913 | "requires": { 914 | "global-dirs": "^0.1.0", 915 | "is-path-inside": "^1.0.0" 916 | } 917 | }, 918 | "is-npm": { 919 | "version": "3.0.0", 920 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", 921 | "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", 922 | "dev": true 923 | }, 924 | "is-obj": { 925 | "version": "1.0.1", 926 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 927 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 928 | "dev": true 929 | }, 930 | "is-path-inside": { 931 | "version": "1.0.1", 932 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 933 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 934 | "dev": true, 935 | "requires": { 936 | "path-is-inside": "^1.0.1" 937 | } 938 | }, 939 | "is-promise": { 940 | "version": "2.1.0", 941 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 942 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 943 | "dev": true 944 | }, 945 | "is-stream": { 946 | "version": "1.1.0", 947 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 948 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 949 | "dev": true 950 | }, 951 | "is-typedarray": { 952 | "version": "1.0.0", 953 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 954 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 955 | "dev": true 956 | }, 957 | "is-yarn-global": { 958 | "version": "0.3.0", 959 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", 960 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", 961 | "dev": true 962 | }, 963 | "isarray": { 964 | "version": "0.0.1", 965 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 966 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 967 | "dev": true 968 | }, 969 | "isexe": { 970 | "version": "2.0.0", 971 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 972 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 973 | "dev": true 974 | }, 975 | "isstream": { 976 | "version": "0.1.2", 977 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 978 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 979 | "dev": true 980 | }, 981 | "jju": { 982 | "version": "1.4.0", 983 | "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", 984 | "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", 985 | "dev": true 986 | }, 987 | "jsbn": { 988 | "version": "0.1.1", 989 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 990 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 991 | "dev": true 992 | }, 993 | "json-buffer": { 994 | "version": "3.0.0", 995 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 996 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", 997 | "dev": true 998 | }, 999 | "json-parse-helpfulerror": { 1000 | "version": "1.0.3", 1001 | "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", 1002 | "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", 1003 | "dev": true, 1004 | "requires": { 1005 | "jju": "^1.1.0" 1006 | } 1007 | }, 1008 | "json-schema": { 1009 | "version": "0.2.3", 1010 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1011 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1012 | "dev": true 1013 | }, 1014 | "json-schema-traverse": { 1015 | "version": "0.4.1", 1016 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1017 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1018 | "dev": true 1019 | }, 1020 | "json-server": { 1021 | "version": "0.15.1", 1022 | "resolved": "https://registry.npmjs.org/json-server/-/json-server-0.15.1.tgz", 1023 | "integrity": "sha512-6Vc6tC1uLasnMd6Ksnq+4gSQcRqLuSJ/yLoIG4fr4P8f5dAR1gbCqgaVRlk8jfRune0NXcrfDrz7liwAD2WEeQ==", 1024 | "dev": true, 1025 | "requires": { 1026 | "body-parser": "^1.19.0", 1027 | "chalk": "^2.4.2", 1028 | "compression": "^1.7.4", 1029 | "connect-pause": "^0.1.1", 1030 | "cors": "^2.8.5", 1031 | "errorhandler": "^1.5.1", 1032 | "express": "^4.17.1", 1033 | "express-urlrewrite": "^1.2.0", 1034 | "json-parse-helpfulerror": "^1.0.3", 1035 | "lodash": "^4.17.15", 1036 | "lodash-id": "^0.14.0", 1037 | "lowdb": "^1.0.0", 1038 | "method-override": "^3.0.0", 1039 | "morgan": "^1.9.1", 1040 | "nanoid": "^2.1.0", 1041 | "object-assign": "^4.1.1", 1042 | "please-upgrade-node": "^3.2.0", 1043 | "pluralize": "^8.0.0", 1044 | "request": "^2.88.0", 1045 | "server-destroy": "^1.0.1", 1046 | "update-notifier": "^3.0.1", 1047 | "yargs": "^14.0.0" 1048 | } 1049 | }, 1050 | "json-stringify-safe": { 1051 | "version": "5.0.1", 1052 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1053 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1054 | "dev": true 1055 | }, 1056 | "jsprim": { 1057 | "version": "1.4.1", 1058 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1059 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1060 | "dev": true, 1061 | "requires": { 1062 | "assert-plus": "1.0.0", 1063 | "extsprintf": "1.3.0", 1064 | "json-schema": "0.2.3", 1065 | "verror": "1.10.0" 1066 | } 1067 | }, 1068 | "keyv": { 1069 | "version": "3.1.0", 1070 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", 1071 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", 1072 | "dev": true, 1073 | "requires": { 1074 | "json-buffer": "3.0.0" 1075 | } 1076 | }, 1077 | "latest-version": { 1078 | "version": "5.1.0", 1079 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", 1080 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", 1081 | "dev": true, 1082 | "requires": { 1083 | "package-json": "^6.3.0" 1084 | } 1085 | }, 1086 | "libbase64": { 1087 | "version": "0.1.0", 1088 | "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", 1089 | "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", 1090 | "dev": true 1091 | }, 1092 | "libmime": { 1093 | "version": "2.1.3", 1094 | "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.3.tgz", 1095 | "integrity": "sha1-JQF8pataHpiq2+JyUBfPHUikKgw=", 1096 | "dev": true, 1097 | "requires": { 1098 | "iconv-lite": "0.4.15", 1099 | "libbase64": "0.1.0", 1100 | "libqp": "1.1.0" 1101 | }, 1102 | "dependencies": { 1103 | "iconv-lite": { 1104 | "version": "0.4.15", 1105 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", 1106 | "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", 1107 | "dev": true 1108 | } 1109 | } 1110 | }, 1111 | "libqp": { 1112 | "version": "1.1.0", 1113 | "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", 1114 | "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", 1115 | "dev": true 1116 | }, 1117 | "locate-path": { 1118 | "version": "3.0.0", 1119 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1120 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1121 | "dev": true, 1122 | "requires": { 1123 | "p-locate": "^3.0.0", 1124 | "path-exists": "^3.0.0" 1125 | } 1126 | }, 1127 | "lodash": { 1128 | "version": "4.17.15", 1129 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1130 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1131 | "dev": true 1132 | }, 1133 | "lodash-id": { 1134 | "version": "0.14.0", 1135 | "resolved": "https://registry.npmjs.org/lodash-id/-/lodash-id-0.14.0.tgz", 1136 | "integrity": "sha1-uvSJNOVDobXWNG+MhGmLGoyAOJY=", 1137 | "dev": true 1138 | }, 1139 | "lowdb": { 1140 | "version": "1.0.0", 1141 | "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", 1142 | "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", 1143 | "dev": true, 1144 | "requires": { 1145 | "graceful-fs": "^4.1.3", 1146 | "is-promise": "^2.1.0", 1147 | "lodash": "4", 1148 | "pify": "^3.0.0", 1149 | "steno": "^0.4.1" 1150 | } 1151 | }, 1152 | "lowercase-keys": { 1153 | "version": "1.0.1", 1154 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 1155 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 1156 | "dev": true 1157 | }, 1158 | "lru-cache": { 1159 | "version": "4.1.5", 1160 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1161 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 1162 | "dev": true, 1163 | "requires": { 1164 | "pseudomap": "^1.0.2", 1165 | "yallist": "^2.1.2" 1166 | } 1167 | }, 1168 | "mailcomposer": { 1169 | "version": "3.12.0", 1170 | "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-3.12.0.tgz", 1171 | "integrity": "sha1-nF4RiKqOHGLsi4a9Q0aBArY56Pk=", 1172 | "dev": true, 1173 | "requires": { 1174 | "buildmail": "3.10.0", 1175 | "libmime": "2.1.0" 1176 | }, 1177 | "dependencies": { 1178 | "iconv-lite": { 1179 | "version": "0.4.13", 1180 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", 1181 | "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", 1182 | "dev": true 1183 | }, 1184 | "libmime": { 1185 | "version": "2.1.0", 1186 | "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz", 1187 | "integrity": "sha1-Ubx23iKDFh65BRxLyArtcT5P0c0=", 1188 | "dev": true, 1189 | "requires": { 1190 | "iconv-lite": "0.4.13", 1191 | "libbase64": "0.1.0", 1192 | "libqp": "1.1.0" 1193 | } 1194 | } 1195 | } 1196 | }, 1197 | "make-dir": { 1198 | "version": "1.3.0", 1199 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 1200 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 1201 | "dev": true, 1202 | "requires": { 1203 | "pify": "^3.0.0" 1204 | } 1205 | }, 1206 | "media-typer": { 1207 | "version": "0.3.0", 1208 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1209 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 1210 | "dev": true 1211 | }, 1212 | "merge-descriptors": { 1213 | "version": "1.0.1", 1214 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1215 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", 1216 | "dev": true 1217 | }, 1218 | "method-override": { 1219 | "version": "3.0.0", 1220 | "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", 1221 | "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", 1222 | "dev": true, 1223 | "requires": { 1224 | "debug": "3.1.0", 1225 | "methods": "~1.1.2", 1226 | "parseurl": "~1.3.2", 1227 | "vary": "~1.1.2" 1228 | }, 1229 | "dependencies": { 1230 | "debug": { 1231 | "version": "3.1.0", 1232 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1233 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1234 | "dev": true, 1235 | "requires": { 1236 | "ms": "2.0.0" 1237 | } 1238 | } 1239 | } 1240 | }, 1241 | "methods": { 1242 | "version": "1.1.2", 1243 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1244 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 1245 | "dev": true 1246 | }, 1247 | "mime": { 1248 | "version": "1.6.0", 1249 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1250 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1251 | "dev": true 1252 | }, 1253 | "mime-db": { 1254 | "version": "1.43.0", 1255 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 1256 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", 1257 | "dev": true 1258 | }, 1259 | "mime-types": { 1260 | "version": "2.1.26", 1261 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 1262 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 1263 | "dev": true, 1264 | "requires": { 1265 | "mime-db": "1.43.0" 1266 | } 1267 | }, 1268 | "mimic-response": { 1269 | "version": "1.0.1", 1270 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 1271 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 1272 | "dev": true 1273 | }, 1274 | "minimist": { 1275 | "version": "1.2.5", 1276 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1277 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1278 | "dev": true 1279 | }, 1280 | "morgan": { 1281 | "version": "1.10.0", 1282 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", 1283 | "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", 1284 | "dev": true, 1285 | "requires": { 1286 | "basic-auth": "~2.0.1", 1287 | "debug": "2.6.9", 1288 | "depd": "~2.0.0", 1289 | "on-finished": "~2.3.0", 1290 | "on-headers": "~1.0.2" 1291 | }, 1292 | "dependencies": { 1293 | "depd": { 1294 | "version": "2.0.0", 1295 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1296 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 1297 | "dev": true 1298 | } 1299 | } 1300 | }, 1301 | "ms": { 1302 | "version": "2.0.0", 1303 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1304 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1305 | "dev": true 1306 | }, 1307 | "nanoid": { 1308 | "version": "2.1.11", 1309 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", 1310 | "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", 1311 | "dev": true 1312 | }, 1313 | "negotiator": { 1314 | "version": "0.6.2", 1315 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1316 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 1317 | "dev": true 1318 | }, 1319 | "nodemailer-fetch": { 1320 | "version": "1.6.0", 1321 | "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", 1322 | "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", 1323 | "dev": true 1324 | }, 1325 | "nodemailer-shared": { 1326 | "version": "1.1.0", 1327 | "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", 1328 | "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", 1329 | "dev": true, 1330 | "requires": { 1331 | "nodemailer-fetch": "1.6.0" 1332 | } 1333 | }, 1334 | "normalize-url": { 1335 | "version": "4.5.0", 1336 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", 1337 | "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", 1338 | "dev": true 1339 | }, 1340 | "npm-run-path": { 1341 | "version": "2.0.2", 1342 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1343 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1344 | "dev": true, 1345 | "requires": { 1346 | "path-key": "^2.0.0" 1347 | } 1348 | }, 1349 | "oauth-sign": { 1350 | "version": "0.9.0", 1351 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1352 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1353 | "dev": true 1354 | }, 1355 | "object-assign": { 1356 | "version": "4.1.1", 1357 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1358 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1359 | "dev": true 1360 | }, 1361 | "on-finished": { 1362 | "version": "2.3.0", 1363 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1364 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1365 | "dev": true, 1366 | "requires": { 1367 | "ee-first": "1.1.1" 1368 | } 1369 | }, 1370 | "on-headers": { 1371 | "version": "1.0.2", 1372 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 1373 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", 1374 | "dev": true 1375 | }, 1376 | "once": { 1377 | "version": "1.4.0", 1378 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1379 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1380 | "dev": true, 1381 | "requires": { 1382 | "wrappy": "1" 1383 | } 1384 | }, 1385 | "p-cancelable": { 1386 | "version": "1.1.0", 1387 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 1388 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", 1389 | "dev": true 1390 | }, 1391 | "p-finally": { 1392 | "version": "1.0.0", 1393 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1394 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1395 | "dev": true 1396 | }, 1397 | "p-limit": { 1398 | "version": "2.2.2", 1399 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", 1400 | "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", 1401 | "dev": true, 1402 | "requires": { 1403 | "p-try": "^2.0.0" 1404 | } 1405 | }, 1406 | "p-locate": { 1407 | "version": "3.0.0", 1408 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1409 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1410 | "dev": true, 1411 | "requires": { 1412 | "p-limit": "^2.0.0" 1413 | } 1414 | }, 1415 | "p-try": { 1416 | "version": "2.2.0", 1417 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1418 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1419 | "dev": true 1420 | }, 1421 | "package-json": { 1422 | "version": "6.5.0", 1423 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", 1424 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", 1425 | "dev": true, 1426 | "requires": { 1427 | "got": "^9.6.0", 1428 | "registry-auth-token": "^4.0.0", 1429 | "registry-url": "^5.0.0", 1430 | "semver": "^6.2.0" 1431 | } 1432 | }, 1433 | "parseurl": { 1434 | "version": "1.3.3", 1435 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1436 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1437 | "dev": true 1438 | }, 1439 | "path-exists": { 1440 | "version": "3.0.0", 1441 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1442 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1443 | "dev": true 1444 | }, 1445 | "path-is-inside": { 1446 | "version": "1.0.2", 1447 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1448 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1449 | "dev": true 1450 | }, 1451 | "path-key": { 1452 | "version": "2.0.1", 1453 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1454 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1455 | "dev": true 1456 | }, 1457 | "path-to-regexp": { 1458 | "version": "0.1.7", 1459 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1460 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", 1461 | "dev": true 1462 | }, 1463 | "performance-now": { 1464 | "version": "2.1.0", 1465 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1466 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1467 | "dev": true 1468 | }, 1469 | "pify": { 1470 | "version": "3.0.0", 1471 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1472 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1473 | "dev": true 1474 | }, 1475 | "please-upgrade-node": { 1476 | "version": "3.2.0", 1477 | "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", 1478 | "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", 1479 | "dev": true, 1480 | "requires": { 1481 | "semver-compare": "^1.0.0" 1482 | } 1483 | }, 1484 | "pluralize": { 1485 | "version": "8.0.0", 1486 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", 1487 | "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", 1488 | "dev": true 1489 | }, 1490 | "prepend-http": { 1491 | "version": "2.0.0", 1492 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 1493 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", 1494 | "dev": true 1495 | }, 1496 | "proxy-addr": { 1497 | "version": "2.0.6", 1498 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1499 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1500 | "dev": true, 1501 | "requires": { 1502 | "forwarded": "~0.1.2", 1503 | "ipaddr.js": "1.9.1" 1504 | } 1505 | }, 1506 | "pseudomap": { 1507 | "version": "1.0.2", 1508 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1509 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1510 | "dev": true 1511 | }, 1512 | "psl": { 1513 | "version": "1.8.0", 1514 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1515 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", 1516 | "dev": true 1517 | }, 1518 | "pump": { 1519 | "version": "3.0.0", 1520 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1521 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1522 | "dev": true, 1523 | "requires": { 1524 | "end-of-stream": "^1.1.0", 1525 | "once": "^1.3.1" 1526 | } 1527 | }, 1528 | "punycode": { 1529 | "version": "2.1.1", 1530 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1531 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1532 | "dev": true 1533 | }, 1534 | "qs": { 1535 | "version": "6.7.0", 1536 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1537 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", 1538 | "dev": true 1539 | }, 1540 | "range-parser": { 1541 | "version": "1.2.1", 1542 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1543 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1544 | "dev": true 1545 | }, 1546 | "raw-body": { 1547 | "version": "2.4.0", 1548 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1549 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1550 | "dev": true, 1551 | "requires": { 1552 | "bytes": "3.1.0", 1553 | "http-errors": "1.7.2", 1554 | "iconv-lite": "0.4.24", 1555 | "unpipe": "1.0.0" 1556 | } 1557 | }, 1558 | "rc": { 1559 | "version": "1.2.8", 1560 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1561 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1562 | "dev": true, 1563 | "requires": { 1564 | "deep-extend": "^0.6.0", 1565 | "ini": "~1.3.0", 1566 | "minimist": "^1.2.0", 1567 | "strip-json-comments": "~2.0.1" 1568 | } 1569 | }, 1570 | "registry-auth-token": { 1571 | "version": "4.1.1", 1572 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", 1573 | "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", 1574 | "dev": true, 1575 | "requires": { 1576 | "rc": "^1.2.8" 1577 | } 1578 | }, 1579 | "registry-url": { 1580 | "version": "5.1.0", 1581 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", 1582 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", 1583 | "dev": true, 1584 | "requires": { 1585 | "rc": "^1.2.8" 1586 | } 1587 | }, 1588 | "request": { 1589 | "version": "2.88.2", 1590 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1591 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1592 | "dev": true, 1593 | "requires": { 1594 | "aws-sign2": "~0.7.0", 1595 | "aws4": "^1.8.0", 1596 | "caseless": "~0.12.0", 1597 | "combined-stream": "~1.0.6", 1598 | "extend": "~3.0.2", 1599 | "forever-agent": "~0.6.1", 1600 | "form-data": "~2.3.2", 1601 | "har-validator": "~5.1.3", 1602 | "http-signature": "~1.2.0", 1603 | "is-typedarray": "~1.0.0", 1604 | "isstream": "~0.1.2", 1605 | "json-stringify-safe": "~5.0.1", 1606 | "mime-types": "~2.1.19", 1607 | "oauth-sign": "~0.9.0", 1608 | "performance-now": "^2.1.0", 1609 | "qs": "~6.5.2", 1610 | "safe-buffer": "^5.1.2", 1611 | "tough-cookie": "~2.5.0", 1612 | "tunnel-agent": "^0.6.0", 1613 | "uuid": "^3.3.2" 1614 | }, 1615 | "dependencies": { 1616 | "qs": { 1617 | "version": "6.5.2", 1618 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1619 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 1620 | "dev": true 1621 | } 1622 | } 1623 | }, 1624 | "require-directory": { 1625 | "version": "2.1.1", 1626 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1627 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1628 | "dev": true 1629 | }, 1630 | "require-main-filename": { 1631 | "version": "2.0.0", 1632 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1633 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1634 | "dev": true 1635 | }, 1636 | "responselike": { 1637 | "version": "1.0.2", 1638 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 1639 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 1640 | "dev": true, 1641 | "requires": { 1642 | "lowercase-keys": "^1.0.0" 1643 | } 1644 | }, 1645 | "safe-buffer": { 1646 | "version": "5.1.2", 1647 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1648 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1649 | "dev": true 1650 | }, 1651 | "safer-buffer": { 1652 | "version": "2.1.2", 1653 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1654 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1655 | "dev": true 1656 | }, 1657 | "semver": { 1658 | "version": "6.3.0", 1659 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1660 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1661 | "dev": true 1662 | }, 1663 | "semver-compare": { 1664 | "version": "1.0.0", 1665 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 1666 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", 1667 | "dev": true 1668 | }, 1669 | "semver-diff": { 1670 | "version": "2.1.0", 1671 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", 1672 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", 1673 | "dev": true, 1674 | "requires": { 1675 | "semver": "^5.0.3" 1676 | }, 1677 | "dependencies": { 1678 | "semver": { 1679 | "version": "5.7.1", 1680 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1681 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1682 | "dev": true 1683 | } 1684 | } 1685 | }, 1686 | "send": { 1687 | "version": "0.17.1", 1688 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1689 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1690 | "dev": true, 1691 | "requires": { 1692 | "debug": "2.6.9", 1693 | "depd": "~1.1.2", 1694 | "destroy": "~1.0.4", 1695 | "encodeurl": "~1.0.2", 1696 | "escape-html": "~1.0.3", 1697 | "etag": "~1.8.1", 1698 | "fresh": "0.5.2", 1699 | "http-errors": "~1.7.2", 1700 | "mime": "1.6.0", 1701 | "ms": "2.1.1", 1702 | "on-finished": "~2.3.0", 1703 | "range-parser": "~1.2.1", 1704 | "statuses": "~1.5.0" 1705 | }, 1706 | "dependencies": { 1707 | "ms": { 1708 | "version": "2.1.1", 1709 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1710 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 1711 | "dev": true 1712 | } 1713 | } 1714 | }, 1715 | "sendmail": { 1716 | "version": "1.6.1", 1717 | "resolved": "https://registry.npmjs.org/sendmail/-/sendmail-1.6.1.tgz", 1718 | "integrity": "sha512-lIhvnjSi5e5jL8wA1GPP6j2QVlx6JOEfmdn0QIfmuJdmXYGmJ375kcOU0NSm/34J+nypm4sa1AXrYE5w3uNIIA==", 1719 | "dev": true, 1720 | "requires": { 1721 | "dkim-signer": "0.2.2", 1722 | "mailcomposer": "3.12.0" 1723 | } 1724 | }, 1725 | "serve-static": { 1726 | "version": "1.14.1", 1727 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1728 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1729 | "dev": true, 1730 | "requires": { 1731 | "encodeurl": "~1.0.2", 1732 | "escape-html": "~1.0.3", 1733 | "parseurl": "~1.3.3", 1734 | "send": "0.17.1" 1735 | } 1736 | }, 1737 | "server-destroy": { 1738 | "version": "1.0.1", 1739 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", 1740 | "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", 1741 | "dev": true 1742 | }, 1743 | "set-blocking": { 1744 | "version": "2.0.0", 1745 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1746 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1747 | "dev": true 1748 | }, 1749 | "setprototypeof": { 1750 | "version": "1.1.1", 1751 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1752 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", 1753 | "dev": true 1754 | }, 1755 | "shebang-command": { 1756 | "version": "1.2.0", 1757 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1758 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1759 | "dev": true, 1760 | "requires": { 1761 | "shebang-regex": "^1.0.0" 1762 | } 1763 | }, 1764 | "shebang-regex": { 1765 | "version": "1.0.0", 1766 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1767 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1768 | "dev": true 1769 | }, 1770 | "signal-exit": { 1771 | "version": "3.0.3", 1772 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1773 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1774 | "dev": true 1775 | }, 1776 | "sshpk": { 1777 | "version": "1.16.1", 1778 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1779 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1780 | "dev": true, 1781 | "requires": { 1782 | "asn1": "~0.2.3", 1783 | "assert-plus": "^1.0.0", 1784 | "bcrypt-pbkdf": "^1.0.0", 1785 | "dashdash": "^1.12.0", 1786 | "ecc-jsbn": "~0.1.1", 1787 | "getpass": "^0.1.1", 1788 | "jsbn": "~0.1.0", 1789 | "safer-buffer": "^2.0.2", 1790 | "tweetnacl": "~0.14.0" 1791 | } 1792 | }, 1793 | "statuses": { 1794 | "version": "1.5.0", 1795 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1796 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 1797 | "dev": true 1798 | }, 1799 | "steno": { 1800 | "version": "0.4.4", 1801 | "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", 1802 | "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=", 1803 | "dev": true, 1804 | "requires": { 1805 | "graceful-fs": "^4.1.3" 1806 | } 1807 | }, 1808 | "string-width": { 1809 | "version": "3.1.0", 1810 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1811 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1812 | "dev": true, 1813 | "requires": { 1814 | "emoji-regex": "^7.0.1", 1815 | "is-fullwidth-code-point": "^2.0.0", 1816 | "strip-ansi": "^5.1.0" 1817 | } 1818 | }, 1819 | "strip-ansi": { 1820 | "version": "5.2.0", 1821 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1822 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1823 | "dev": true, 1824 | "requires": { 1825 | "ansi-regex": "^4.1.0" 1826 | } 1827 | }, 1828 | "strip-eof": { 1829 | "version": "1.0.0", 1830 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1831 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 1832 | "dev": true 1833 | }, 1834 | "strip-json-comments": { 1835 | "version": "2.0.1", 1836 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1837 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1838 | "dev": true 1839 | }, 1840 | "supports-color": { 1841 | "version": "5.5.0", 1842 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1843 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1844 | "dev": true, 1845 | "requires": { 1846 | "has-flag": "^3.0.0" 1847 | } 1848 | }, 1849 | "term-size": { 1850 | "version": "1.2.0", 1851 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", 1852 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", 1853 | "dev": true, 1854 | "requires": { 1855 | "execa": "^0.7.0" 1856 | } 1857 | }, 1858 | "to-readable-stream": { 1859 | "version": "1.0.0", 1860 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", 1861 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", 1862 | "dev": true 1863 | }, 1864 | "toidentifier": { 1865 | "version": "1.0.0", 1866 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1867 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", 1868 | "dev": true 1869 | }, 1870 | "tough-cookie": { 1871 | "version": "2.5.0", 1872 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1873 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1874 | "dev": true, 1875 | "requires": { 1876 | "psl": "^1.1.28", 1877 | "punycode": "^2.1.1" 1878 | } 1879 | }, 1880 | "tunnel-agent": { 1881 | "version": "0.6.0", 1882 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1883 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1884 | "dev": true, 1885 | "requires": { 1886 | "safe-buffer": "^5.0.1" 1887 | } 1888 | }, 1889 | "tweetnacl": { 1890 | "version": "0.14.5", 1891 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1892 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1893 | "dev": true 1894 | }, 1895 | "type-fest": { 1896 | "version": "0.3.1", 1897 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", 1898 | "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", 1899 | "dev": true 1900 | }, 1901 | "type-is": { 1902 | "version": "1.6.18", 1903 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1904 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1905 | "dev": true, 1906 | "requires": { 1907 | "media-typer": "0.3.0", 1908 | "mime-types": "~2.1.24" 1909 | } 1910 | }, 1911 | "unique-string": { 1912 | "version": "1.0.0", 1913 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 1914 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 1915 | "dev": true, 1916 | "requires": { 1917 | "crypto-random-string": "^1.0.0" 1918 | } 1919 | }, 1920 | "unpipe": { 1921 | "version": "1.0.0", 1922 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1923 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 1924 | "dev": true 1925 | }, 1926 | "update-notifier": { 1927 | "version": "3.0.1", 1928 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", 1929 | "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", 1930 | "dev": true, 1931 | "requires": { 1932 | "boxen": "^3.0.0", 1933 | "chalk": "^2.0.1", 1934 | "configstore": "^4.0.0", 1935 | "has-yarn": "^2.1.0", 1936 | "import-lazy": "^2.1.0", 1937 | "is-ci": "^2.0.0", 1938 | "is-installed-globally": "^0.1.0", 1939 | "is-npm": "^3.0.0", 1940 | "is-yarn-global": "^0.3.0", 1941 | "latest-version": "^5.0.0", 1942 | "semver-diff": "^2.0.0", 1943 | "xdg-basedir": "^3.0.0" 1944 | } 1945 | }, 1946 | "uri-js": { 1947 | "version": "4.2.2", 1948 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1949 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1950 | "dev": true, 1951 | "requires": { 1952 | "punycode": "^2.1.0" 1953 | } 1954 | }, 1955 | "url-parse-lax": { 1956 | "version": "3.0.0", 1957 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 1958 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 1959 | "dev": true, 1960 | "requires": { 1961 | "prepend-http": "^2.0.0" 1962 | } 1963 | }, 1964 | "utils-merge": { 1965 | "version": "1.0.1", 1966 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1967 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 1968 | "dev": true 1969 | }, 1970 | "uuid": { 1971 | "version": "3.4.0", 1972 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1973 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 1974 | "dev": true 1975 | }, 1976 | "vary": { 1977 | "version": "1.1.2", 1978 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1979 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 1980 | "dev": true 1981 | }, 1982 | "verror": { 1983 | "version": "1.10.0", 1984 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1985 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1986 | "dev": true, 1987 | "requires": { 1988 | "assert-plus": "^1.0.0", 1989 | "core-util-is": "1.0.2", 1990 | "extsprintf": "^1.2.0" 1991 | } 1992 | }, 1993 | "which": { 1994 | "version": "1.3.1", 1995 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1996 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1997 | "dev": true, 1998 | "requires": { 1999 | "isexe": "^2.0.0" 2000 | } 2001 | }, 2002 | "which-module": { 2003 | "version": "2.0.0", 2004 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2005 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 2006 | "dev": true 2007 | }, 2008 | "widest-line": { 2009 | "version": "2.0.1", 2010 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", 2011 | "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", 2012 | "dev": true, 2013 | "requires": { 2014 | "string-width": "^2.1.1" 2015 | }, 2016 | "dependencies": { 2017 | "ansi-regex": { 2018 | "version": "3.0.0", 2019 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2020 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2021 | "dev": true 2022 | }, 2023 | "string-width": { 2024 | "version": "2.1.1", 2025 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2026 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2027 | "dev": true, 2028 | "requires": { 2029 | "is-fullwidth-code-point": "^2.0.0", 2030 | "strip-ansi": "^4.0.0" 2031 | } 2032 | }, 2033 | "strip-ansi": { 2034 | "version": "4.0.0", 2035 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2036 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2037 | "dev": true, 2038 | "requires": { 2039 | "ansi-regex": "^3.0.0" 2040 | } 2041 | } 2042 | } 2043 | }, 2044 | "wrap-ansi": { 2045 | "version": "5.1.0", 2046 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 2047 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 2048 | "dev": true, 2049 | "requires": { 2050 | "ansi-styles": "^3.2.0", 2051 | "string-width": "^3.0.0", 2052 | "strip-ansi": "^5.0.0" 2053 | } 2054 | }, 2055 | "wrappy": { 2056 | "version": "1.0.2", 2057 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2058 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2059 | "dev": true 2060 | }, 2061 | "write-file-atomic": { 2062 | "version": "2.4.3", 2063 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", 2064 | "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", 2065 | "dev": true, 2066 | "requires": { 2067 | "graceful-fs": "^4.1.11", 2068 | "imurmurhash": "^0.1.4", 2069 | "signal-exit": "^3.0.2" 2070 | } 2071 | }, 2072 | "xdg-basedir": { 2073 | "version": "3.0.0", 2074 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 2075 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", 2076 | "dev": true 2077 | }, 2078 | "y18n": { 2079 | "version": "4.0.0", 2080 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 2081 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 2082 | "dev": true 2083 | }, 2084 | "yallist": { 2085 | "version": "2.1.2", 2086 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2087 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 2088 | "dev": true 2089 | }, 2090 | "yargs": { 2091 | "version": "14.2.3", 2092 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", 2093 | "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", 2094 | "dev": true, 2095 | "requires": { 2096 | "cliui": "^5.0.0", 2097 | "decamelize": "^1.2.0", 2098 | "find-up": "^3.0.0", 2099 | "get-caller-file": "^2.0.1", 2100 | "require-directory": "^2.1.1", 2101 | "require-main-filename": "^2.0.0", 2102 | "set-blocking": "^2.0.0", 2103 | "string-width": "^3.0.0", 2104 | "which-module": "^2.0.0", 2105 | "y18n": "^4.0.0", 2106 | "yargs-parser": "^15.0.1" 2107 | } 2108 | }, 2109 | "yargs-parser": { 2110 | "version": "15.0.1", 2111 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", 2112 | "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", 2113 | "dev": true, 2114 | "requires": { 2115 | "camelcase": "^5.0.0", 2116 | "decamelize": "^1.2.0" 2117 | } 2118 | } 2119 | } 2120 | } 2121 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "todomvc-testing", 3 | "version": "1.0.0", 4 | "description": "Testing TodoMVC using Cypress", 5 | "scripts": { 6 | "start": "./node_modules/.bin/json-server --static . data.json -m middleware.js --config json-server.json" 7 | }, 8 | "devDependencies": { 9 | "json-server": "0.15.1", 10 | "sendmail": "^1.6.1" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /vendor/Sortable.min.js: -------------------------------------------------------------------------------- 1 | /*! Sortable 1.8.4 - MIT | git://github.com/SortableJS/Sortable.git */ 2 | 3 | !function(t){"use strict";"function"==typeof define&&define.amd?define(t):"undefined"!=typeof module&&void 0!==module.exports?module.exports=t():window.Sortable=t()}(function(){"use strict";if("undefined"==typeof window||!window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var U,V,f,u,q,G,h,X,Y,A,K,n,Z,Q,l,s,c,p,k,J,$,tt,et,ot,g,nt,I=[],B=!1,v=!1,it=!1,d=[],rt=!1,at=!1,m=[],i=/\s+/g,lt="Sortable"+(new Date).getTime(),b=window,st=b.document,w=b.parseInt,ct=b.setTimeout,e=b.jQuery||b.Zepto,o=b.Polymer,r={capture:!1,passive:!1},dt=!!navigator.userAgent.match(/(?:Trident.*rv[ :]?11\.|msie|iemobile)/i),_=!!navigator.userAgent.match(/Edge/i),y=!!navigator.userAgent.match(/firefox/i),D=!(!navigator.userAgent.match(/safari/i)||navigator.userAgent.match(/chrome/i)||navigator.userAgent.match(/android/i)),S=!!navigator.userAgent.match(/iP(ad|od|hone)/i),T=_||dt?"cssFloat":"float",a="draggable"in st.createElement("div"),C=function(){if(dt)return!1;var t=st.createElement("x");return t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents}(),ht=!1,E=!1,ut=Math.abs,x=Math.min,N=Math.max,M=[],P=function(t,e){var o=Dt(t),n=w(o.width)-w(o.paddingLeft)-w(o.paddingRight)-w(o.borderLeftWidth)-w(o.borderRightWidth),i=Mt(t,0,e),r=Mt(t,1,e),a=i&&Dt(i),l=r&&Dt(r),s=a&&w(a.marginLeft)+w(a.marginRight)+Lt(i).width,c=l&&w(l.marginLeft)+w(l.marginRight)+Lt(r).width;if("flex"===o.display)return"column"===o.flexDirection||"column-reverse"===o.flexDirection?"vertical":"horizontal";if("grid"===o.display)return o.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(i&&"none"!==a.float){var d="left"===a.float?"left":"right";return!r||"both"!==l.clear&&l.clear!==d?"horizontal":"vertical"}return i&&("block"===a.display||"flex"===a.display||"table"===a.display||"grid"===a.display||n<=s&&"none"===o[T]||r&&"none"===o[T]&&n=n.left-i&&t<=n.right+i,a=e>=n.top-i&&e<=n.bottom+i;if(r&&a)return d[o]}}(t.clientX,t.clientY);e&&e[lt]._onDragOver({clientX:t.clientX,clientY:t.clientY,target:e,rootEl:e})}};function mt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be HTMLElement, not "+{}.toString.call(t);this.el=t,this.options=e=Bt({},e),t[lt]=this;var o={group:null,sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0,draggable:/[uo]l/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return P(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,touchStartThreshold:w(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==mt.supportPointer&&("PointerEvent"in window||window.navigator&&"msPointerEnabled"in window.navigator),emptyInsertThreshold:5};for(var n in o)!(n in e)&&(e[n]=o[n]);for(var i in W(e),this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!e.forceFallback&&a,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?wt(t,"pointerdown",this._onTapStart):(wt(t,"mousedown",this._onTapStart),wt(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(wt(t,"dragover",this),wt(t,"dragenter",this)),d.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[])}function bt(t,e,o,n){if(t){o=o||st;do{if(null!=e&&(">"===e[0]&&t.parentNode===o&&kt(t,e.substring(1))||kt(t,e))||n&&t===o)return t;if(t===o)break}while(t=(i=t).host&&i!==st&&i.host.nodeType?i.host:i.parentNode)}var i;return null}function wt(t,e,o){t.addEventListener(e,o,r)}function _t(t,e,o){t.removeEventListener(e,o,r)}function yt(t,e,o){if(t&&e)if(t.classList)t.classList[o?"add":"remove"](e);else{var n=(" "+t.className+" ").replace(i," ").replace(" "+e+" "," ");t.className=(n+(o?" "+e:"")).replace(i," ")}}function Dt(t,e,o){var n=t&&t.style;if(n){if(void 0===o)return st.defaultView&&st.defaultView.getComputedStyle?o=st.defaultView.getComputedStyle(t,""):t.currentStyle&&(o=t.currentStyle),void 0===e?o:o[e];e in n||-1!==e.indexOf("webkit")||(e="-webkit-"+e),n[e]=o+("string"==typeof o?"":"px")}}function St(t){var e="";do{var o=Dt(t,"transform");o&&"none"!==o&&(e=o+" "+e)}while(t=t.parentNode);return window.DOMMatrix?new DOMMatrix(e):window.WebKitCSSMatrix?new WebKitCSSMatrix(e):window.CSSMatrix?new CSSMatrix(e):void 0}function Tt(t,e,o){if(t){var n=t.getElementsByTagName(e),i=0,r=n.length;if(o)for(;i=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){U&&xt(U),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;_t(t,"mouseup",this._disableDelayedDrag),_t(t,"touchend",this._disableDelayedDrag),_t(t,"touchcancel",this._disableDelayedDrag),_t(t,"mousemove",this._delayedDragTouchMoveHandler),_t(t,"touchmove",this._delayedDragTouchMoveHandler),_t(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||("touch"==t.pointerType?t:null),!this.nativeDraggable||e?this.options.supportPointer?wt(st,"pointermove",this._onTouchMove):wt(st,e?"touchmove":"mousemove",this._onTouchMove):(wt(U,"dragend",this),wt(q,"dragstart",this._onDragStart));try{st.selection?Ht(function(){st.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){if(v=!1,q&&U){this.nativeDraggable&&(wt(st,"dragover",this._handleAutoScroll),wt(st,"dragover",F));var o=this.options;!t&&yt(U,o.dragClass,!1),yt(U,o.ghostClass,!0),Dt(U,"transform",""),mt.active=this,t&&this._appendGhost(),Ct(this,q,"start",U,q,q,K,void 0,e)}else this._nulling()},_emulateDragOver:function(t){if(k){if(this._lastX===k.clientX&&this._lastY===k.clientY&&!t)return;this._lastX=k.clientX,this._lastY=k.clientY,z();for(var e=st.elementFromPoint(k.clientX,k.clientY),o=e;e&&e.shadowRoot;)o=e=e.shadowRoot.elementFromPoint(k.clientX,k.clientY);if(o)do{if(o[lt])if(o[lt]._onDragOver({clientX:k.clientX,clientY:k.clientY,target:e,rootEl:o})&&!this.options.dragoverBubble)break;e=o}while(o=o.parentNode);U.parentNode[lt]._computeIsAligned(k),j()}},_onTouchMove:function(t,e){if(p){var o=this.options,n=o.fallbackTolerance,i=o.fallbackOffset,r=t.touches?t.touches[0]:t,a=f&&St(f),l=f&&a&&a.a,s=f&&a&&a.d,c=S&&g&&Ft(g),d=(r.clientX-p.clientX+i.x)/(l||1)+(c?c[0]-m[0]:0)/(l||1),h=(r.clientY-p.clientY+i.y)/(s||1)+(c?c[1]-m[1]:0)/(s||1),u=t.touches?"translate3d("+d+"px,"+h+"px,0)":"translate("+d+"px,"+h+"px)";if(!mt.active&&!v){if(n&&x(ut(r.clientX-this._lastX),ut(r.clientY-this._lastY)) 6 | * @license MIT 7 | */ 8 | e.exports = function(e){return null != e && (n(e) || r(e) || !!e._isBuffer);};}, function(e, t, n){'use strict';function r(e){this.defaults = e, this.interceptors = {request: new s, response: new s};}var o = n(6), i = n(2), s = n(17), u = n(18);r.prototype.request = function(e){'string' == typeof e && (e = i.merge({url: arguments[0]}, arguments[1])), e = i.merge(o, this.defaults, {method: 'get'}, e), e.method = e.method.toLowerCase();var t = [u, void 0], n = Promise.resolve(e);for(this.interceptors.request.forEach(function(e){t.unshift(e.fulfilled, e.rejected);}), this.interceptors.response.forEach(function(e){t.push(e.fulfilled, e.rejected);});t.length;)n = n.then(t.shift(), t.shift());return n;}, i.forEach(['delete', 'get', 'head', 'options'], function(e){r.prototype[e] = function(t, n){return this.request(i.merge(n || {}, {method: e, url: t}));};}), i.forEach(['post', 'put', 'patch'], function(e){r.prototype[e] = function(t, n, r){return this.request(i.merge(r || {}, {method: e, url: t, data: n}));};}), e.exports = r;}, function(e, t, n){'use strict';function r(e, t){!i.isUndefined(e) && i.isUndefined(e['Content-Type']) && (e['Content-Type'] = t);}function o(){var e;return'undefined' != typeof XMLHttpRequest ? e = n(8) : 'undefined' != typeof process && (e = n(8)), e;}var i = n(2), s = n(7), u = {'Content-Type': 'application/x-www-form-urlencoded'}, a = {adapter: o(), transformRequest: [function(e, t){return s(t, 'Content-Type'), i.isFormData(e) || i.isArrayBuffer(e) || i.isBuffer(e) || i.isStream(e) || i.isFile(e) || i.isBlob(e) ? e : i.isArrayBufferView(e) ? e.buffer : i.isURLSearchParams(e) ? (r(t, 'application/x-www-form-urlencoded;charset=utf-8'), e.toString()) : i.isObject(e) ? (r(t, 'application/json;charset=utf-8'), JSON.stringify(e)) : e;}], transformResponse: [function(e){if('string' == typeof e)try{e = JSON.parse(e);}catch(e){}return e;}], timeout: 0, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, validateStatus: function(e){return e >= 200 && e < 300;}};a.headers = {common: {Accept: 'application/json, text/plain, */*'}}, i.forEach(['delete', 'get', 'head'], function(e){a.headers[e] = {};}), i.forEach(['post', 'put', 'patch'], function(e){a.headers[e] = i.merge(u);}), e.exports = a;}, function(e, t, n){'use strict';var r = n(2);e.exports = function(e, t){r.forEach(e, function(n, r){r !== t && r.toUpperCase() === t.toUpperCase() && (e[t] = n, delete e[r]);});};}, function(e, t, n){'use strict';var r = n(2), o = n(9), i = n(12), s = n(13), u = n(14), a = n(10), c = 'undefined' != typeof window && window.btoa && window.btoa.bind(window) || n(15);e.exports = function(e){return new Promise(function(t, f){var p = e.data, d = e.headers;r.isFormData(p) && delete d['Content-Type'];var l = new XMLHttpRequest, h = 'onreadystatechange', m = !1;if('undefined' == typeof window || !window.XDomainRequest || 'withCredentials' in l || u(e.url) || (l = new window.XDomainRequest, h = 'onload', m = !0, l.onprogress = function(){}, l.ontimeout = function(){}), e.auth){var y = e.auth.username || '', w = e.auth.password || '';d.Authorization = 'Basic ' + c(y + ':' + w);}if(l.open(e.method.toUpperCase(), i(e.url, e.params, e.paramsSerializer), !0), l.timeout = e.timeout, l[h] = function(){if(l && (4 === l.readyState || m) && (0 !== l.status || l.responseURL && 0 === l.responseURL.indexOf('file:'))){var n = 'getAllResponseHeaders' in l ? s(l.getAllResponseHeaders()) : null, r = e.responseType && 'text' !== e.responseType ? l.response : l.responseText, i = {data: r, status: 1223 === l.status ? 204 : l.status, statusText: 1223 === l.status ? 'No Content' : l.statusText, headers: n, config: e, request: l};o(t, f, i), l = null;}}, l.onerror = function(){f(a('Network Error', e, null, l)), l = null;}, l.ontimeout = function(){f(a('timeout of ' + e.timeout + 'ms exceeded', e, 'ECONNABORTED', l)), l = null;}, r.isStandardBrowserEnv()){var g = n(16), v = (e.withCredentials || u(e.url)) && e.xsrfCookieName ? g.read(e.xsrfCookieName) : void 0;v && (d[e.xsrfHeaderName] = v);}if('setRequestHeader' in l && r.forEach(d, function(e, t){'undefined' == typeof p && 'content-type' === t.toLowerCase() ? delete d[t] : l.setRequestHeader(t, e);}), e.withCredentials && (l.withCredentials = !0), e.responseType)try{l.responseType = e.responseType;}catch(t){if('json' !== e.responseType)throw t;}'function' == typeof e.onDownloadProgress && l.addEventListener('progress', e.onDownloadProgress), 'function' == typeof e.onUploadProgress && l.upload && l.upload.addEventListener('progress', e.onUploadProgress), e.cancelToken && e.cancelToken.promise.then(function(e){l && (l.abort(), f(e), l = null);}), void 0 === p && (p = null), l.send(p);});};}, function(e, t, n){'use strict';var r = n(10);e.exports = function(e, t, n){var o = n.config.validateStatus;n.status && o && !o(n.status) ? t(r('Request failed with status code ' + n.status, n.config, null, n.request, n)) : e(n);};}, function(e, t, n){'use strict';var r = n(11);e.exports = function(e, t, n, o, i){var s = new Error(e);return r(s, t, n, o, i);};}, function(e, t){'use strict';e.exports = function(e, t, n, r, o){return e.config = t, n && (e.code = n), e.request = r, e.response = o, e;};}, function(e, t, n){'use strict';function r(e){return encodeURIComponent(e).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');}var o = n(2);e.exports = function(e, t, n){if(!t)return e;var i;if(n)i = n(t);else if(o.isURLSearchParams(t))i = t.toString();else{var s = [];o.forEach(t, function(e, t){null !== e && 'undefined' != typeof e && (o.isArray(e) && (t += '[]'), o.isArray(e) || (e = [e]), o.forEach(e, function(e){o.isDate(e) ? e = e.toISOString() : o.isObject(e) && (e = JSON.stringify(e)), s.push(r(t) + '=' + r(e));}));}), i = s.join('&');}return i && (e += (e.indexOf('?') === -1 ? '?' : '&') + i), e;};}, function(e, t, n){'use strict';var r = n(2), o = ['age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', 'referer', 'retry-after', 'user-agent'];e.exports = function(e){var t, n, i, s = {};return e ? (r.forEach(e.split('\n'), function(e){if(i = e.indexOf(':'), t = r.trim(e.substr(0, i)).toLowerCase(), n = r.trim(e.substr(i + 1)), t){if(s[t] && o.indexOf(t) >= 0)return;'set-cookie' === t ? s[t] = (s[t] ? s[t] : []).concat([n]) : s[t] = s[t] ? s[t] + ', ' + n : n;}}), s) : s;};}, function(e, t, n){'use strict';var r = n(2);e.exports = r.isStandardBrowserEnv() ? function(){function e(e){var t = e;return n && (o.setAttribute('href', t), t = o.href), o.setAttribute('href', t), {href: o.href, protocol: o.protocol ? o.protocol.replace(/:$/, '') : '', host: o.host, search: o.search ? o.search.replace(/^\?/, '') : '', hash: o.hash ? o.hash.replace(/^#/, '') : '', hostname: o.hostname, port: o.port, pathname: '/' === o.pathname.charAt(0) ? o.pathname : '/' + o.pathname};}var t, n = /(msie|trident)/i.test(navigator.userAgent), o = document.createElement('a');return t = e(window.location.href), function(n){var o = r.isString(n) ? e(n) : n;return o.protocol === t.protocol && o.host === t.host;};}() : function(){return function(){return!0;};}();}, function(e, t){'use strict';function n(){this.message = 'String contains an invalid character';}function r(e){for(var t, r, i = String(e), s = '', u = 0, a = o;i.charAt(0 | u) || (a = '=', u % 1);s += a.charAt(63 & t >> 8 - u % 1 * 8)){if(r = i.charCodeAt(u += .75), r > 255)throw new n;t = t << 8 | r;}return s;}var o = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';n.prototype = new Error, n.prototype.code = 5, n.prototype.name = 'InvalidCharacterError', e.exports = r;}, function(e, t, n){'use strict';var r = n(2);e.exports = r.isStandardBrowserEnv() ? function(){return{write: function(e, t, n, o, i, s){var u = [];u.push(e + '=' + encodeURIComponent(t)), r.isNumber(n) && u.push('expires=' + new Date(n).toGMTString()), r.isString(o) && u.push('path=' + o), r.isString(i) && u.push('domain=' + i), s === !0 && u.push('secure'), document.cookie = u.join('; ');}, read: function(e){var t = document.cookie.match(new RegExp('(^|;\\s*)(' + e + ')=([^;]*)'));return t ? decodeURIComponent(t[3]) : null;}, remove: function(e){this.write(e, '', Date.now() - 864e5);}};}() : function(){return{write: function(){}, read: function(){return null;}, remove: function(){}};}();}, function(e, t, n){'use strict';function r(){this.handlers = [];}var o = n(2);r.prototype.use = function(e, t){return this.handlers.push({fulfilled: e, rejected: t}), this.handlers.length - 1;}, r.prototype.eject = function(e){this.handlers[e] && (this.handlers[e] = null);}, r.prototype.forEach = function(e){o.forEach(this.handlers, function(t){null !== t && e(t);});}, e.exports = r;}, function(e, t, n){'use strict';function r(e){e.cancelToken && e.cancelToken.throwIfRequested();}var o = n(2), i = n(19), s = n(20), u = n(6), a = n(21), c = n(22);e.exports = function(e){r(e), e.baseURL && !a(e.url) && (e.url = c(e.baseURL, e.url)), e.headers = e.headers || {}, e.data = i(e.data, e.headers, e.transformRequest), e.headers = o.merge(e.headers.common || {}, e.headers[e.method] || {}, e.headers || {}), o.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function(t){delete e.headers[t];});var t = e.adapter || u.adapter;return t(e).then(function(t){return r(e), t.data = i(t.data, t.headers, e.transformResponse), t;}, function(t){return s(t) || (r(e), t && t.response && (t.response.data = i(t.response.data, t.response.headers, e.transformResponse))), Promise.reject(t);});};}, function(e, t, n){'use strict';var r = n(2);e.exports = function(e, t, n){return r.forEach(n, function(n){e = n(e, t);}), e;};}, function(e, t){'use strict';e.exports = function(e){return!(!e || !e.__CANCEL__);};}, function(e, t){'use strict';e.exports = function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e);};}, function(e, t){'use strict';e.exports = function(e, t){return t ? e.replace(/\/+$/, '') + '/' + t.replace(/^\/+/, '') : e;};}, function(e, t){'use strict';function n(e){this.message = e;}n.prototype.toString = function(){return'Cancel' + (this.message ? ': ' + this.message : '');}, n.prototype.__CANCEL__ = !0, e.exports = n;}, function(e, t, n){'use strict';function r(e){if('function' != typeof e)throw new TypeError('executor must be a function.');var t;this.promise = new Promise(function(e){t = e;});var n = this;e(function(e){n.reason || (n.reason = new o(e), t(n.reason));});}var o = n(23);r.prototype.throwIfRequested = function(){if(this.reason)throw this.reason;}, r.source = function(){var e, t = new r(function(t){e = t;});return{token: t, cancel: e};}, e.exports = r;}, function(e, t){'use strict';e.exports = function(e){return function(t){return e.apply(null, t);};};}]);}); 9 | //# sourceMappingURL=axios.min.map -------------------------------------------------------------------------------- /vendor/cypress-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filiphric/testing-lists/11b0ed7c1653e6661a3b995cb0ff0807d9c1304f/vendor/cypress-icon.png -------------------------------------------------------------------------------- /vendor/index.css: -------------------------------------------------------------------------------- 1 | /* 2 | TodoMVC css from https://github.com/cypress-io/todomvc-app-css fork 3 | with improved contrast. You can install it using 4 | 5 | npm i -S cypress-io/todomvc-app-css#a9d4ea1 6 | 7 | but to keep this app simple, vendor files are checked in 8 | */ 9 | html, 10 | body { 11 | margin: 0; 12 | padding: 0; 13 | } 14 | 15 | button.login-button, button.signup-button { 16 | background: #b83f45; 17 | cursor: pointer; 18 | border: none; 19 | color: white; 20 | padding: 15px 32px; 21 | text-align: center; 22 | text-decoration: none; 23 | display: inline-block; 24 | font-size: 16px; 25 | margin: 0 auto; 26 | box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 27 | 0 25px 50px 0 rgba(0, 0, 0, 0.1); 28 | } 29 | 30 | button.login-button:hover, button.signup-button:hover { 31 | background: #943338; 32 | 33 | } 34 | 35 | button { 36 | margin: 0; 37 | padding: 0; 38 | border: 0; 39 | background: none; 40 | font-size: 100%; 41 | vertical-align: baseline; 42 | font-family: inherit; 43 | font-weight: inherit; 44 | color: inherit; 45 | -webkit-appearance: none; 46 | appearance: none; 47 | -webkit-font-smoothing: antialiased; 48 | -moz-osx-font-smoothing: grayscale; 49 | } 50 | 51 | body { 52 | font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif; 53 | line-height: 1.4em; 54 | background: #f5f5f5; 55 | color: #4d4d4d; 56 | min-width: 230px; 57 | max-width: 550px; 58 | margin: 0 auto; 59 | -webkit-font-smoothing: antialiased; 60 | -moz-osx-font-smoothing: grayscale; 61 | font-weight: 300; 62 | } 63 | 64 | :focus { 65 | outline: 0; 66 | } 67 | 68 | .hidden { 69 | display: none; 70 | } 71 | 72 | .todoapp, .login, .signup { 73 | z-index: 0; 74 | background: #fff; 75 | margin: 0px 0 40px 0; 76 | position: relative; 77 | box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 78 | 0 25px 50px 0 rgba(0, 0, 0, 0.1); 79 | } 80 | 81 | .todoapp input::-webkit-input-placeholder { 82 | font-style: italic; 83 | font-weight: 300; 84 | color: #111111; 85 | } 86 | 87 | .todoapp input::-moz-placeholder { 88 | font-style: italic; 89 | font-weight: 300; 90 | color: #111111; 91 | } 92 | 93 | .todoapp input::input-placeholder { 94 | font-style: italic; 95 | font-weight: 300; 96 | color: #111111; 97 | } 98 | 99 | .todoapp h1, h1 { 100 | position: relative; 101 | /* top: -155px; */ 102 | width: 100%; 103 | font-size: 100px; 104 | font-weight: 100; 105 | text-align: center; 106 | color: #b83f45; 107 | -webkit-text-rendering: optimizeLegibility; 108 | -moz-text-rendering: optimizeLegibility; 109 | text-rendering: optimizeLegibility; 110 | margin-block-end: 1em; 111 | } 112 | 113 | .new-todo, 114 | .edit { 115 | position: relative; 116 | margin: 0; 117 | width: 100%; 118 | font-size: 24px; 119 | font-family: inherit; 120 | font-weight: inherit; 121 | line-height: 1.4em; 122 | color: inherit; 123 | padding: 6px; 124 | border: 1px solid #999; 125 | box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2); 126 | box-sizing: border-box; 127 | -webkit-font-smoothing: antialiased; 128 | -moz-osx-font-smoothing: grayscale; 129 | } 130 | 131 | .new-todo, .login input, .signup input { 132 | padding: 16px 16px 16px 60px; 133 | border: none; 134 | background: rgba(0, 0, 0, 0.003); 135 | box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03); 136 | } 137 | 138 | .main { 139 | position: relative; 140 | z-index: 2; 141 | border-top: 1px solid #111111; 142 | } 143 | 144 | .toggle-all { 145 | width: 1px; 146 | height: 1px; 147 | border: none; /* Mobile Safari */ 148 | opacity: 0; 149 | position: absolute; 150 | right: 100%; 151 | bottom: 100%; 152 | } 153 | 154 | .toggle-all + label { 155 | width: 60px; 156 | height: 34px; 157 | font-size: 0; 158 | position: absolute; 159 | top: -52px; 160 | left: -13px; 161 | -webkit-transform: rotate(90deg); 162 | transform: rotate(90deg); 163 | } 164 | 165 | .toggle-all + label:before { 166 | content: '❯'; 167 | font-size: 22px; 168 | color: #111111; 169 | padding: 10px 27px 10px 27px; 170 | } 171 | 172 | .toggle-all:checked + label:before { 173 | color: #737373; 174 | } 175 | 176 | .todo-list { 177 | margin: 0; 178 | padding: 0; 179 | list-style: none; 180 | } 181 | 182 | .todo-list li { 183 | position: relative; 184 | font-size: 24px; 185 | border-bottom: 1px solid #ededed; 186 | } 187 | 188 | .todo-list li:last-child { 189 | border-bottom: none; 190 | } 191 | 192 | .todo-list li.editing { 193 | border-bottom: none; 194 | padding: 0; 195 | } 196 | 197 | .todo-list li.editing .edit { 198 | display: block; 199 | width: calc(100% - 43px); 200 | padding: 12px 16px; 201 | margin: 0 0 0 43px; 202 | } 203 | 204 | .todo-list li.editing .view { 205 | display: none; 206 | } 207 | 208 | .todo-list li .toggle { 209 | text-align: center; 210 | width: 40px; 211 | /* auto, since non-WebKit browsers doesn't support input styling */ 212 | height: auto; 213 | position: absolute; 214 | top: 0; 215 | bottom: 0; 216 | margin: auto 0; 217 | border: none; /* Mobile Safari */ 218 | -webkit-appearance: none; 219 | appearance: none; 220 | } 221 | 222 | .todo-list li .toggle { 223 | opacity: 0; 224 | } 225 | 226 | .todo-list li .toggle + label { 227 | /* 228 | Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433 229 | 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/ 230 | */ 231 | 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'); 232 | background-repeat: no-repeat; 233 | background-position: center left; 234 | background-color: #fff; 235 | } 236 | 237 | .todo-list li .toggle:checked + label { 238 | 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'); 239 | } 240 | 241 | .todo-list li label { 242 | word-break: break-all; 243 | padding: 15px 15px 15px 60px; 244 | display: block; 245 | line-height: 1.2; 246 | transition: color 0.4s; 247 | } 248 | 249 | .todo-list li.completed label { 250 | color: #d9d9d9; 251 | text-decoration: line-through; 252 | } 253 | 254 | .todo-list li .destroy { 255 | display: block; 256 | position: absolute; 257 | top: 0; 258 | right: 10px; 259 | bottom: 0; 260 | width: 40px; 261 | height: 40px; 262 | margin: auto 0; 263 | font-size: 30px; 264 | color: #cc9a9a; 265 | margin-bottom: 11px; 266 | transition: color 0.2s ease-out; 267 | font-weight: 600; 268 | } 269 | 270 | .active { 271 | display: block !important; 272 | color: #ff0101; 273 | } 274 | 275 | /* .todo-list li .destroy:hover { 276 | color: #ff0101; 277 | } */ 278 | 279 | .todo-list li .destroy:after { 280 | content: '×'; 281 | } 282 | 283 | /* .todo-list li:hover .destroy { 284 | display: block; 285 | } */ 286 | 287 | .todo-list li .edit { 288 | display: none; 289 | } 290 | 291 | .todo-list li.editing:last-child { 292 | margin-bottom: -1px; 293 | } 294 | 295 | .footer { 296 | padding: 10px 15px; 297 | height: 20px; 298 | text-align: center; 299 | border-top: 1px solid #111111; 300 | font-weight: 400; 301 | } 302 | 303 | .footer:before { 304 | content: ''; 305 | position: absolute; 306 | right: 0; 307 | bottom: 0; 308 | left: 0; 309 | height: 50px; 310 | overflow: hidden; 311 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 312 | 0 8px 0 -3px #f6f6f6, 313 | 0 9px 1px -3px rgba(0, 0, 0, 0.2), 314 | 0 16px 0 -6px #f6f6f6, 315 | 0 17px 2px -6px rgba(0, 0, 0, 0.2); 316 | } 317 | 318 | .todo-count { 319 | float: left; 320 | text-align: left; 321 | } 322 | 323 | .todo-count strong { 324 | font-weight: 800; 325 | } 326 | 327 | .filters { 328 | margin: 0; 329 | padding: 0; 330 | list-style: none; 331 | position: absolute; 332 | right: 0; 333 | left: 0; 334 | } 335 | 336 | .filters li { 337 | display: inline; 338 | } 339 | 340 | .filters li a { 341 | color: inherit; 342 | margin: 3px; 343 | padding: 3px 7px; 344 | text-decoration: none; 345 | border: 1px solid transparent; 346 | border-radius: 3px; 347 | } 348 | 349 | .filters li a:hover { 350 | border-color: rgba(175, 47, 47, 0.1); 351 | } 352 | 353 | .filters li a.selected { 354 | border-color: rgba(175, 47, 47, 0.2); 355 | } 356 | 357 | .clear-completed, 358 | html .clear-completed:active { 359 | float: right; 360 | position: relative; 361 | line-height: 20px; 362 | text-decoration: none; 363 | cursor: pointer; 364 | } 365 | 366 | .clear-completed:hover { 367 | text-decoration: underline; 368 | } 369 | 370 | .info { 371 | margin: 65px auto 0; 372 | color: #4d4d4d; 373 | font-size: 10px; 374 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 375 | text-align: center; 376 | } 377 | 378 | .info p { 379 | line-height: 1; 380 | } 381 | 382 | .info a { 383 | color: inherit; 384 | text-decoration: none; 385 | font-weight: 400; 386 | } 387 | 388 | .info a:hover { 389 | text-decoration: underline; 390 | } 391 | 392 | /* 393 | Hack to remove background from Mobile Safari. 394 | Can't use it globally since it destroys checkboxes in Firefox 395 | */ 396 | @media screen and (-webkit-min-device-pixel-ratio:0) { 397 | .toggle-all, 398 | .todo-list li .toggle { 399 | background: none; 400 | } 401 | 402 | .todo-list li .toggle { 403 | height: 40px; 404 | } 405 | } 406 | 407 | @media (max-width: 430px) { 408 | .footer { 409 | height: 50px; 410 | } 411 | 412 | .filters { 413 | bottom: 10px; 414 | } 415 | } 416 | 417 | .login input, .signup input { 418 | position: relative; 419 | margin: 0; 420 | width: 100%; 421 | font-size: 24px; 422 | font-family: inherit; 423 | font-weight: inherit; 424 | line-height: 1.4em; 425 | color: inherit; 426 | padding: 6px; 427 | /* border: 1px solid #999; */ 428 | /* box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2); */ 429 | box-sizing: border-box; 430 | -webkit-font-smoothing: antialiased; 431 | -moz-osx-font-smoothing: grayscale; 432 | padding: 16px 16px 16px 60px; 433 | /* border: none; */ 434 | background: #fff; 435 | box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03); 436 | } 437 | 438 | #errorMessage { 439 | -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); 440 | -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); 441 | background: #f85252; 442 | top: -50px; 443 | height: 24px; 444 | padding: 16px; 445 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); 446 | color: #fff; 447 | font-weight: 300; 448 | left: 0; 449 | line-height: 1.4em; 450 | font-size: 18px; 451 | overflow: hidden; 452 | position: absolute; 453 | right: 0; 454 | text-align: center; 455 | z-index: 101; 456 | animation-name: slideDown; 457 | animation-duration: 4s; 458 | } 459 | 460 | #loginMessage, #signupMessage { 461 | -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); 462 | -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); 463 | background: #58BC82; 464 | top: -50px; 465 | height: 24px; 466 | padding: 16px; 467 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); 468 | color: #fff; 469 | font-weight: 300; 470 | left: 0; 471 | line-height: 1.4em; 472 | font-size: 18px; 473 | overflow: hidden; 474 | position: absolute; 475 | right: 0; 476 | text-align: center; 477 | z-index: 101; 478 | animation-name: slideDown; 479 | animation-duration: 4s; 480 | } 481 | 482 | @-webkit-keyframes slideDown { 483 | 10%, 90% { -webkit-transform: translateY(50px); } 484 | 0%, 100% { -webkit-transform: translateY(0px); } 485 | } 486 | @-moz-keyframes slideDown { 487 | 10%, 90% { -moz-transform: translateY(50px); } 488 | 0%, 100% { -moz-transform: translateY(0px); } 489 | } 490 | 491 | @-webkit-keyframes slideUp { 492 | 0%, 100% { -webkit-transform: translateY(50px); } 493 | 10%, 90% { -webkit-transform: translateY(0px); } 494 | } 495 | @-moz-keyframes slideUp { 496 | 0%, 100% { -moz-transform: translateY(50px); } 497 | 10%, 90% { -moz-transform: translateY(0px); } 498 | } -------------------------------------------------------------------------------- /vendor/vue-observe-visibility.min.js: -------------------------------------------------------------------------------- 1 | var VueObserveVisibility = function(e){'use strict';function t(e){return(t = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function(e){return typeof e;} : function(e){return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e;})(e);}function i(e, t){for(var i = 0;i < t.length;i++){var n = t[i];n.enumerable = n.enumerable || !1, n.configurable = !0, 'value' in n && (n.writable = !0), Object.defineProperty(e, n.key, n);}}function n(e){return function(e){if(Array.isArray(e)){for(var t = 0, i = new Array(e.length);t < e.length;t++)i[t] = e[t];return i;}}(e) || function(e){if(Symbol.iterator in Object(e) || '[object Arguments]' === Object.prototype.toString.call(e))return Array.from(e);}(e) || function(){throw new TypeError('Invalid attempt to spread non-iterable instance');}();}var r = function(){function e(t, i, n){!function(e, t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function');}(this, e), this.el = t, this.observer = null, this.frozen = !1, this.createObserver(i, n);}var t, r, o;return t = e, (r = [{key: 'createObserver', value: function(e, t){var i = this;if(this.observer && this.destroyObserver(), !this.frozen){var r;if(this.options = 'function' == typeof(r = e) ? {callback: r} : r, this.callback = function(e, t){i.options.callback(e, t), e && i.options.once && (i.frozen = !0, i.destroyObserver());}, this.callback && this.options.throttle){var o = (this.options.throttleOptions || {}).leading;this.callback = function(e, t){var i, r, o, l = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, s = function(s){for(var a = arguments.length, c = new Array(a > 1 ? a - 1 : 0), u = 1;u < a;u++)c[u - 1] = arguments[u];if(o = c, !i || s !== r){var f = l.leading;'function' == typeof f && (f = f(s, r)), i && s === r || !f || e.apply(void 0, [s].concat(n(o))), r = s, clearTimeout(i), i = setTimeout(function(){e.apply(void 0, [s].concat(n(o))), i = 0;}, t);}};return s._clear = function(){clearTimeout(i), i = null;}, s;}(this.callback, this.options.throttle, {leading: function(e){return'both' === o || 'visible' === o && e || 'hidden' === o && !e;}});}this.oldResult = void 0, this.observer = new IntersectionObserver(function(e){var t = e[0];if(e.length > 1){var n = e.find(function(e){return e.isIntersecting;});n && (t = n);}if(i.callback){var r = t.isIntersecting && t.intersectionRatio >= i.threshold;if(r === i.oldResult)return;i.oldResult = r, i.callback(r, t);}}, this.options.intersection), t.context.$nextTick(function(){i.observer && i.observer.observe(i.el);});}}}, {key: 'destroyObserver', value: function(){this.observer && (this.observer.disconnect(), this.observer = null), this.callback && this.callback._clear && (this.callback._clear(), this.callback = null);}}, {key: 'threshold', get: function(){return this.options.intersection && this.options.intersection.threshold || 0;}}]) && i(t.prototype, r), o && i(t, o), e;}();function o(e, t, i){var n = t.value;if(n)if('undefined' == typeof IntersectionObserver)console.warn('[vue-observe-visibility] IntersectionObserver API is not available in your browser. Please install this polyfill: https://github.com/w3c/IntersectionObserver/tree/master/polyfill');else{var o = new r(e, n, i);e._vue_visibilityState = o;}}function l(e){var t = e._vue_visibilityState;t && (t.destroyObserver(), delete e._vue_visibilityState);}var s = {bind: o, update: function(e, i, n){var r = i.value;if(!function e(i, n){if(i === n)return!0;if('object' === t(i)){for(var r in i)if(!e(i[r], n[r]))return!1;return!0;}return!1;}(r, i.oldValue)){var s = e._vue_visibilityState;r ? s ? s.createObserver(r, n) : o(e, {value: r}, n) : l(e);}}, unbind: l};function a(e){e.directive('observe-visibility', s);}var c = {version: '0.4.6', install: a}, u = null;return'undefined' != typeof window ? u = window.Vue : 'undefined' != typeof global && (u = global.Vue), u && u.use(c), e.ObserveVisibility = s, e.default = c, e.install = a, e;}({}); -------------------------------------------------------------------------------- /vendor/vuex.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vuex v3.0.1 3 | * (c) 2017 Evan You 4 | * @license MIT 5 | */ 6 | (function (global, factory) { 7 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 8 | typeof define === 'function' && define.amd ? define(factory) : 9 | (global.Vuex = factory()); 10 | }(this, (function () { 'use strict'; 11 | 12 | var applyMixin = function (Vue) { 13 | var version = Number(Vue.version.split('.')[0]); 14 | 15 | if (version >= 2) { 16 | Vue.mixin({ beforeCreate: vuexInit }); 17 | } else { 18 | // override init and inject vuex init procedure 19 | // for 1.x backwards compatibility. 20 | var _init = Vue.prototype._init; 21 | Vue.prototype._init = function (options) { 22 | if ( options === void 0 ) options = {}; 23 | 24 | options.init = options.init 25 | ? [vuexInit].concat(options.init) 26 | : vuexInit; 27 | _init.call(this, options); 28 | }; 29 | } 30 | 31 | /** 32 | * Vuex init hook, injected into each instances init hooks list. 33 | */ 34 | 35 | function vuexInit () { 36 | var options = this.$options; 37 | // store injection 38 | if (options.store) { 39 | this.$store = typeof options.store === 'function' 40 | ? options.store() 41 | : options.store; 42 | } else if (options.parent && options.parent.$store) { 43 | this.$store = options.parent.$store; 44 | } 45 | } 46 | }; 47 | 48 | var devtoolHook = 49 | typeof window !== 'undefined' && 50 | window.__VUE_DEVTOOLS_GLOBAL_HOOK__; 51 | 52 | function devtoolPlugin (store) { 53 | if (!devtoolHook) { return; } 54 | 55 | store._devtoolHook = devtoolHook; 56 | 57 | devtoolHook.emit('vuex:init', store); 58 | 59 | devtoolHook.on('vuex:travel-to-state', function (targetState) { 60 | store.replaceState(targetState); 61 | }); 62 | 63 | store.subscribe(function (mutation, state) { 64 | devtoolHook.emit('vuex:mutation', mutation, state); 65 | }); 66 | } 67 | 68 | /** 69 | * Get the first item that pass the test 70 | * by second argument function 71 | * 72 | * @param {Array} list 73 | * @param {Function} f 74 | * @return {*} 75 | */ 76 | /** 77 | * Deep copy the given object considering circular structure. 78 | * This function caches all nested objects and its copies. 79 | * If it detects circular structure, use cached copy to avoid infinite loop. 80 | * 81 | * @param {*} obj 82 | * @param {Array} cache 83 | * @return {*} 84 | */ 85 | 86 | /** 87 | * forEach for object 88 | */ 89 | function forEachValue (obj, fn) { 90 | Object.keys(obj).forEach(function (key) { return fn(obj[key], key); }); 91 | } 92 | 93 | function isObject (obj) { 94 | return obj !== null && typeof obj === 'object'; 95 | } 96 | 97 | function isPromise (val) { 98 | return val && typeof val.then === 'function'; 99 | } 100 | 101 | function assert (condition, msg) { 102 | if (!condition) { throw new Error(('[vuex] ' + msg)); } 103 | } 104 | 105 | var Module = function Module (rawModule, runtime) { 106 | this.runtime = runtime; 107 | this._children = Object.create(null); 108 | this._rawModule = rawModule; 109 | var rawState = rawModule.state; 110 | this.state = (typeof rawState === 'function' ? rawState() : rawState) || {}; 111 | }; 112 | 113 | var prototypeAccessors$1 = { namespaced: { configurable: true } }; 114 | 115 | prototypeAccessors$1.namespaced.get = function () { 116 | return !!this._rawModule.namespaced; 117 | }; 118 | 119 | Module.prototype.addChild = function addChild (key, module) { 120 | this._children[key] = module; 121 | }; 122 | 123 | Module.prototype.removeChild = function removeChild (key) { 124 | delete this._children[key]; 125 | }; 126 | 127 | Module.prototype.getChild = function getChild (key) { 128 | return this._children[key]; 129 | }; 130 | 131 | Module.prototype.update = function update (rawModule) { 132 | this._rawModule.namespaced = rawModule.namespaced; 133 | if (rawModule.actions) { 134 | this._rawModule.actions = rawModule.actions; 135 | } 136 | 137 | if (rawModule.mutations) { 138 | this._rawModule.mutations = rawModule.mutations; 139 | } 140 | 141 | if (rawModule.getters) { 142 | this._rawModule.getters = rawModule.getters; 143 | } 144 | }; 145 | 146 | Module.prototype.forEachChild = function forEachChild (fn) { 147 | forEachValue(this._children, fn); 148 | }; 149 | 150 | Module.prototype.forEachGetter = function forEachGetter (fn) { 151 | if (this._rawModule.getters) { 152 | forEachValue(this._rawModule.getters, fn); 153 | } 154 | }; 155 | 156 | Module.prototype.forEachAction = function forEachAction (fn) { 157 | if (this._rawModule.actions) { 158 | forEachValue(this._rawModule.actions, fn); 159 | } 160 | }; 161 | 162 | Module.prototype.forEachMutation = function forEachMutation (fn) { 163 | if (this._rawModule.mutations) { 164 | forEachValue(this._rawModule.mutations, fn); 165 | } 166 | }; 167 | 168 | Object.defineProperties( Module.prototype, prototypeAccessors$1 ); 169 | 170 | var ModuleCollection = function ModuleCollection (rawRootModule) { 171 | // register root module (Vuex.Store options) 172 | this.register([], rawRootModule, false); 173 | }; 174 | 175 | ModuleCollection.prototype.get = function get (path) { 176 | return path.reduce(function (module, key) { 177 | return module.getChild(key); 178 | }, this.root); 179 | }; 180 | 181 | ModuleCollection.prototype.getNamespace = function getNamespace (path) { 182 | var module = this.root; 183 | return path.reduce(function (namespace, key) { 184 | module = module.getChild(key); 185 | return namespace + (module.namespaced ? key + '/' : ''); 186 | }, ''); 187 | }; 188 | 189 | ModuleCollection.prototype.update = function update$1 (rawRootModule) { 190 | update([], this.root, rawRootModule); 191 | }; 192 | 193 | ModuleCollection.prototype.register = function register (path, rawModule, runtime) { 194 | var this$1 = this; 195 | if ( runtime === void 0 ) runtime = true; 196 | 197 | { 198 | assertRawModule(path, rawModule); 199 | } 200 | 201 | var newModule = new Module(rawModule, runtime); 202 | if (path.length === 0) { 203 | this.root = newModule; 204 | } else { 205 | var parent = this.get(path.slice(0, -1)); 206 | parent.addChild(path[path.length - 1], newModule); 207 | } 208 | 209 | // register nested modules 210 | if (rawModule.modules) { 211 | forEachValue(rawModule.modules, function (rawChildModule, key) { 212 | this$1.register(path.concat(key), rawChildModule, runtime); 213 | }); 214 | } 215 | }; 216 | 217 | ModuleCollection.prototype.unregister = function unregister (path) { 218 | var parent = this.get(path.slice(0, -1)); 219 | var key = path[path.length - 1]; 220 | if (!parent.getChild(key).runtime) { return; } 221 | 222 | parent.removeChild(key); 223 | }; 224 | 225 | function update (path, targetModule, newModule) { 226 | { 227 | assertRawModule(path, newModule); 228 | } 229 | 230 | // update target module 231 | targetModule.update(newModule); 232 | 233 | // update nested modules 234 | if (newModule.modules) { 235 | for (var key in newModule.modules) { 236 | if (!targetModule.getChild(key)) { 237 | { 238 | console.warn( 239 | '[vuex] trying to add a new module \'' + key + '\' on hot reloading, ' + 240 | 'manual reload is needed' 241 | ); 242 | } 243 | return; 244 | } 245 | update( 246 | path.concat(key), 247 | targetModule.getChild(key), 248 | newModule.modules[key] 249 | ); 250 | } 251 | } 252 | } 253 | 254 | var functionAssert = { 255 | assert: function (value) { return typeof value === 'function'; }, 256 | expected: 'function' 257 | }; 258 | 259 | var objectAssert = { 260 | assert: function (value) { return typeof value === 'function' || 261 | (typeof value === 'object' && typeof value.handler === 'function'); }, 262 | expected: 'function or object with "handler" function' 263 | }; 264 | 265 | var assertTypes = { 266 | getters: functionAssert, 267 | mutations: functionAssert, 268 | actions: objectAssert 269 | }; 270 | 271 | function assertRawModule (path, rawModule) { 272 | Object.keys(assertTypes).forEach(function (key) { 273 | if (!rawModule[key]) { return; } 274 | 275 | var assertOptions = assertTypes[key]; 276 | 277 | forEachValue(rawModule[key], function (value, type) { 278 | assert( 279 | assertOptions.assert(value), 280 | makeAssertionMessage(path, key, type, value, assertOptions.expected) 281 | ); 282 | }); 283 | }); 284 | } 285 | 286 | function makeAssertionMessage (path, key, type, value, expected) { 287 | var buf = key + ' should be ' + expected + ' but "' + key + '.' + type + '"'; 288 | if (path.length > 0) { 289 | buf += ' in module "' + (path.join('.')) + '"'; 290 | } 291 | buf += ' is ' + (JSON.stringify(value)) + '.'; 292 | return buf; 293 | } 294 | 295 | var Vue; // bind on install 296 | 297 | var Store = function Store (options) { 298 | var this$1 = this; 299 | if ( options === void 0 ) options = {}; 300 | 301 | // Auto install if it is not done yet and `window` has `Vue`. 302 | // To allow users to avoid auto-installation in some cases, 303 | // this code should be placed here. See #731 304 | if (!Vue && typeof window !== 'undefined' && window.Vue) { 305 | install(window.Vue); 306 | } 307 | 308 | { 309 | assert(Vue, 'must call Vue.use(Vuex) before creating a store instance.'); 310 | assert(typeof Promise !== 'undefined', 'vuex requires a Promise polyfill in this browser.'); 311 | assert(this instanceof Store, 'Store must be called with the new operator.'); 312 | } 313 | 314 | var plugins = options.plugins; if ( plugins === void 0 ) plugins = []; 315 | var strict = options.strict; if ( strict === void 0 ) strict = false; 316 | 317 | var state = options.state; if ( state === void 0 ) state = {}; 318 | if (typeof state === 'function') { 319 | state = state() || {}; 320 | } 321 | 322 | // store internal state 323 | this._committing = false; 324 | this._actions = Object.create(null); 325 | this._actionSubscribers = []; 326 | this._mutations = Object.create(null); 327 | this._wrappedGetters = Object.create(null); 328 | this._modules = new ModuleCollection(options); 329 | this._modulesNamespaceMap = Object.create(null); 330 | this._subscribers = []; 331 | this._watcherVM = new Vue(); 332 | 333 | // bind commit and dispatch to self 334 | var store = this; 335 | var ref = this; 336 | var dispatch = ref.dispatch; 337 | var commit = ref.commit; 338 | this.dispatch = function boundDispatch (type, payload) { 339 | return dispatch.call(store, type, payload); 340 | }; 341 | 342 | this.commit = function boundCommit (type, payload, options) { 343 | return commit.call(store, type, payload, options); 344 | }; 345 | 346 | // strict mode 347 | this.strict = strict; 348 | 349 | // init root module. 350 | // this also recursively registers all sub-modules 351 | // and collects all module getters inside this._wrappedGetters 352 | installModule(this, state, [], this._modules.root); 353 | 354 | // initialize the store vm, which is responsible for the reactivity 355 | // (also registers _wrappedGetters as computed properties) 356 | resetStoreVM(this, state); 357 | 358 | // apply plugins 359 | plugins.forEach(function (plugin) { return plugin(this$1); }); 360 | 361 | if (Vue.config.devtools) { 362 | devtoolPlugin(this); 363 | } 364 | }; 365 | 366 | var prototypeAccessors = { state: { configurable: true } }; 367 | 368 | prototypeAccessors.state.get = function () { 369 | return this._vm._data.$$state; 370 | }; 371 | 372 | prototypeAccessors.state.set = function (v) { 373 | { 374 | assert(false, 'Use store.replaceState() to explicit replace store state.'); 375 | } 376 | }; 377 | 378 | Store.prototype.commit = function commit (_type, _payload, _options) { 379 | var this$1 = this; 380 | 381 | // check object-style commit 382 | var ref = unifyObjectStyle(_type, _payload, _options); 383 | var type = ref.type; 384 | var payload = ref.payload; 385 | var options = ref.options; 386 | 387 | var mutation = { type: type, payload: payload }; 388 | var entry = this._mutations[type]; 389 | if (!entry) { 390 | { 391 | console.error(('[vuex] unknown mutation type: ' + type)); 392 | } 393 | return; 394 | } 395 | this._withCommit(function () { 396 | entry.forEach(function commitIterator (handler) { 397 | handler(payload); 398 | }); 399 | }); 400 | this._subscribers.forEach(function (sub) { return sub(mutation, this$1.state); }); 401 | 402 | if ( 403 | 'development' !== 'production' && 404 | options && options.silent 405 | ) { 406 | console.warn( 407 | '[vuex] mutation type: ' + type + '. Silent option has been removed. ' + 408 | 'Use the filter functionality in the vue-devtools' 409 | ); 410 | } 411 | }; 412 | 413 | Store.prototype.dispatch = function dispatch (_type, _payload) { 414 | var this$1 = this; 415 | 416 | // check object-style dispatch 417 | var ref = unifyObjectStyle(_type, _payload); 418 | var type = ref.type; 419 | var payload = ref.payload; 420 | 421 | var action = { type: type, payload: payload }; 422 | var entry = this._actions[type]; 423 | if (!entry) { 424 | { 425 | console.error(('[vuex] unknown action type: ' + type)); 426 | } 427 | return; 428 | } 429 | 430 | this._actionSubscribers.forEach(function (sub) { return sub(action, this$1.state); }); 431 | 432 | return entry.length > 1 433 | ? Promise.all(entry.map(function (handler) { return handler(payload); })) 434 | : entry[0](payload); 435 | }; 436 | 437 | Store.prototype.subscribe = function subscribe (fn) { 438 | return genericSubscribe(fn, this._subscribers); 439 | }; 440 | 441 | Store.prototype.subscribeAction = function subscribeAction (fn) { 442 | return genericSubscribe(fn, this._actionSubscribers); 443 | }; 444 | 445 | Store.prototype.watch = function watch (getter, cb, options) { 446 | var this$1 = this; 447 | 448 | { 449 | assert(typeof getter === 'function', 'store.watch only accepts a function.'); 450 | } 451 | return this._watcherVM.$watch(function () { return getter(this$1.state, this$1.getters); }, cb, options); 452 | }; 453 | 454 | Store.prototype.replaceState = function replaceState (state) { 455 | var this$1 = this; 456 | 457 | this._withCommit(function () { 458 | this$1._vm._data.$$state = state; 459 | }); 460 | }; 461 | 462 | Store.prototype.registerModule = function registerModule (path, rawModule, options) { 463 | if ( options === void 0 ) options = {}; 464 | 465 | if (typeof path === 'string') { path = [path]; } 466 | 467 | { 468 | assert(Array.isArray(path), 'module path must be a string or an Array.'); 469 | assert(path.length > 0, 'cannot register the root module by using registerModule.'); 470 | } 471 | 472 | this._modules.register(path, rawModule); 473 | installModule(this, this.state, path, this._modules.get(path), options.preserveState); 474 | // reset store to update getters... 475 | resetStoreVM(this, this.state); 476 | }; 477 | 478 | Store.prototype.unregisterModule = function unregisterModule (path) { 479 | var this$1 = this; 480 | 481 | if (typeof path === 'string') { path = [path]; } 482 | 483 | { 484 | assert(Array.isArray(path), 'module path must be a string or an Array.'); 485 | } 486 | 487 | this._modules.unregister(path); 488 | this._withCommit(function () { 489 | var parentState = getNestedState(this$1.state, path.slice(0, -1)); 490 | Vue.delete(parentState, path[path.length - 1]); 491 | }); 492 | resetStore(this); 493 | }; 494 | 495 | Store.prototype.hotUpdate = function hotUpdate (newOptions) { 496 | this._modules.update(newOptions); 497 | resetStore(this, true); 498 | }; 499 | 500 | Store.prototype._withCommit = function _withCommit (fn) { 501 | var committing = this._committing; 502 | this._committing = true; 503 | fn(); 504 | this._committing = committing; 505 | }; 506 | 507 | Object.defineProperties( Store.prototype, prototypeAccessors ); 508 | 509 | function genericSubscribe (fn, subs) { 510 | if (subs.indexOf(fn) < 0) { 511 | subs.push(fn); 512 | } 513 | 514 | return function () { 515 | var i = subs.indexOf(fn); 516 | if (i > -1) { 517 | subs.splice(i, 1); 518 | } 519 | }; 520 | } 521 | 522 | function resetStore (store, hot) { 523 | store._actions = Object.create(null); 524 | store._mutations = Object.create(null); 525 | store._wrappedGetters = Object.create(null); 526 | store._modulesNamespaceMap = Object.create(null); 527 | var state = store.state; 528 | // init all modules 529 | installModule(store, state, [], store._modules.root, true); 530 | // reset vm 531 | resetStoreVM(store, state, hot); 532 | } 533 | 534 | function resetStoreVM (store, state, hot) { 535 | var oldVm = store._vm; 536 | 537 | // bind store public getters 538 | store.getters = {}; 539 | var wrappedGetters = store._wrappedGetters; 540 | var computed = {}; 541 | forEachValue(wrappedGetters, function (fn, key) { 542 | // use computed to leverage its lazy-caching mechanism 543 | computed[key] = function () { return fn(store); }; 544 | Object.defineProperty(store.getters, key, { 545 | get: function () { return store._vm[key]; }, 546 | enumerable: true // for local getters 547 | }); 548 | }); 549 | 550 | // use a Vue instance to store the state tree 551 | // suppress warnings just in case the user has added 552 | // some funky global mixins 553 | var silent = Vue.config.silent; 554 | Vue.config.silent = true; 555 | store._vm = new Vue({ 556 | data: { 557 | $$state: state 558 | }, 559 | computed: computed 560 | }); 561 | Vue.config.silent = silent; 562 | 563 | // enable strict mode for new vm 564 | if (store.strict) { 565 | enableStrictMode(store); 566 | } 567 | 568 | if (oldVm) { 569 | if (hot) { 570 | // dispatch changes in all subscribed watchers 571 | // to force getter re-evaluation for hot reloading. 572 | store._withCommit(function () { 573 | oldVm._data.$$state = null; 574 | }); 575 | } 576 | Vue.nextTick(function () { return oldVm.$destroy(); }); 577 | } 578 | } 579 | 580 | function installModule (store, rootState, path, module, hot) { 581 | var isRoot = !path.length; 582 | var namespace = store._modules.getNamespace(path); 583 | 584 | // register in namespace map 585 | if (module.namespaced) { 586 | store._modulesNamespaceMap[namespace] = module; 587 | } 588 | 589 | // set state 590 | if (!isRoot && !hot) { 591 | var parentState = getNestedState(rootState, path.slice(0, -1)); 592 | var moduleName = path[path.length - 1]; 593 | store._withCommit(function () { 594 | Vue.set(parentState, moduleName, module.state); 595 | }); 596 | } 597 | 598 | var local = module.context = makeLocalContext(store, namespace, path); 599 | 600 | module.forEachMutation(function (mutation, key) { 601 | var namespacedType = namespace + key; 602 | registerMutation(store, namespacedType, mutation, local); 603 | }); 604 | 605 | module.forEachAction(function (action, key) { 606 | var type = action.root ? key : namespace + key; 607 | var handler = action.handler || action; 608 | registerAction(store, type, handler, local); 609 | }); 610 | 611 | module.forEachGetter(function (getter, key) { 612 | var namespacedType = namespace + key; 613 | registerGetter(store, namespacedType, getter, local); 614 | }); 615 | 616 | module.forEachChild(function (child, key) { 617 | installModule(store, rootState, path.concat(key), child, hot); 618 | }); 619 | } 620 | 621 | /** 622 | * make localized dispatch, commit, getters and state 623 | * if there is no namespace, just use root ones 624 | */ 625 | function makeLocalContext (store, namespace, path) { 626 | var noNamespace = namespace === ''; 627 | 628 | var local = { 629 | dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) { 630 | var args = unifyObjectStyle(_type, _payload, _options); 631 | var payload = args.payload; 632 | var options = args.options; 633 | var type = args.type; 634 | 635 | if (!options || !options.root) { 636 | type = namespace + type; 637 | if ('development' !== 'production' && !store._actions[type]) { 638 | console.error(('[vuex] unknown local action type: ' + (args.type) + ', global type: ' + type)); 639 | return; 640 | } 641 | } 642 | 643 | return store.dispatch(type, payload); 644 | }, 645 | 646 | commit: noNamespace ? store.commit : function (_type, _payload, _options) { 647 | var args = unifyObjectStyle(_type, _payload, _options); 648 | var payload = args.payload; 649 | var options = args.options; 650 | var type = args.type; 651 | 652 | if (!options || !options.root) { 653 | type = namespace + type; 654 | if ('development' !== 'production' && !store._mutations[type]) { 655 | console.error(('[vuex] unknown local mutation type: ' + (args.type) + ', global type: ' + type)); 656 | return; 657 | } 658 | } 659 | 660 | store.commit(type, payload, options); 661 | } 662 | }; 663 | 664 | // getters and state object must be gotten lazily 665 | // because they will be changed by vm update 666 | Object.defineProperties(local, { 667 | getters: { 668 | get: noNamespace 669 | ? function () { return store.getters; } 670 | : function () { return makeLocalGetters(store, namespace); } 671 | }, 672 | state: { 673 | get: function () { return getNestedState(store.state, path); } 674 | } 675 | }); 676 | 677 | return local; 678 | } 679 | 680 | function makeLocalGetters (store, namespace) { 681 | var gettersProxy = {}; 682 | 683 | var splitPos = namespace.length; 684 | Object.keys(store.getters).forEach(function (type) { 685 | // skip if the target getter is not match this namespace 686 | if (type.slice(0, splitPos) !== namespace) { return; } 687 | 688 | // extract local getter type 689 | var localType = type.slice(splitPos); 690 | 691 | // Add a port to the getters proxy. 692 | // Define as getter property because 693 | // we do not want to evaluate the getters in this time. 694 | Object.defineProperty(gettersProxy, localType, { 695 | get: function () { return store.getters[type]; }, 696 | enumerable: true 697 | }); 698 | }); 699 | 700 | return gettersProxy; 701 | } 702 | 703 | function registerMutation (store, type, handler, local) { 704 | var entry = store._mutations[type] || (store._mutations[type] = []); 705 | entry.push(function wrappedMutationHandler (payload) { 706 | handler.call(store, local.state, payload); 707 | }); 708 | } 709 | 710 | function registerAction (store, type, handler, local) { 711 | var entry = store._actions[type] || (store._actions[type] = []); 712 | entry.push(function wrappedActionHandler (payload, cb) { 713 | var res = handler.call(store, { 714 | dispatch: local.dispatch, 715 | commit: local.commit, 716 | getters: local.getters, 717 | state: local.state, 718 | rootGetters: store.getters, 719 | rootState: store.state 720 | }, payload, cb); 721 | if (!isPromise(res)) { 722 | res = Promise.resolve(res); 723 | } 724 | 725 | if (store._devtoolHook) { 726 | return res.catch(function (err) { 727 | store._devtoolHook.emit('vuex:error', err); 728 | throw err; 729 | }); 730 | } else { 731 | return res; 732 | } 733 | }); 734 | } 735 | 736 | function registerGetter (store, type, rawGetter, local) { 737 | if (store._wrappedGetters[type]) { 738 | { 739 | console.error(('[vuex] duplicate getter key: ' + type)); 740 | } 741 | return; 742 | } 743 | 744 | store._wrappedGetters[type] = function wrappedGetter (store) { 745 | return rawGetter( 746 | local.state, // local state 747 | local.getters, // local getters 748 | store.state, // root state 749 | store.getters // root getters 750 | ); 751 | }; 752 | } 753 | 754 | function enableStrictMode (store) { 755 | store._vm.$watch(function () { return this._data.$$state; }, function () { 756 | { 757 | assert(store._committing, 'Do not mutate vuex store state outside mutation handlers.'); 758 | } 759 | }, { deep: true, sync: true }); 760 | } 761 | 762 | function getNestedState (state, path) { 763 | return path.length 764 | ? path.reduce(function (state, key) { return state[key]; }, state) 765 | : state; 766 | } 767 | 768 | function unifyObjectStyle (type, payload, options) { 769 | if (isObject(type) && type.type) { 770 | options = payload; 771 | payload = type; 772 | type = type.type; 773 | } 774 | 775 | { 776 | assert(typeof type === 'string', ('Expects string as the type, but found ' + (typeof type) + '.')); 777 | } 778 | 779 | return { type: type, payload: payload, options: options }; 780 | } 781 | 782 | function install (_Vue) { 783 | if (Vue && _Vue === Vue) { 784 | { 785 | console.error( 786 | '[vuex] already installed. Vue.use(Vuex) should be called only once.' 787 | ); 788 | } 789 | return; 790 | } 791 | Vue = _Vue; 792 | applyMixin(Vue); 793 | } 794 | 795 | var mapState = normalizeNamespace(function (namespace, states) { 796 | var res = {}; 797 | normalizeMap(states).forEach(function (ref) { 798 | var key = ref.key; 799 | var val = ref.val; 800 | 801 | res[key] = function mappedState () { 802 | var state = this.$store.state; 803 | var getters = this.$store.getters; 804 | if (namespace) { 805 | var module = getModuleByNamespace(this.$store, 'mapState', namespace); 806 | if (!module) { 807 | return; 808 | } 809 | state = module.context.state; 810 | getters = module.context.getters; 811 | } 812 | return typeof val === 'function' 813 | ? val.call(this, state, getters) 814 | : state[val]; 815 | }; 816 | // mark vuex getter for devtools 817 | res[key].vuex = true; 818 | }); 819 | return res; 820 | }); 821 | 822 | var mapMutations = normalizeNamespace(function (namespace, mutations) { 823 | var res = {}; 824 | normalizeMap(mutations).forEach(function (ref) { 825 | var key = ref.key; 826 | var val = ref.val; 827 | 828 | res[key] = function mappedMutation () { 829 | var args = [], len = arguments.length; 830 | while ( len-- ) args[ len ] = arguments[ len ]; 831 | 832 | var commit = this.$store.commit; 833 | if (namespace) { 834 | var module = getModuleByNamespace(this.$store, 'mapMutations', namespace); 835 | if (!module) { 836 | return; 837 | } 838 | commit = module.context.commit; 839 | } 840 | return typeof val === 'function' 841 | ? val.apply(this, [commit].concat(args)) 842 | : commit.apply(this.$store, [val].concat(args)); 843 | }; 844 | }); 845 | return res; 846 | }); 847 | 848 | var mapGetters = normalizeNamespace(function (namespace, getters) { 849 | var res = {}; 850 | normalizeMap(getters).forEach(function (ref) { 851 | var key = ref.key; 852 | var val = ref.val; 853 | 854 | val = namespace + val; 855 | res[key] = function mappedGetter () { 856 | if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) { 857 | return; 858 | } 859 | 860 | if ('development' !== 'production' && !(val in this.$store.getters)) { 861 | console.error(('[vuex] unknown getter: ' + val)); 862 | return; 863 | } 864 | return this.$store.getters[val]; 865 | }; 866 | // mark vuex getter for devtools 867 | res[key].vuex = true; 868 | }); 869 | return res; 870 | }); 871 | 872 | var mapActions = normalizeNamespace(function (namespace, actions) { 873 | var res = {}; 874 | normalizeMap(actions).forEach(function (ref) { 875 | var key = ref.key; 876 | var val = ref.val; 877 | 878 | res[key] = function mappedAction () { 879 | var args = [], len = arguments.length; 880 | while ( len-- ) args[ len ] = arguments[ len ]; 881 | 882 | var dispatch = this.$store.dispatch; 883 | if (namespace) { 884 | var module = getModuleByNamespace(this.$store, 'mapActions', namespace); 885 | if (!module) { 886 | return; 887 | } 888 | dispatch = module.context.dispatch; 889 | } 890 | return typeof val === 'function' 891 | ? val.apply(this, [dispatch].concat(args)) 892 | : dispatch.apply(this.$store, [val].concat(args)); 893 | }; 894 | }); 895 | return res; 896 | }); 897 | 898 | var createNamespacedHelpers = function (namespace) { return ({ 899 | mapState: mapState.bind(null, namespace), 900 | mapGetters: mapGetters.bind(null, namespace), 901 | mapMutations: mapMutations.bind(null, namespace), 902 | mapActions: mapActions.bind(null, namespace) 903 | }); }; 904 | 905 | function normalizeMap (map) { 906 | return Array.isArray(map) 907 | ? map.map(function (key) { return ({ key: key, val: key }); }) 908 | : Object.keys(map).map(function (key) { return ({ key: key, val: map[key] }); }); 909 | } 910 | 911 | function normalizeNamespace (fn) { 912 | return function (namespace, map) { 913 | if (typeof namespace !== 'string') { 914 | map = namespace; 915 | namespace = ''; 916 | } else if (namespace.charAt(namespace.length - 1) !== '/') { 917 | namespace += '/'; 918 | } 919 | return fn(namespace, map); 920 | }; 921 | } 922 | 923 | function getModuleByNamespace (store, helper, namespace) { 924 | var module = store._modulesNamespaceMap[namespace]; 925 | if ('development' !== 'production' && !module) { 926 | console.error(('[vuex] module namespace not found in ' + helper + '(): ' + namespace)); 927 | } 928 | return module; 929 | } 930 | 931 | var index = { 932 | Store: Store, 933 | install: install, 934 | version: '3.0.1', 935 | mapState: mapState, 936 | mapMutations: mapMutations, 937 | mapGetters: mapGetters, 938 | mapActions: mapActions, 939 | createNamespacedHelpers: createNamespacedHelpers 940 | }; 941 | 942 | return index; 943 | 944 | }))); 945 | --------------------------------------------------------------------------------