├── cypress-io-react ├── README.md ├── src │ ├── index.css │ ├── index.js │ ├── App.css │ ├── logo.svg │ ├── App.js │ └── registerServiceWorker.js ├── public │ ├── favicon.ico │ ├── manifest.json │ └── index.html └── package.json ├── nuxt-with-express ├── .prettierrc ├── static │ ├── favicon.ico │ └── README.md ├── components │ └── README.md ├── jsconfig.json ├── .editorconfig ├── layouts │ ├── README.md │ └── default.vue ├── pages │ ├── README.md │ └── index.vue ├── assets │ └── README.md ├── plugins │ └── README.md ├── middleware │ └── README.md ├── store │ └── README.md ├── .eslintrc.js ├── README.md ├── package.json ├── nuxt.config.js ├── server │ └── index.js └── .gitignore ├── image-uploading-with-node-and-cloudinary ├── README.md ├── uploads │ └── thumb.jpeg ├── package.json ├── index.js └── package-lock.json ├── README.md └── .gitignore /cypress-io-react/README.md: -------------------------------------------------------------------------------- 1 | Blog Post located [here](https://medium.com/p/b4c8bbf1f71c) 2 | -------------------------------------------------------------------------------- /cypress-io-react/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: sans-serif; 5 | } 6 | -------------------------------------------------------------------------------- /cypress-io-react/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jcottam/blog/HEAD/cypress-io-react/public/favicon.ico -------------------------------------------------------------------------------- /nuxt-with-express/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "arrowParens": "always", 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /nuxt-with-express/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jcottam/blog/HEAD/nuxt-with-express/static/favicon.ico -------------------------------------------------------------------------------- /image-uploading-with-node-and-cloudinary/README.md: -------------------------------------------------------------------------------- 1 | Blog Post located [here](https://medium.com/@johnryancottam/image-uploading-with-node-cloudinary-6f7796c8277a) 2 | -------------------------------------------------------------------------------- /image-uploading-with-node-and-cloudinary/uploads/thumb.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jcottam/blog/HEAD/image-uploading-with-node-and-cloudinary/uploads/thumb.jpeg -------------------------------------------------------------------------------- /nuxt-with-express/components/README.md: -------------------------------------------------------------------------------- 1 | # COMPONENTS 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | The components directory contains your Vue.js Components. 6 | 7 | _Nuxt.js doesn't supercharge these components._ 8 | -------------------------------------------------------------------------------- /nuxt-with-express/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "~/*": ["./*"], 6 | "@/*": ["./*"], 7 | "~~/*": ["./*"], 8 | "@@/*": ["./*"] 9 | } 10 | }, 11 | "exclude": ["node_modules", ".nuxt", "dist"] 12 | } 13 | -------------------------------------------------------------------------------- /nuxt-with-express/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /cypress-io-react/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import registerServiceWorker from './registerServiceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | registerServiceWorker(); 9 | -------------------------------------------------------------------------------- /nuxt-with-express/layouts/README.md: -------------------------------------------------------------------------------- 1 | # LAYOUTS 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your Application Layouts. 6 | 7 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/views#layouts). 8 | -------------------------------------------------------------------------------- /nuxt-with-express/pages/README.md: -------------------------------------------------------------------------------- 1 | # PAGES 2 | 3 | This directory contains your Application Views and Routes. 4 | The framework reads all the `*.vue` files inside this directory and creates the router of your application. 5 | 6 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing). 7 | -------------------------------------------------------------------------------- /nuxt-with-express/assets/README.md: -------------------------------------------------------------------------------- 1 | # ASSETS 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your un-compiled assets such as LESS, SASS, or JavaScript. 6 | 7 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#webpacked). 8 | -------------------------------------------------------------------------------- /nuxt-with-express/plugins/README.md: -------------------------------------------------------------------------------- 1 | # PLUGINS 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains Javascript plugins that you want to run before mounting the root Vue.js application. 6 | 7 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/plugins). 8 | -------------------------------------------------------------------------------- /cypress-io-react/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": "./index.html", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /nuxt-with-express/middleware/README.md: -------------------------------------------------------------------------------- 1 | # MIDDLEWARE 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your application middleware. 6 | Middleware let you define custom functions that can be run before rendering either a page or a group of pages. 7 | 8 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing#middleware). 9 | -------------------------------------------------------------------------------- /nuxt-with-express/store/README.md: -------------------------------------------------------------------------------- 1 | # STORE 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your Vuex Store files. 6 | Vuex Store option is implemented in the Nuxt.js framework. 7 | 8 | Creating a file in this directory automatically activates the option in the framework. 9 | 10 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/vuex-store). 11 | -------------------------------------------------------------------------------- /image-uploading-with-node-and-cloudinary/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "image-uploading-with-node-and-cloudinary", 3 | "version": "1.0.0", 4 | "description": "https://medium.com/p/6f7796c8277a", 5 | "scripts": { 6 | "start": "node index.js", 7 | "dev": "nodemon index.js" 8 | }, 9 | "dependencies": { 10 | "cloudinary": "^1.11.0", 11 | "express": "^4.16.3", 12 | "multer": "^1.3.1" 13 | }, 14 | "author": "John Ryan Cottam", 15 | "license": "ISC" 16 | } 17 | -------------------------------------------------------------------------------- /nuxt-with-express/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | node: true 6 | }, 7 | parserOptions: { 8 | parser: 'babel-eslint' 9 | }, 10 | extends: [ 11 | '@nuxtjs', 12 | 'prettier', 13 | 'prettier/vue', 14 | 'plugin:prettier/recommended', 15 | 'plugin:nuxt/recommended' 16 | ], 17 | plugins: ['prettier'], 18 | // add your custom rules here 19 | rules: { 20 | 'nuxt/no-cjs-in-config': 'off' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /nuxt-with-express/static/README.md: -------------------------------------------------------------------------------- 1 | # STATIC 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your static files. 6 | Each file inside this directory is mapped to `/`. 7 | Thus you'd want to delete this README.md before deploying to production. 8 | 9 | Example: `/static/robots.txt` is mapped as `/robots.txt`. 10 | 11 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#static). 12 | -------------------------------------------------------------------------------- /cypress-io-react/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "circleci", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "axios": "^0.18.1", 7 | "react": "^16.13.1", 8 | "react-dom": "^16.13.1", 9 | "react-scripts": "5.0.1", 10 | "save": "^2.4.0" 11 | }, 12 | "scripts": { 13 | "start": "react-scripts start", 14 | "build": "react-scripts build", 15 | "eject": "react-scripts eject", 16 | "cypress:open": "cypress open" 17 | }, 18 | "devDependencies": { 19 | "cypress": "^3.8.3" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /nuxt-with-express/README.md: -------------------------------------------------------------------------------- 1 | # nuxt-with-express 2 | 3 | > Blog Post located [here](https://medium.com/@johnryancottam/running-nuxt-in-parallel-with-express-ffbd1feef83c) 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | $ yarn install 10 | 11 | # serve with hot reload at localhost:3000 12 | $ yarn dev 13 | 14 | # build for production and launch server 15 | $ yarn build 16 | $ yarn start 17 | 18 | # generate static project 19 | $ yarn generate 20 | ``` 21 | 22 | For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org). 23 | -------------------------------------------------------------------------------- /nuxt-with-express/layouts/default.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Blog Code Examples 2 | 3 | This repository contains example code referenced in my blog posts at [https://medium.com/@johnryancottam](https://medium.com/@johnryancottam). 4 | 5 | ## Overview 6 | 7 | Each directory in this repo corresponds to a specific blog post or topic. Code samples are provided to help you better understand and experiment with the concepts discussed on the blog. 8 | 9 | ## How to Use 10 | 11 | 1. Browse the folders to find examples by post or topic. 12 | 2. Follow the instructions provided in each folder’s `README.md` (if available) for setup and usage. 13 | 3. Clone or download the repo to run and modify the code samples locally. 14 | 15 | ## Contributing 16 | 17 | If you find a bug or have improvements, feel free to open an issue or submit a pull request. 18 | 19 | --- 20 | 21 | Happy coding! 22 | -------------------------------------------------------------------------------- /nuxt-with-express/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nuxt-with-express", 3 | "version": "1.0.0", 4 | "description": "Running NUXT in parallel with Express. Blog post available here, https://medium.com/@johnryancottam/running-nuxt-in-parallel-with-express-ffbd1feef83c", 5 | "author": "John Ryan Cottam", 6 | "private": false, 7 | "scripts": { 8 | "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server", 9 | "build": "nuxt build", 10 | "start": "cross-env NODE_ENV=production node server/index.js", 11 | "generate": "nuxt generate", 12 | "lint": "eslint --ext .js,.vue --ignore-path .gitignore ." 13 | }, 14 | "dependencies": { 15 | "nuxt": "^2.0.0", 16 | "cross-env": "^5.2.0", 17 | "express": "^4.16.4", 18 | "@nuxtjs/axios": "^5.3.6" 19 | }, 20 | "devDependencies": { 21 | "nodemon": "^1.18.9", 22 | "@nuxtjs/eslint-config": "^1.0.1", 23 | "@nuxtjs/eslint-module": "^1.0.0", 24 | "babel-eslint": "^10.0.1", 25 | "eslint": "^6.1.0", 26 | "eslint-plugin-nuxt": ">=0.4.2", 27 | "eslint-config-prettier": "^4.1.0", 28 | "eslint-plugin-prettier": "^3.0.1", 29 | "prettier": "^1.16.4" 30 | } 31 | } -------------------------------------------------------------------------------- /nuxt-with-express/nuxt.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | mode: 'universal', 3 | /* 4 | ** Headers of the page 5 | */ 6 | head: { 7 | title: process.env.npm_package_name || '', 8 | meta: [ 9 | { charset: 'utf-8' }, 10 | { name: 'viewport', content: 'width=device-width, initial-scale=1' }, 11 | { 12 | hid: 'description', 13 | name: 'description', 14 | content: process.env.npm_package_description || '' 15 | } 16 | ], 17 | link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }] 18 | }, 19 | /* 20 | ** Customize the progress-bar color 21 | */ 22 | loading: { color: '#fff' }, 23 | /* 24 | ** Global CSS 25 | */ 26 | css: [], 27 | /* 28 | ** Plugins to load before mounting the App 29 | */ 30 | plugins: [], 31 | /* 32 | ** Nuxt.js dev-modules 33 | */ 34 | buildModules: [ 35 | // Doc: https://github.com/nuxt-community/eslint-module 36 | '@nuxtjs/eslint-module' 37 | ], 38 | /* 39 | ** Nuxt.js modules 40 | */ 41 | modules: [ 42 | // Doc: https://axios.nuxtjs.org/usage 43 | '@nuxtjs/axios' 44 | ], 45 | /* 46 | ** Axios module configuration 47 | ** See https://axios.nuxtjs.org/options 48 | */ 49 | axios: {}, 50 | /* 51 | ** Build configuration 52 | */ 53 | build: { 54 | /* 55 | ** You can extend webpack config here 56 | */ 57 | extend(config, ctx) {} 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /nuxt-with-express/server/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const consola = require('consola') 3 | const { Nuxt, Builder } = require('nuxt') 4 | const app = express() 5 | 6 | // Import and Set Nuxt.js options 7 | const config = require('../nuxt.config.js') 8 | config.dev = process.env.NODE_ENV !== 'production' 9 | 10 | async function start() { 11 | // Init Nuxt.js 12 | const nuxt = new Nuxt(config) 13 | 14 | const { host, port } = nuxt.options.server 15 | 16 | // Build only in dev mode 17 | if (config.dev) { 18 | const builder = new Builder(nuxt) 19 | await builder.build() 20 | } else { 21 | await nuxt.ready() 22 | } 23 | 24 | // Express GET endpoint 25 | const axios = require('axios') 26 | let movieIndex = 0 27 | app.get('/api/next-movie', async (req, res, next) => { 28 | const movieOptions = [ 29 | 'tt3896198', 30 | 'tt0071253', 31 | 'tt0109686', 32 | 'tt2267998', 33 | 'tt0109040', 34 | 'tt0089218' 35 | ] 36 | const movie = await axios.get( 37 | `https://www.omdbapi.com/?i=${movieOptions[movieIndex]}&apikey=9733f1df` 38 | ) 39 | movieIndex++ 40 | if (movieIndex > movieOptions.length - 1) movieIndex = 0 41 | res.json(movie.data) 42 | }) 43 | 44 | // Give nuxt middleware to express 45 | app.use(nuxt.render) 46 | 47 | // Listen the server 48 | app.listen(port, host) 49 | consola.ready({ 50 | message: `Server listening on http://${host}:${port}`, 51 | badge: true 52 | }) 53 | } 54 | start() 55 | -------------------------------------------------------------------------------- /image-uploading-with-node-and-cloudinary/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const app = express() 3 | 4 | // MULTER 5 | const multer = require('multer') 6 | 7 | const storage = multer.diskStorage({ 8 | destination: function(req, file, cb) { 9 | cb(null, 'uploads/') 10 | }, 11 | filename: function(req, file, cb) { 12 | console.log(file) 13 | cb(null, file.originalname) 14 | } 15 | }) 16 | 17 | // POST ROUTE 18 | app.post('/upload', (req, res, next) => { 19 | const upload = multer({ storage }).single('name-of-input-key') 20 | upload(req, res, function(err) { 21 | if (err) { 22 | return res.send(err) 23 | } 24 | 25 | console.log('file uploaded to server') 26 | console.log(req.file) 27 | 28 | // SEND FILE TO CLOUDINARY 29 | const cloudinary = require('cloudinary').v2 30 | cloudinary.config({ 31 | cloud_name: 'sharethroughgallery', 32 | api_key: '***', 33 | api_secret: '***' 34 | }) 35 | 36 | const path = req.file.path 37 | const uniqueFilename = new Date().toISOString() 38 | 39 | cloudinary.uploader.upload( 40 | path, 41 | { public_id: `blog/${uniqueFilename}`, tags: `blog` }, // directory and tags are optional 42 | function(err, image) { 43 | if (err) return res.send(err) 44 | console.log('file uploaded to Cloudinary') 45 | 46 | var fs = require('fs') 47 | fs.unlinkSync(path) 48 | 49 | res.json(image) 50 | } 51 | ) 52 | }) 53 | }) 54 | 55 | app.listen(3000) 56 | -------------------------------------------------------------------------------- /nuxt-with-express/pages/index.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 37 | 38 | 67 | -------------------------------------------------------------------------------- /nuxt-with-express/.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | 41 | # TypeScript v1 declaration files 42 | typings/ 43 | 44 | # Optional npm cache directory 45 | .npm 46 | 47 | # Optional eslint cache 48 | .eslintcache 49 | 50 | # Optional REPL history 51 | .node_repl_history 52 | 53 | # Output of 'npm pack' 54 | *.tgz 55 | 56 | # Yarn Integrity file 57 | .yarn-integrity 58 | 59 | # dotenv environment variables file 60 | .env 61 | 62 | # parcel-bundler cache (https://parceljs.org/) 63 | .cache 64 | 65 | # next.js build output 66 | .next 67 | 68 | # nuxt.js build output 69 | .nuxt 70 | 71 | # Nuxt generate 72 | dist 73 | 74 | # vuepress build output 75 | .vuepress/dist 76 | 77 | # Serverless directories 78 | .serverless 79 | 80 | # IDE / Editor 81 | .idea 82 | .editorconfig 83 | 84 | # Service worker 85 | sw.* 86 | 87 | # Mac OSX 88 | .DS_Store 89 | 90 | # Vim swap files 91 | *.swp 92 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | **/.DS_Store 4 | **/node_modules 5 | cypress-io-react/package.json 6 | cypress-io-react/cypress/support/index.js 7 | cypress-io-react/cypress/support/commands.js 8 | cypress-io-react/cypress/screenshots/examples/misc.spec.js/my-image.png 9 | cypress-io-react/cypress/plugins/index.js 10 | cypress-io-react/cypress/integration/simple_spec.js 11 | cypress-io-react/cypress/integration/examples/window.spec.js 12 | cypress-io-react/cypress/integration/examples/waiting.spec.js 13 | cypress-io-react/cypress/integration/examples/viewport.spec.js 14 | cypress-io-react/cypress/integration/examples/utilities.spec.js 15 | cypress-io-react/cypress/integration/examples/traversal.spec.js 16 | cypress-io-react/cypress/integration/examples/spies_stubs_clocks.spec.js 17 | cypress-io-react/cypress/integration/examples/querying.spec.js 18 | cypress-io-react/cypress/integration/examples/network_requests.spec.js 19 | cypress-io-react/cypress/integration/examples/navigation.spec.js 20 | cypress-io-react/cypress/integration/examples/misc.spec.js 21 | cypress-io-react/cypress/integration/examples/location.spec.js 22 | cypress-io-react/cypress/integration/examples/local_storage.spec.js 23 | cypress-io-react/cypress/integration/examples/files.spec.js 24 | cypress-io-react/cypress/integration/examples/cypress_api.spec.js 25 | cypress-io-react/cypress/integration/examples/cookies.spec.js 26 | cypress-io-react/cypress/integration/examples/connectors.spec.js 27 | cypress-io-react/cypress/integration/examples/assertions.spec.js 28 | cypress-io-react/cypress/integration/examples/aliasing.spec.js 29 | cypress-io-react/cypress/integration/examples/actions.spec.js 30 | cypress-io-react/cypress/fixtures/example.json 31 | cypress-io-react/cypress.json 32 | cypress-io-react/package.json 33 | -------------------------------------------------------------------------------- /cypress-io-react/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 22 | Testing with Cypress.io 23 | 24 | 25 | 28 |
29 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /cypress-io-react/src/App.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | 6 | * { 7 | box-sizing: border-box; 8 | } 9 | 10 | .app-logo { 11 | animation: app-logo-spin infinite 20s linear; 12 | height: 30px; 13 | } 14 | 15 | @keyframes app-logo-spin { 16 | from { 17 | transform: rotate(0deg); 18 | } 19 | to { 20 | transform: rotate(360deg); 21 | } 22 | } 23 | 24 | header { 25 | background-color: #172431; 26 | color: white; 27 | padding: 0 20px; 28 | position: fixed; 29 | width: 100%; 30 | } 31 | 32 | footer { 33 | display: flex; 34 | align-items: center; 35 | /* justify-content: space-around; */ 36 | background-color: #172431; 37 | color: white; 38 | padding: 5px 8px; 39 | font-size: 0.9rem; 40 | font-style: italic; 41 | position: fixed; 42 | width: 100%; 43 | bottom: 0; 44 | } 45 | 46 | header h1 { 47 | font-size: 1.5rem; 48 | margin-right: 10px; 49 | } 50 | 51 | header p { 52 | color: yellow; 53 | font-weight: bold; 54 | } 55 | 56 | header a { 57 | color: inherit; 58 | } 59 | 60 | header p .release-date { 61 | margin-left: 9px; 62 | font-size: 0.8em; 63 | color: powderblue; 64 | } 65 | 66 | .movie-list { 67 | display: flex; 68 | flex-wrap: wrap; 69 | padding: 96px 0 50px; 70 | } 71 | 72 | .movie-item { 73 | max-width: 50%; 74 | flex-basis: 50%; 75 | overflow: hidden; 76 | text-align: center; 77 | font-size: 0.9rem; 78 | cursor: pointer; 79 | } 80 | 81 | .backdrop { 82 | overflow: hidden; 83 | background-color: #f6f6f6; 84 | margin: 10px; 85 | padding: 10px 0; 86 | } 87 | 88 | .movie-item:hover .backdrop { 89 | background-color: #ccc; 90 | } 91 | 92 | .movie-poster { 93 | width: 150px; 94 | height: 225px; 95 | display: block; 96 | margin: 0 auto 8px; 97 | } 98 | 99 | @media (max-width: 500px) { 100 | header h1 { 101 | font-size: 1.3rem; 102 | } 103 | .movie-item { 104 | max-width: 100%; 105 | flex-basis: 100%; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /cypress-io-react/src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /cypress-io-react/src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import logo from './logo.svg' 3 | import './App.css' 4 | import axios from 'axios' 5 | 6 | class App extends Component { 7 | constructor() { 8 | super() 9 | this.state = { movies: [], selectedMovie: null } 10 | this.fetchData() 11 | this.selectMovie = this.selectMovie.bind(this) 12 | } 13 | 14 | fetchData = async () => { 15 | const movieOptions = [ 16 | 'tt3896198', 17 | 'tt0071253', 18 | 'tt0109686', 19 | 'tt2267998', 20 | 'tt0109040', 21 | 'tt0083658', 22 | 'tt0106611', 23 | 'tt0302886', 24 | 'tt0092099', 25 | 'tt0089218' 26 | ] 27 | const requests = movieOptions.map(id => { 28 | return axios.get(`https://www.omdbapi.com/?i=${id}&apikey=9733f1df`) 29 | }) 30 | 31 | Promise.all(requests).then(result => { 32 | const movies = [] 33 | result.forEach(val => { 34 | movies.push(val.data) 35 | }) 36 | this.setState({ movies }) 37 | }) 38 | } 39 | 40 | selectMovie = selectedMovie => { 41 | this.setState({ selectedMovie }) 42 | } 43 | 44 | render() { 45 | const title = this.state.selectedMovie 46 | ? this.state.selectedMovie.Title 47 | : 'Select a movie from below' 48 | 49 | const releaseDate = this.state.selectedMovie 50 | ? this.state.selectedMovie.Released 51 | : '' 52 | 53 | const MovieItems = this.state.movies.map((movie, index) => { 54 | return ( 55 |
this.selectMovie(movie)} 61 | > 62 |
63 | {movie.Title} 69 | {movie.Title} 70 |
71 |
72 | ) 73 | }) 74 | 75 | return ( 76 |
77 |
78 |

79 | Testing with{' '} 80 | 85 | Cypress.io 86 | 87 |

88 |

89 | {title} 90 | {releaseDate} 91 |

92 |
93 |
94 | {MovieItems} 95 |
96 | 100 |
101 | ) 102 | } 103 | } 104 | 105 | export default App 106 | -------------------------------------------------------------------------------- /cypress-io-react/src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | // In production, we register a service worker to serve assets from local cache. 2 | 3 | // This lets the app load faster on subsequent visits in production, and gives 4 | // it offline capabilities. However, it also means that developers (and users) 5 | // will only see deployed updates on the "N+1" visit to a page, since previously 6 | // cached resources are updated in the background. 7 | 8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. 9 | // This link also includes instructions on opting out of this behavior. 10 | 11 | const isLocalhost = Boolean( 12 | window.location.hostname === 'localhost' || 13 | // [::1] is the IPv6 localhost address. 14 | window.location.hostname === '[::1]' || 15 | // 127.0.0.1/8 is considered localhost for IPv4. 16 | window.location.hostname.match( 17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 18 | ) 19 | ); 20 | 21 | export default function register() { 22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 23 | // The URL constructor is available in all browsers that support SW. 24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location); 25 | if (publicUrl.origin !== window.location.origin) { 26 | // Our service worker won't work if PUBLIC_URL is on a different origin 27 | // from what our page is served on. This might happen if a CDN is used to 28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 29 | return; 30 | } 31 | 32 | window.addEventListener('load', () => { 33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 34 | 35 | if (isLocalhost) { 36 | // This is running on localhost. Lets check if a service worker still exists or not. 37 | checkValidServiceWorker(swUrl); 38 | 39 | // Add some additional logging to localhost, pointing developers to the 40 | // service worker/PWA documentation. 41 | navigator.serviceWorker.ready.then(() => { 42 | console.log( 43 | 'This web app is being served cache-first by a service ' + 44 | 'worker. To learn more, visit https://goo.gl/SC7cgQ' 45 | ); 46 | }); 47 | } else { 48 | // Is not local host. Just register service worker 49 | registerValidSW(swUrl); 50 | } 51 | }); 52 | } 53 | } 54 | 55 | function registerValidSW(swUrl) { 56 | navigator.serviceWorker 57 | .register(swUrl) 58 | .then(registration => { 59 | registration.onupdatefound = () => { 60 | const installingWorker = registration.installing; 61 | installingWorker.onstatechange = () => { 62 | if (installingWorker.state === 'installed') { 63 | if (navigator.serviceWorker.controller) { 64 | // At this point, the old content will have been purged and 65 | // the fresh content will have been added to the cache. 66 | // It's the perfect time to display a "New content is 67 | // available; please refresh." message in your web app. 68 | console.log('New content is available; please refresh.'); 69 | } else { 70 | // At this point, everything has been precached. 71 | // It's the perfect time to display a 72 | // "Content is cached for offline use." message. 73 | console.log('Content is cached for offline use.'); 74 | } 75 | } 76 | }; 77 | }; 78 | }) 79 | .catch(error => { 80 | console.error('Error during service worker registration:', error); 81 | }); 82 | } 83 | 84 | function checkValidServiceWorker(swUrl) { 85 | // Check if the service worker can be found. If it can't reload the page. 86 | fetch(swUrl) 87 | .then(response => { 88 | // Ensure service worker exists, and that we really are getting a JS file. 89 | if ( 90 | response.status === 404 || 91 | response.headers.get('content-type').indexOf('javascript') === -1 92 | ) { 93 | // No service worker found. Probably a different app. Reload the page. 94 | navigator.serviceWorker.ready.then(registration => { 95 | registration.unregister().then(() => { 96 | window.location.reload(); 97 | }); 98 | }); 99 | } else { 100 | // Service worker found. Proceed as normal. 101 | registerValidSW(swUrl); 102 | } 103 | }) 104 | .catch(() => { 105 | console.log( 106 | 'No internet connection found. App is running in offline mode.' 107 | ); 108 | }); 109 | } 110 | 111 | export function unregister() { 112 | if ('serviceWorker' in navigator) { 113 | navigator.serviceWorker.ready.then(registration => { 114 | registration.unregister(); 115 | }); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /image-uploading-with-node-and-cloudinary/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "image-uploading-with-node-and-cloudinary", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "2.1.19", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "append-field": { 17 | "version": "0.1.0", 18 | "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", 19 | "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=" 20 | }, 21 | "array-flatten": { 22 | "version": "1.1.1", 23 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 24 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 25 | }, 26 | "body-parser": { 27 | "version": "1.18.2", 28 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 29 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 30 | "requires": { 31 | "bytes": "3.0.0", 32 | "content-type": "1.0.4", 33 | "debug": "2.6.9", 34 | "depd": "1.1.2", 35 | "http-errors": "1.6.3", 36 | "iconv-lite": "0.4.19", 37 | "on-finished": "2.3.0", 38 | "qs": "6.5.1", 39 | "raw-body": "2.3.2", 40 | "type-is": "1.6.16" 41 | } 42 | }, 43 | "buffer-from": { 44 | "version": "1.1.0", 45 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", 46 | "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" 47 | }, 48 | "busboy": { 49 | "version": "0.2.14", 50 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", 51 | "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", 52 | "requires": { 53 | "dicer": "0.2.5", 54 | "readable-stream": "1.1.14" 55 | } 56 | }, 57 | "bytes": { 58 | "version": "3.0.0", 59 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 60 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 61 | }, 62 | "cloudinary": { 63 | "version": "1.11.0", 64 | "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.11.0.tgz", 65 | "integrity": "sha512-U5j9aWaYrSteboC7KcFZhvWy734d60CrrEUHVMpCtKhEWxpxXyVSe4Ag1BnRaVVq0YOvlJpXe6Qt6hAcb+h1lg==", 66 | "requires": { 67 | "lodash": "4.17.10", 68 | "q": "1.5.1" 69 | } 70 | }, 71 | "concat-stream": { 72 | "version": "1.6.2", 73 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 74 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 75 | "requires": { 76 | "buffer-from": "1.1.0", 77 | "inherits": "2.0.3", 78 | "readable-stream": "2.3.6", 79 | "typedarray": "0.0.6" 80 | }, 81 | "dependencies": { 82 | "isarray": { 83 | "version": "1.0.0", 84 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 85 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 86 | }, 87 | "readable-stream": { 88 | "version": "2.3.6", 89 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 90 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 91 | "requires": { 92 | "core-util-is": "1.0.2", 93 | "inherits": "2.0.3", 94 | "isarray": "1.0.0", 95 | "process-nextick-args": "2.0.0", 96 | "safe-buffer": "5.1.1", 97 | "string_decoder": "1.1.1", 98 | "util-deprecate": "1.0.2" 99 | } 100 | }, 101 | "string_decoder": { 102 | "version": "1.1.1", 103 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 104 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 105 | "requires": { 106 | "safe-buffer": "5.1.1" 107 | } 108 | } 109 | } 110 | }, 111 | "content-disposition": { 112 | "version": "0.5.2", 113 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 114 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 115 | }, 116 | "content-type": { 117 | "version": "1.0.4", 118 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 119 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 120 | }, 121 | "cookie": { 122 | "version": "0.3.1", 123 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 124 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 125 | }, 126 | "cookie-signature": { 127 | "version": "1.0.6", 128 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 129 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 130 | }, 131 | "core-util-is": { 132 | "version": "1.0.2", 133 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 134 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 135 | }, 136 | "debug": { 137 | "version": "2.6.9", 138 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 139 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 140 | "requires": { 141 | "ms": "2.0.0" 142 | } 143 | }, 144 | "depd": { 145 | "version": "1.1.2", 146 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 147 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 148 | }, 149 | "destroy": { 150 | "version": "1.0.4", 151 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 152 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 153 | }, 154 | "dicer": { 155 | "version": "0.2.5", 156 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", 157 | "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", 158 | "requires": { 159 | "readable-stream": "1.1.14", 160 | "streamsearch": "0.1.2" 161 | } 162 | }, 163 | "ee-first": { 164 | "version": "1.1.1", 165 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 166 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 167 | }, 168 | "encodeurl": { 169 | "version": "1.0.2", 170 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 171 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 172 | }, 173 | "escape-html": { 174 | "version": "1.0.3", 175 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 176 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 177 | }, 178 | "etag": { 179 | "version": "1.8.1", 180 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 181 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 182 | }, 183 | "express": { 184 | "version": "4.16.3", 185 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", 186 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 187 | "requires": { 188 | "accepts": "1.3.5", 189 | "array-flatten": "1.1.1", 190 | "body-parser": "1.18.2", 191 | "content-disposition": "0.5.2", 192 | "content-type": "1.0.4", 193 | "cookie": "0.3.1", 194 | "cookie-signature": "1.0.6", 195 | "debug": "2.6.9", 196 | "depd": "1.1.2", 197 | "encodeurl": "1.0.2", 198 | "escape-html": "1.0.3", 199 | "etag": "1.8.1", 200 | "finalhandler": "1.1.1", 201 | "fresh": "0.5.2", 202 | "merge-descriptors": "1.0.1", 203 | "methods": "1.1.2", 204 | "on-finished": "2.3.0", 205 | "parseurl": "1.3.2", 206 | "path-to-regexp": "0.1.7", 207 | "proxy-addr": "2.0.3", 208 | "qs": "6.5.1", 209 | "range-parser": "1.2.0", 210 | "safe-buffer": "5.1.1", 211 | "send": "0.16.2", 212 | "serve-static": "1.13.2", 213 | "setprototypeof": "1.1.0", 214 | "statuses": "1.4.0", 215 | "type-is": "1.6.16", 216 | "utils-merge": "1.0.1", 217 | "vary": "1.1.2" 218 | } 219 | }, 220 | "finalhandler": { 221 | "version": "1.1.1", 222 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 223 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 224 | "requires": { 225 | "debug": "2.6.9", 226 | "encodeurl": "1.0.2", 227 | "escape-html": "1.0.3", 228 | "on-finished": "2.3.0", 229 | "parseurl": "1.3.2", 230 | "statuses": "1.4.0", 231 | "unpipe": "1.0.0" 232 | } 233 | }, 234 | "forwarded": { 235 | "version": "0.1.2", 236 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 237 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 238 | }, 239 | "fresh": { 240 | "version": "0.5.2", 241 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 242 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 243 | }, 244 | "http-errors": { 245 | "version": "1.6.3", 246 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 247 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 248 | "requires": { 249 | "depd": "1.1.2", 250 | "inherits": "2.0.3", 251 | "setprototypeof": "1.1.0", 252 | "statuses": "1.4.0" 253 | } 254 | }, 255 | "iconv-lite": { 256 | "version": "0.4.19", 257 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 258 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 259 | }, 260 | "inherits": { 261 | "version": "2.0.3", 262 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 263 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 264 | }, 265 | "ipaddr.js": { 266 | "version": "1.6.0", 267 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", 268 | "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" 269 | }, 270 | "isarray": { 271 | "version": "0.0.1", 272 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 273 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 274 | }, 275 | "lodash": { 276 | "version": "4.17.10", 277 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", 278 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" 279 | }, 280 | "media-typer": { 281 | "version": "0.3.0", 282 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 283 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 284 | }, 285 | "merge-descriptors": { 286 | "version": "1.0.1", 287 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 288 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 289 | }, 290 | "methods": { 291 | "version": "1.1.2", 292 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 293 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 294 | }, 295 | "mime": { 296 | "version": "1.4.1", 297 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 298 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 299 | }, 300 | "mime-db": { 301 | "version": "1.35.0", 302 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", 303 | "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" 304 | }, 305 | "mime-types": { 306 | "version": "2.1.19", 307 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", 308 | "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", 309 | "requires": { 310 | "mime-db": "1.35.0" 311 | } 312 | }, 313 | "minimist": { 314 | "version": "0.0.8", 315 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 316 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 317 | }, 318 | "mkdirp": { 319 | "version": "0.5.1", 320 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 321 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 322 | "requires": { 323 | "minimist": "0.0.8" 324 | } 325 | }, 326 | "ms": { 327 | "version": "2.0.0", 328 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 329 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 330 | }, 331 | "multer": { 332 | "version": "1.3.1", 333 | "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.1.tgz", 334 | "integrity": "sha512-JHdEoxkA/5NgZRo91RNn4UT+HdcJV9XUo01DTkKC7vo1erNIngtuaw9Y0WI8RdTlyi+wMIbunflhghzVLuGJyw==", 335 | "requires": { 336 | "append-field": "0.1.0", 337 | "busboy": "0.2.14", 338 | "concat-stream": "1.6.2", 339 | "mkdirp": "0.5.1", 340 | "object-assign": "3.0.0", 341 | "on-finished": "2.3.0", 342 | "type-is": "1.6.16", 343 | "xtend": "4.0.1" 344 | } 345 | }, 346 | "negotiator": { 347 | "version": "0.6.1", 348 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 349 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 350 | }, 351 | "object-assign": { 352 | "version": "3.0.0", 353 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", 354 | "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" 355 | }, 356 | "on-finished": { 357 | "version": "2.3.0", 358 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 359 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 360 | "requires": { 361 | "ee-first": "1.1.1" 362 | } 363 | }, 364 | "parseurl": { 365 | "version": "1.3.2", 366 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 367 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 368 | }, 369 | "path-to-regexp": { 370 | "version": "0.1.7", 371 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 372 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 373 | }, 374 | "process-nextick-args": { 375 | "version": "2.0.0", 376 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 377 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 378 | }, 379 | "proxy-addr": { 380 | "version": "2.0.3", 381 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", 382 | "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", 383 | "requires": { 384 | "forwarded": "0.1.2", 385 | "ipaddr.js": "1.6.0" 386 | } 387 | }, 388 | "q": { 389 | "version": "1.5.1", 390 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 391 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" 392 | }, 393 | "qs": { 394 | "version": "6.5.1", 395 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 396 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 397 | }, 398 | "range-parser": { 399 | "version": "1.2.0", 400 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 401 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 402 | }, 403 | "raw-body": { 404 | "version": "2.3.2", 405 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 406 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 407 | "requires": { 408 | "bytes": "3.0.0", 409 | "http-errors": "1.6.2", 410 | "iconv-lite": "0.4.19", 411 | "unpipe": "1.0.0" 412 | }, 413 | "dependencies": { 414 | "depd": { 415 | "version": "1.1.1", 416 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 417 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 418 | }, 419 | "http-errors": { 420 | "version": "1.6.2", 421 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 422 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 423 | "requires": { 424 | "depd": "1.1.1", 425 | "inherits": "2.0.3", 426 | "setprototypeof": "1.0.3", 427 | "statuses": "1.4.0" 428 | } 429 | }, 430 | "setprototypeof": { 431 | "version": "1.0.3", 432 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 433 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 434 | } 435 | } 436 | }, 437 | "readable-stream": { 438 | "version": "1.1.14", 439 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 440 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 441 | "requires": { 442 | "core-util-is": "1.0.2", 443 | "inherits": "2.0.3", 444 | "isarray": "0.0.1", 445 | "string_decoder": "0.10.31" 446 | } 447 | }, 448 | "safe-buffer": { 449 | "version": "5.1.1", 450 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 451 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 452 | }, 453 | "send": { 454 | "version": "0.16.2", 455 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 456 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 457 | "requires": { 458 | "debug": "2.6.9", 459 | "depd": "1.1.2", 460 | "destroy": "1.0.4", 461 | "encodeurl": "1.0.2", 462 | "escape-html": "1.0.3", 463 | "etag": "1.8.1", 464 | "fresh": "0.5.2", 465 | "http-errors": "1.6.3", 466 | "mime": "1.4.1", 467 | "ms": "2.0.0", 468 | "on-finished": "2.3.0", 469 | "range-parser": "1.2.0", 470 | "statuses": "1.4.0" 471 | } 472 | }, 473 | "serve-static": { 474 | "version": "1.13.2", 475 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 476 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 477 | "requires": { 478 | "encodeurl": "1.0.2", 479 | "escape-html": "1.0.3", 480 | "parseurl": "1.3.2", 481 | "send": "0.16.2" 482 | } 483 | }, 484 | "setprototypeof": { 485 | "version": "1.1.0", 486 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 487 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 488 | }, 489 | "statuses": { 490 | "version": "1.4.0", 491 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 492 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 493 | }, 494 | "streamsearch": { 495 | "version": "0.1.2", 496 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 497 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 498 | }, 499 | "string_decoder": { 500 | "version": "0.10.31", 501 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 502 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 503 | }, 504 | "type-is": { 505 | "version": "1.6.16", 506 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 507 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 508 | "requires": { 509 | "media-typer": "0.3.0", 510 | "mime-types": "2.1.19" 511 | } 512 | }, 513 | "typedarray": { 514 | "version": "0.0.6", 515 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 516 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 517 | }, 518 | "unpipe": { 519 | "version": "1.0.0", 520 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 521 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 522 | }, 523 | "util-deprecate": { 524 | "version": "1.0.2", 525 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 526 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 527 | }, 528 | "utils-merge": { 529 | "version": "1.0.1", 530 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 531 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 532 | }, 533 | "vary": { 534 | "version": "1.1.2", 535 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 536 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 537 | }, 538 | "xtend": { 539 | "version": "4.0.1", 540 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 541 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 542 | } 543 | } 544 | } 545 | --------------------------------------------------------------------------------