├── 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 |
2 |
3 |
4 |
5 |
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 |
2 |
3 |
10 |
11 |
![]()
12 |
{{ movie.Title }}
13 |
{{ movie.Year }}
14 |
15 |
16 |
17 |
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 |
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 |

69 | {movie.Title}
70 |
71 |
72 | )
73 | })
74 |
75 | return (
76 |
77 |
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 |
--------------------------------------------------------------------------------