From 2fe11eb707ccffce484ed91f5931a0e32152b6ee Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 17 May 2018 17:45:48 -0700 Subject: [PATCH 01/75] move github files to .github folder, delete useless server config, get development Docker build working --- CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md | 0 contributing.md => .github/CONTRIBUTING.md | 0 ISSUE_TEMPLATE.md => .github/ISSUE_TEMPLATE.md | 0 .../PULL_REQUEST_TEMPLATE.md | 0 Dockerfile | 2 +- index.js | 11 ++++++----- server/config.js | 6 ------ server/server.js | 8 +++----- 8 files changed, 10 insertions(+), 17 deletions(-) rename CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md (100%) rename contributing.md => .github/CONTRIBUTING.md (100%) rename ISSUE_TEMPLATE.md => .github/ISSUE_TEMPLATE.md (100%) rename PULL_REQUEST_TEMPLATE.md => .github/PULL_REQUEST_TEMPLATE.md (100%) delete mode 100644 server/config.js diff --git a/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md similarity index 100% rename from CODE_OF_CONDUCT.md rename to .github/CODE_OF_CONDUCT.md diff --git a/contributing.md b/.github/CONTRIBUTING.md similarity index 100% rename from contributing.md rename to .github/CONTRIBUTING.md diff --git a/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from ISSUE_TEMPLATE.md rename to .github/ISSUE_TEMPLATE.md diff --git a/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from PULL_REQUEST_TEMPLATE.md rename to .github/PULL_REQUEST_TEMPLATE.md diff --git a/Dockerfile b/Dockerfile index 6d75fe0c..a1330f5c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:8.9.0 +FROM node:8.11.1 ENV APP_HOME=/opt/node/app \ TERM=xterm diff --git a/index.js b/index.js index e8b25418..f99dabf7 100644 --- a/index.js +++ b/index.js @@ -17,10 +17,11 @@ if (process.env.NODE_ENV === 'production') { }); require('babel-polyfill'); //// in development, let .env values override those in the environment already (i.e. in docker-compose.yml) - if (process.env.NODE_ENV === 'development') { - for (let key in parsed) { - process.env[key] = parsed[key]; - } - } + // so commenting this out makes the docker container work. + // if (process.env.NODE_ENV === 'development') { + // for (let key in parsed) { + // process.env[key] = parsed[key]; + // } + // } require('./server/server'); } diff --git a/server/config.js b/server/config.js deleted file mode 100644 index cf7fb8e8..00000000 --- a/server/config.js +++ /dev/null @@ -1,6 +0,0 @@ -const config = { - mongoURL: process.env.MONGO_URL || 'mongodb://localhost:27017/p5js-web-editor', - port: process.env.PORT || 8000, -}; - -export default config; diff --git a/server/server.js b/server/server.js index d186ff4e..efb915b7 100644 --- a/server/server.js +++ b/server/server.js @@ -15,7 +15,6 @@ import webpackHotMiddleware from 'webpack-hot-middleware'; import config from '../webpack.config.dev'; // Import all required modules -import serverConfig from './config'; import users from './routes/user.routes'; import sessions from './routes/session.routes'; import projects from './routes/project.routes'; @@ -106,8 +105,7 @@ require('./config/passport'); // const passportConfig = require('./config/passport'); // Connect to MongoDB -// mongoose.connect(process.env.MONGODB_URI || process.env.MONGOLAB_URI); -mongoose.connect(serverConfig.mongoURL); +mongoose.connect(process.env.MONGO_URL); mongoose.connection.on('error', () => { console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); process.exit(1); @@ -132,9 +130,9 @@ app.get('*', (req, res) => { }); // start app -app.listen(serverConfig.port, (error) => { +app.listen(process.env.PORT, (error) => { if (!error) { - console.log(`p5js web editor is running on port: ${serverConfig.port}!`); // eslint-disable-line + console.log(`p5js web editor is running on port: ${process.env.PORT}!`); // eslint-disable-line } }); From 752b804c55bcba44f1ba6407e180775d74b4705c Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 17 May 2018 18:01:03 -0700 Subject: [PATCH 02/75] remove unused index.html, move example fetch to own folder --- index.html | 17 ----------------- package.json | 4 ++-- server/{ => scripts}/examples-gg-latest.js | 4 ++-- server/{ => scripts}/examples.js | 4 ++-- .../scripts/fetch-examples-gg.js | 2 +- .../scripts/fetch-examples.js | 2 +- 6 files changed, 8 insertions(+), 25 deletions(-) delete mode 100644 index.html rename server/{ => scripts}/examples-gg-latest.js (99%) rename server/{ => scripts}/examples.js (99%) rename fetch-examples-gg.js => server/scripts/fetch-examples-gg.js (65%) rename fetch-examples.js => server/scripts/fetch-examples.js (71%) diff --git a/index.html b/index.html deleted file mode 100644 index 10a68414..00000000 --- a/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - p5.js Web Editor - - - - -
-
- - - - diff --git a/package.json b/package.json index bc53a3a2..a0b8bc59 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js --progress", "test": "npm run lint", - "fetch-examples": "node fetch-examples.js", - "fetch-examples-gg": "node fetch-examples-gg.js" + "fetch-examples": "node server/scripts/fetch-examples.js", + "fetch-examples-gg": "node server/scripts/fetch-examples-gg.js" }, "main": "index.js", "author": "Cassie Tarakajian", diff --git a/server/examples-gg-latest.js b/server/scripts/examples-gg-latest.js similarity index 99% rename from server/examples-gg-latest.js rename to server/scripts/examples-gg-latest.js index f2fa5ff2..513e87ff 100644 --- a/server/examples-gg-latest.js +++ b/server/scripts/examples-gg-latest.js @@ -5,8 +5,8 @@ import objectID from 'bson-objectid'; import shortid from 'shortid'; import eachSeries from 'async/eachSeries'; -import User from './models/user'; -import Project from './models/project'; +import User from '../models/user'; +import Project from '../models/project'; // TODO: change to true when testing! const testMake = false; diff --git a/server/examples.js b/server/scripts/examples.js similarity index 99% rename from server/examples.js rename to server/scripts/examples.js index 305b623e..3d0cefb4 100644 --- a/server/examples.js +++ b/server/scripts/examples.js @@ -4,8 +4,8 @@ import mongoose from 'mongoose'; import objectID from 'bson-objectid'; import shortid from 'shortid'; import eachSeries from 'async/eachSeries'; -import User from './models/user'; -import Project from './models/project'; +import User from '../models/user'; +import Project from '../models/project'; const defaultHTML = ` diff --git a/fetch-examples-gg.js b/server/scripts/fetch-examples-gg.js similarity index 65% rename from fetch-examples-gg.js rename to server/scripts/fetch-examples-gg.js index fc354c2c..73fcc26b 100644 --- a/fetch-examples-gg.js +++ b/server/scripts/fetch-examples-gg.js @@ -1,4 +1,4 @@ require('babel-register'); require('babel-polyfill'); require('dotenv').config(); -require('./server/examples-gg-latest.js'); +require('./examples-gg-latest.js'); diff --git a/fetch-examples.js b/server/scripts/fetch-examples.js similarity index 71% rename from fetch-examples.js rename to server/scripts/fetch-examples.js index aecc226a..c46eeb54 100644 --- a/fetch-examples.js +++ b/server/scripts/fetch-examples.js @@ -1,4 +1,4 @@ require('babel-register'); require('babel-polyfill'); require('dotenv').config(); -require('./server/examples.js'); +require('./examples.js'); From 073e307f3397f8a207ab8a0e5c4d560e1bb39418 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 17 May 2018 18:43:06 -0700 Subject: [PATCH 03/75] start production docker configuration --- Dockerfile => Dockerfile-development | 0 README.md | 10 +++++----- docker-compose-development.yml | 28 ++++++++++++++++++++++++++++ docker-compose.yml | 6 +++++- nginx/Dockerfile | 3 +++ nginx.conf => nginx/nginx.conf | 0 6 files changed, 41 insertions(+), 6 deletions(-) rename Dockerfile => Dockerfile-development (100%) create mode 100644 docker-compose-development.yml create mode 100644 nginx/Dockerfile rename nginx.conf => nginx/nginx.conf (100%) diff --git a/Dockerfile b/Dockerfile-development similarity index 100% rename from Dockerfile rename to Dockerfile-development diff --git a/README.md b/README.md index 2b97b9ca..7e7cf286 100644 --- a/README.md +++ b/README.md @@ -54,21 +54,21 @@ Note that this takes up a significant amount of space on your machine. Make sure * Mac: https://www.docker.com/docker-mac * Windows: https://www.docker.com/docker-windows 2. Clone this repository and cd into it -3. `$ docker-compose build` -4. `$ docker-compose run --rm server npm run fetch-examples` +3. `$ docker-compose -f docker-compose-development.yml build` +4. `$ docker-compose -f docker-compose-development.yml run --rm server npm run fetch-examples` Now, anytime you wish to start the server with its dependencies, you can run: -5. `$ docker-compose up` +5. `$ docker-compose -f docker-compose-development.yml up` 6. Navigate to [http://localhost:8000](http://localhost:8000) in your browser To open a terminal/shell in the running Docker server (i.e. after `docker-compose up` has been run): -7. `$ docker-compose exec server bash -l` +7. `$ docker-compose -f docker-compose-development.yml exec server bash -l` If you don't have the full server environment running, you can launch a one-off container instance (and have it automatically deleted after you're done using it): -8. `$ docker-compose run server --rm bash -l` +8. `$ docker-compose -f docker-compose-development.yml run server --rm bash -l` ## Production Installation 1. Clone this repository and `cd` into it diff --git a/docker-compose-development.yml b/docker-compose-development.yml new file mode 100644 index 00000000..9b97dd33 --- /dev/null +++ b/docker-compose-development.yml @@ -0,0 +1,28 @@ +version: '2' +services: + mongo: + image: mongo:3.4.7 + server: + build: + context: . + dockerfile: Dockerfile-development + command: npm start + environment: + - API_URL=/api + - MONGO_URL=mongodb://mongo:27017/p5js-web-editor + - PORT=8000 + - SESSION_SECRET=override_in_dotenv + - AWS_ACCESS_KEY=override_in_dotenv + - AWS_SECRET_KEY=override_in_dotenv + - AWS_REGION=override_in_dotenv + - S3_BUCKET=override_in_dotenv + - GITHUB_ID=override_in_dotenv + - GITHUB_SECRET=override_in_dotenv + - MAILGUN_KEY=override_in_dotenv + volumes: + - .:/opt/node/app + - /opt/node/app/node_modules + ports: + - '8000:8000' + depends_on: + - mongo diff --git a/docker-compose.yml b/docker-compose.yml index 7f6c97bf..c324527d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,8 +2,12 @@ version: '2' services: mongo: image: mongo:3.4.7 + nginx: + build: ./nginx server: - build: . + build: + context: . + dockerfile: Dockerfile-development command: npm start environment: - API_URL=/api diff --git a/nginx/Dockerfile b/nginx/Dockerfile new file mode 100644 index 00000000..4c45e83b --- /dev/null +++ b/nginx/Dockerfile @@ -0,0 +1,3 @@ +FROM nginx:1.13.12 + +COPY nginx.conf /etc/nginx/nginx.conf \ No newline at end of file diff --git a/nginx.conf b/nginx/nginx.conf similarity index 100% rename from nginx.conf rename to nginx/nginx.conf From edadfd5c68450e6b8337b63d996fc29683509111 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 4 Jun 2018 15:34:40 -0700 Subject: [PATCH 04/75] more changes to get dockerization working --- docker-compose-development.yml | 2 +- docker-compose.yml | 4 +- ecosystem.json | 2 +- nginx/Dockerfile | 4 +- nginx/alpha.editor.p5js.org.conf | 61 ++++++++++++++++ nginx/nginx-aws.conf | 122 +++++++++++++++++++++++++++++++ nginx/nginx.conf | 61 ---------------- 7 files changed, 191 insertions(+), 65 deletions(-) create mode 100644 nginx/alpha.editor.p5js.org.conf create mode 100644 nginx/nginx-aws.conf diff --git a/docker-compose-development.yml b/docker-compose-development.yml index 9b97dd33..33d98f76 100644 --- a/docker-compose-development.yml +++ b/docker-compose-development.yml @@ -1,4 +1,4 @@ -version: '2' +version: '3' services: mongo: image: mongo:3.4.7 diff --git a/docker-compose.yml b/docker-compose.yml index c324527d..a5d58f68 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,9 @@ -version: '2' +version: '3' services: mongo: image: mongo:3.4.7 + expose: + - "27017" nginx: build: ./nginx server: diff --git a/ecosystem.json b/ecosystem.json index 5f56d91f..edcd6311 100644 --- a/ecosystem.json +++ b/ecosystem.json @@ -4,6 +4,6 @@ "env": { "NODE_ENV": "production" }, - "instances" : 2, + "instances" : "max", "exec_mode" : "cluster" } \ No newline at end of file diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 4c45e83b..9372b789 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,3 +1,5 @@ FROM nginx:1.13.12 -COPY nginx.conf /etc/nginx/nginx.conf \ No newline at end of file +COPY nginx.conf /etc/nginx/nginx.conf +RUN mkdir /etc/nginx/sites-enabled +COPY alpha.editor.p5js.org.conf /etc/nginx/sites-enabled \ No newline at end of file diff --git a/nginx/alpha.editor.p5js.org.conf b/nginx/alpha.editor.p5js.org.conf new file mode 100644 index 00000000..ec704743 --- /dev/null +++ b/nginx/alpha.editor.p5js.org.conf @@ -0,0 +1,61 @@ + # HTTP - redirect all requests to HTTPS: + server { + listen 80; + server_name alpha.editor.p5js.org; + location / { + proxy_pass http://127.0.0.1:8000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + location ~* \/login(\/)* { + return 301 https://$host$request_uri; + } + location ~* \/signup(\/)* { + return 301 https://$host$request_uri; + } + location ~* \/reset-password(\/)* { + return 301 https://$host$request_uri; + } + location ~* "\/[a-zA-Z0-9._-]{1,20}\/account(\/)*" { + return 301 https://$host$request_uri; + } + +} + +server { + listen 443; + ssl on; + ssl_certificate /etc/letsencrypt/live/alpha.editor.p5js.org/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/alpha.editor.p5js.org/privkey.pem; + server_name alpha.editor.p5js.org; + location / { + proxy_pass http://127.0.0.1:8000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } +} + +server { + listen 80; + server_name editor.p5js.org; + location ~ ^/(.*) { + return 302 http://alpha.editor.p5js.org/$1; + } +} + +server { + listen 443; + ssl on; + ssl_certificate /etc/letsencrypt/live/editor.p5js.org/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/editor.p5js.org/privkey.pem; + server_name editor.p5js.org; + location ~ ^/(.*) { + return 302 https://alpha.editor.p5js.org/$1; + } +} \ No newline at end of file diff --git a/nginx/nginx-aws.conf b/nginx/nginx-aws.conf new file mode 100644 index 00000000..b0ab9feb --- /dev/null +++ b/nginx/nginx-aws.conf @@ -0,0 +1,122 @@ +# For more information on configuration, see: +# * Official English Documentation: http://nginx.org/en/docs/ +# * Official Russian Documentation: http://nginx.org/ru/docs/ + +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Load modular configuration files from the /etc/nginx/conf.d directory. + # See http://nginx.org/en/docs/ngx_core_module.html#include + # for more information. + include /etc/nginx/conf.d/*.conf; + + include /etc/nginx/sites-enabled/*.conf; + + index index.html index.htm; + + server { + listen 80 default_server; + listen [::]:80 default_server; + server_name localhost; + root /usr/share/nginx/html; + + # Load configuration files for the default server block. + include /etc/nginx/default.d/*.conf; + + location / { + } + + # redirect server error pages to the static page /40x.html + # + error_page 404 /404.html; + location = /40x.html { + } + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + +# Settings for a TLS enabled server. +# +# server { +# listen 443 ssl; +# listen [::]:443 ssl; +# server_name localhost; +# root /usr/share/nginx/html; +# +# ssl_certificate "/etc/pki/nginx/server.crt"; +# ssl_certificate_key "/etc/pki/nginx/private/server.key"; +# # It is *strongly* recommended to generate unique DH parameters +# # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 +# #ssl_dhparam "/etc/pki/nginx/dhparams.pem"; +# ssl_session_cache shared:SSL:1m; +# ssl_session_timeout 10m; +# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; +# ssl_ciphers HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP; +# ssl_prefer_server_ciphers on; +# +# # Load configuration files for the default server block. +# include /etc/nginx/default.d/*.conf; +# +# location / { +# } +# +# error_page 404 /404.html; +# location = /40x.html { +# } +# +# error_page 500 502 503 504 /50x.html; +# location = /50x.html { +# } +# } + +} \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf index ec704743..e69de29b 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -1,61 +0,0 @@ - # HTTP - redirect all requests to HTTPS: - server { - listen 80; - server_name alpha.editor.p5js.org; - location / { - proxy_pass http://127.0.0.1:8000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } - location ~* \/login(\/)* { - return 301 https://$host$request_uri; - } - location ~* \/signup(\/)* { - return 301 https://$host$request_uri; - } - location ~* \/reset-password(\/)* { - return 301 https://$host$request_uri; - } - location ~* "\/[a-zA-Z0-9._-]{1,20}\/account(\/)*" { - return 301 https://$host$request_uri; - } - -} - -server { - listen 443; - ssl on; - ssl_certificate /etc/letsencrypt/live/alpha.editor.p5js.org/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/alpha.editor.p5js.org/privkey.pem; - server_name alpha.editor.p5js.org; - location / { - proxy_pass http://127.0.0.1:8000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } -} - -server { - listen 80; - server_name editor.p5js.org; - location ~ ^/(.*) { - return 302 http://alpha.editor.p5js.org/$1; - } -} - -server { - listen 443; - ssl on; - ssl_certificate /etc/letsencrypt/live/editor.p5js.org/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/editor.p5js.org/privkey.pem; - server_name editor.p5js.org; - location ~ ^/(.*) { - return 302 https://alpha.editor.p5js.org/$1; - } -} \ No newline at end of file From ece6c8e450274f6e120fce3f549c26ff5c68f52d Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 7 Jun 2018 13:09:51 -0700 Subject: [PATCH 05/75] update .env.example and README, start to build out Docker development and prodiction setup --- .env.example | 13 +++- Dockerfile | 31 ++++++++ README.md | 75 +++++-------------- docker-compose-development.yml | 16 ++-- docker-compose.yml | 10 ++- nginx/alpha.editor.p5js.org.conf | 50 ++++++------- nginx/nginx.conf | 122 +++++++++++++++++++++++++++++++ 7 files changed, 222 insertions(+), 95 deletions(-) create mode 100644 Dockerfile diff --git a/.env.example b/.env.example index 794704dc..f5db441f 100644 --- a/.env.example +++ b/.env.example @@ -10,7 +10,14 @@ GITHUB_ID= GITHUB_SECRET= GOOGLE_ID= (use google+ api) GOOGLE_SECRET= (use google+ api) +MAILGUN_DOMAIN= MAILGUN_KEY= -EXAMPLE_USERNAME= -EXAMPLE_USER_EMAIL= -EXAMPLE_USER_PASSWORD= \ No newline at end of file +EMAIL_SENDER= +EMAIL_VERIFY_SECRET_TOKEN=whatever_you_want_this_to_be_it_only_matters_for_production +S3_BUCKET_URL_BASE= +EXAMPLE_USERNAME=p5 +EXAMPLE_USER_EMAIL=examples@p5js.org +EXAMPLE_USER_PASSWORD=hellop5js +GG_EXAMPLES_USERNAME=generative-design +GG_EXAMPLES_PASS=generativedesign +GG_EXAMPLES_EMAIL=benedikt.gross@generative-gestaltung.de \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..788b9be1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,31 @@ +FROM node:8.11.1 as base +ENV APP_HOME=/usr/src/app \ + TERM=xterm +RUN mkdir -p $APP_HOME +WORKDIR $APP_HOME +EXPOSE 8000 + +FROM base as development +ENV NODE_ENV development +COPY package.json package-lock.json ./ +RUN npm install +RUN npm rebuild node-sass +COPY .babelrc index.js nodemon.json webpack.config.babel.js webpack.config.dev.js webpack.config.prod.js webpack.config.server.js ./ +COPY client ./client +COPY server ./server +CMD ["npm", "start"] + +FROM development as build +ENV NODE_ENV production +RUN npm run build + +FROM base as production +ENV NODE_ENV=production +COPY package.json package-lock.json ./ +RUN npm install --production +RUN npm rebuild node-sass +RUN npm install pm2 -g +COPY index.js ./ +COPY ecosystem.json ./ +COPY --from=build /usr/src/app/dist ./dist +CMD ["pm2-runtime", "ecosystem.json"] diff --git a/README.md b/README.md index 7e7cf286..8cab8c79 100644 --- a/README.md +++ b/README.md @@ -10,33 +10,12 @@ This project is currently in development! It will be announced when there is a ( 4. Install MongoDB and make sure it is running * For Mac OSX with [homebrew](http://brew.sh/): `brew install mongodb` then `brew services start mongodb` * For Windows and Linux: [MongoDB Installation](https://docs.mongodb.com/manual/installation/) -5. Create a file called `.env` in the root of this directory that looks like - - ``` - API_URL=/api - MONGO_URL=mongodb://localhost:27017/p5js-web-editor - PORT=8000 - SESSION_SECRET=whatever_you_want_this_to_be_it_only_matters_for_production - AWS_ACCESS_KEY= - AWS_SECRET_KEY= - AWS_REGION= - S3_BUCKET= - GITHUB_ID= - GITHUB_SECRET= - GOOGLE_ID= (use google+ api) - GOOGLE_SECRET= (use google+ api) - MAILGUN_KEY= - EXAMPLE_USERNAME= - EXAMPLE_USER_EMAIL= - EXAMPLE_USER_PASSWORD= - ``` - - If you don't care about being able to upload media files to S3 or Login with Github or Google, you can drop in the file exactly how it is. Or, if you don't want to do that, just ask me to send you mine. Refer to [this gist](https://gist.github.com/catarak/70c9301f0fd1ac2d6b58de03f61997e3) for creating an S3 bucket for testing, or if you don't want to do that, I can add you to one of my S3 buckets. - -6. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' -7. `$ npm start` -8. Navigate to [http://localhost:8000](http://localhost:8000) in your browser -9. Install the [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en). +5. `$ cp .env.example .env` +6. (Optional) Update `.env` with necessary keys to enable certain app behavoirs, i.e. add Github ID and Github Secret if you want to be able to log in with Github. +7. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' +8. `$ npm start` +9. Navigate to [http://localhost:8000](http://localhost:8000) in your browser +10. Install the [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en). 10. Open and close the Redux DevTools using `ctrl+h`, and move them with `ctrl+w` ### Testing SSL on your local machine @@ -74,52 +53,32 @@ If you don't have the full server environment running, you can launch a one-off 1. Clone this repository and `cd` into it 2. `$ npm install` 3. Install MongoDB and make sure it is running -4. Create a file called `.env` in the root of this directory that looks like - - ``` - API_URL=/api - MONGO_URL=mongodb://localhost:27017/p5js-web-editor - PORT=8000 - SESSION_SECRET=make_this_a_long-random_string_like_maybe_126_characters_long - AWS_ACCESS_KEY= - AWS_SECRET_KEY= - AWS_REGION= - S3_BUCKET= - GITHUB_ID= - GITHUB_SECRET= - GOOGLE_ID= (use google+ api) - GOOGLE_SECRET= (use google+ api) - EMAIL_SENDER= - MAILGUN_KEY= - MAILGUN_DOMAIN= - EMAIL_VERIFY_SECRET_TOKEN=whatever_you_want_this_to_be_it_only_matters_for_production - EXAMPLE_USERNAME= - EXAMPLE_USER_EMAIL= - EXAMPLE_USER_PASSWORD= - ``` - For production, you will need to have real Github and Amazon credentials. Refer to [this gist](https://gist.github.com/catarak/70c9301f0fd1ac2d6b58de03f61997e3) for creating an S3 bucket for testing. - -5. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' -6. `$ npm run build` -7. `$ npm run start:prod` +4. `$ cp .env.example .env` +5. (NOT Optional) edit `.env` and fill in all necessart values. +6. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' +7. `$ npm run build` +8. `$ npm run start:prod` ### For Production Setup with PM2 1. `$ npm install -g pm2` 2. `$ pm2 start ecosystem.json` -## Optional S3 bucket URL base configuration +## S3 Bucket Configuration + +Please refer to the folllowing [gist](https://gist.github.com/catarak/70c9301f0fd1ac2d6b58de03f61997e3) to set up an S3 bucket to be used with this project. + If your S3 bucket is in the US East (N Virginia) region (us-east-1), you'll need to set a custom URL base for it, because it does not follow the standard naming pattern as the rest of the regions. Instead, add the following to your environment/.env file: -```S3_BUCKET_URL_BASE=https://s3.amazonaws.com``` +`S3_BUCKET_URL_BASE=https://s3.amazonaws.com` If you've configured your S3 bucket and DNS records to use a custom domain name, you can also set it using this variable. I.e.: -```S3_BUCKET_URL_BASE=https://files.mydomain.com``` +`S3_BUCKET_URL_BASE=https://files.mydomain.com` For more information on using a custom domain, see this documentation link: diff --git a/docker-compose-development.yml b/docker-compose-development.yml index 33d98f76..c0fbfdb6 100644 --- a/docker-compose-development.yml +++ b/docker-compose-development.yml @@ -1,12 +1,14 @@ -version: '3' +version: '3.4' services: mongo: image: mongo:3.4.7 + volumes: + - dbdata:/data/db server: build: - context: . - dockerfile: Dockerfile-development - command: npm start + context: ./ + dockerfile: Dockerfile + target: development environment: - API_URL=/api - MONGO_URL=mongodb://mongo:27017/p5js-web-editor @@ -20,9 +22,11 @@ services: - GITHUB_SECRET=override_in_dotenv - MAILGUN_KEY=override_in_dotenv volumes: - - .:/opt/node/app - - /opt/node/app/node_modules + - .:/usr/src/app + - /usr/src/app/node_modules ports: - '8000:8000' depends_on: - mongo +volumes: + dbdata: diff --git a/docker-compose.yml b/docker-compose.yml index a5d58f68..306c0694 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,9 @@ -version: '3' +version: '3.4' services: mongo: image: mongo:3.4.7 + volumes: + - dbdata:/data/db expose: - "27017" nginx: @@ -9,8 +11,8 @@ services: server: build: context: . - dockerfile: Dockerfile-development - command: npm start + dockerfile: Dockerfile + target: production environment: - API_URL=/api - MONGO_URL=mongodb://mongo:27017/p5js-web-editor @@ -30,3 +32,5 @@ services: - '8000:8000' depends_on: - mongo +volumes: + dbdata: diff --git a/nginx/alpha.editor.p5js.org.conf b/nginx/alpha.editor.p5js.org.conf index ec704743..f89e51bd 100644 --- a/nginx/alpha.editor.p5js.org.conf +++ b/nginx/alpha.editor.p5js.org.conf @@ -25,21 +25,21 @@ } -server { - listen 443; - ssl on; - ssl_certificate /etc/letsencrypt/live/alpha.editor.p5js.org/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/alpha.editor.p5js.org/privkey.pem; - server_name alpha.editor.p5js.org; - location / { - proxy_pass http://127.0.0.1:8000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } -} +# server { +# listen 443; +# ssl on; +# ssl_certificate /etc/letsencrypt/live/alpha.editor.p5js.org/fullchain.pem; +# ssl_certificate_key /etc/letsencrypt/live/alpha.editor.p5js.org/privkey.pem; +# server_name alpha.editor.p5js.org; +# location / { +# proxy_pass http://127.0.0.1:8000; +# proxy_http_version 1.1; +# proxy_set_header Upgrade $http_upgrade; +# proxy_set_header Connection 'upgrade'; +# proxy_set_header Host $host; +# proxy_cache_bypass $http_upgrade; +# } +# } server { listen 80; @@ -49,13 +49,13 @@ server { } } -server { - listen 443; - ssl on; - ssl_certificate /etc/letsencrypt/live/editor.p5js.org/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/editor.p5js.org/privkey.pem; - server_name editor.p5js.org; - location ~ ^/(.*) { - return 302 https://alpha.editor.p5js.org/$1; - } -} \ No newline at end of file +# server { +# listen 443; +# ssl on; +# ssl_certificate /etc/letsencrypt/live/editor.p5js.org/fullchain.pem; +# ssl_certificate_key /etc/letsencrypt/live/editor.p5js.org/privkey.pem; +# server_name editor.p5js.org; +# location ~ ^/(.*) { +# return 302 https://alpha.editor.p5js.org/$1; +# } +# } \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf index e69de29b..b0ab9feb 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -0,0 +1,122 @@ +# For more information on configuration, see: +# * Official English Documentation: http://nginx.org/en/docs/ +# * Official Russian Documentation: http://nginx.org/ru/docs/ + +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Load modular configuration files from the /etc/nginx/conf.d directory. + # See http://nginx.org/en/docs/ngx_core_module.html#include + # for more information. + include /etc/nginx/conf.d/*.conf; + + include /etc/nginx/sites-enabled/*.conf; + + index index.html index.htm; + + server { + listen 80 default_server; + listen [::]:80 default_server; + server_name localhost; + root /usr/share/nginx/html; + + # Load configuration files for the default server block. + include /etc/nginx/default.d/*.conf; + + location / { + } + + # redirect server error pages to the static page /40x.html + # + error_page 404 /404.html; + location = /40x.html { + } + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + +# Settings for a TLS enabled server. +# +# server { +# listen 443 ssl; +# listen [::]:443 ssl; +# server_name localhost; +# root /usr/share/nginx/html; +# +# ssl_certificate "/etc/pki/nginx/server.crt"; +# ssl_certificate_key "/etc/pki/nginx/private/server.key"; +# # It is *strongly* recommended to generate unique DH parameters +# # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 +# #ssl_dhparam "/etc/pki/nginx/dhparams.pem"; +# ssl_session_cache shared:SSL:1m; +# ssl_session_timeout 10m; +# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; +# ssl_ciphers HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP; +# ssl_prefer_server_ciphers on; +# +# # Load configuration files for the default server block. +# include /etc/nginx/default.d/*.conf; +# +# location / { +# } +# +# error_page 404 /404.html; +# location = /40x.html { +# } +# +# error_page 500 502 503 504 /50x.html; +# location = /50x.html { +# } +# } + +} \ No newline at end of file From 28c91b7d05615e9f32c675698a7600b6874ca65d Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 7 Jun 2018 14:49:17 -0700 Subject: [PATCH 06/75] start to handle environment variables --- Dockerfile | 4 ++-- index.js | 8 +++++++- nginx/Dockerfile | 2 +- webpack.config.prod.js | 6 +++++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 788b9be1..82c31e64 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,7 @@ CMD ["npm", "start"] FROM development as build ENV NODE_ENV production +COPY .env ./ RUN npm run build FROM base as production @@ -25,7 +26,6 @@ COPY package.json package-lock.json ./ RUN npm install --production RUN npm rebuild node-sass RUN npm install pm2 -g -COPY index.js ./ -COPY ecosystem.json ./ +COPY index.js ecosystem.json .env ./ COPY --from=build /usr/src/app/dist ./dist CMD ["pm2-runtime", "ecosystem.json"] diff --git a/index.js b/index.js index f99dabf7..289a8997 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,15 @@ -let parsed = require('dotenv').config(); +// let parsed = require('dotenv').config(); if (process.env.NODE_ENV === 'production') { + try { + require('dotenv').config(); + } catch(error) { + console.log('.env file does not exist. Assuming environment variables are pre-loaded.'); + } process.env.webpackAssets = JSON.stringify(require('./dist/static/manifest.json')); process.env.webpackChunkAssets = JSON.stringify(require('./dist/static/chunk-manifest.json')); require('./dist/server.bundle.js'); } else { + let parsed = require('dotenv').config(); require('babel-register')({ "plugins": [ [ diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 9372b789..49d6b29a 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,5 +1,5 @@ FROM nginx:1.13.12 +RUN mkdir -p /etc/nginx/sites-enabled COPY nginx.conf /etc/nginx/nginx.conf -RUN mkdir /etc/nginx/sites-enabled COPY alpha.editor.p5js.org.conf /etc/nginx/sites-enabled \ No newline at end of file diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 1a59fd96..64bae5ff 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -6,7 +6,11 @@ const cssnext = require('postcss-cssnext'); const postcssFocus = require('postcss-focus'); const postcssReporter = require('postcss-reporter'); const cssnano = require('cssnano'); -require('dotenv').config(); +try { + require('dotenv').config(); +} catch (error) { + console.log('.env file does not exist. Assuming environment variables are pre-loaded.'); +} module.exports = { devtool: 'source-map', From 93e4052101c150eb320d038279aee4eca2d19463 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 8 Jun 2018 10:41:33 -0700 Subject: [PATCH 07/75] change Dockerfile to fix environment variables and fetching examples --- Dockerfile | 7 +++++-- docker-compose-development.yml | 10 ---------- docker-compose.yml | 12 ++---------- index.js | 6 ------ package.json | 4 ++-- backup.sh => scripts/backup.sh | 0 {server/scripts => scripts}/examples-gg-latest.js | 0 {server/scripts => scripts}/examples.js | 0 {server/scripts => scripts}/fetch-examples-gg.js | 4 +++- {server/scripts => scripts}/fetch-examples.js | 4 +++- webpack.config.prod.js | 4 +--- 11 files changed, 16 insertions(+), 35 deletions(-) rename backup.sh => scripts/backup.sh (100%) rename {server/scripts => scripts}/examples-gg-latest.js (100%) rename {server/scripts => scripts}/examples.js (100%) rename {server/scripts => scripts}/fetch-examples-gg.js (53%) rename {server/scripts => scripts}/fetch-examples.js (50%) diff --git a/Dockerfile b/Dockerfile index 82c31e64..b47c384f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,11 +13,12 @@ RUN npm rebuild node-sass COPY .babelrc index.js nodemon.json webpack.config.babel.js webpack.config.dev.js webpack.config.prod.js webpack.config.server.js ./ COPY client ./client COPY server ./server +COPY scripts ./scripts CMD ["npm", "start"] FROM development as build ENV NODE_ENV production -COPY .env ./ +# COPY .env ./ RUN npm run build FROM base as production @@ -26,6 +27,8 @@ COPY package.json package-lock.json ./ RUN npm install --production RUN npm rebuild node-sass RUN npm install pm2 -g -COPY index.js ecosystem.json .env ./ +COPY index.js ecosystem.json .babelrc ./ +COPY scripts ./scripts +# COPY .env ./ COPY --from=build /usr/src/app/dist ./dist CMD ["pm2-runtime", "ecosystem.json"] diff --git a/docker-compose-development.yml b/docker-compose-development.yml index c0fbfdb6..e07f2ebf 100644 --- a/docker-compose-development.yml +++ b/docker-compose-development.yml @@ -10,17 +10,7 @@ services: dockerfile: Dockerfile target: development environment: - - API_URL=/api - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - - PORT=8000 - - SESSION_SECRET=override_in_dotenv - - AWS_ACCESS_KEY=override_in_dotenv - - AWS_SECRET_KEY=override_in_dotenv - - AWS_REGION=override_in_dotenv - - S3_BUCKET=override_in_dotenv - - GITHUB_ID=override_in_dotenv - - GITHUB_SECRET=override_in_dotenv - - MAILGUN_KEY=override_in_dotenv volumes: - .:/usr/src/app - /usr/src/app/node_modules diff --git a/docker-compose.yml b/docker-compose.yml index 306c0694..f7c2a490 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,18 +13,10 @@ services: context: . dockerfile: Dockerfile target: production + env_file: + - .env environment: - - API_URL=/api - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - - PORT=8000 - - SESSION_SECRET=override_in_dotenv - - AWS_ACCESS_KEY=override_in_dotenv - - AWS_SECRET_KEY=override_in_dotenv - - AWS_REGION=override_in_dotenv - - S3_BUCKET=override_in_dotenv - - GITHUB_ID=override_in_dotenv - - GITHUB_SECRET=override_in_dotenv - - MAILGUN_KEY=override_in_dotenv volumes: - .:/opt/node/app - /opt/node/app/node_modules diff --git a/index.js b/index.js index 289a8997..b65d1733 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,4 @@ -// let parsed = require('dotenv').config(); if (process.env.NODE_ENV === 'production') { - try { - require('dotenv').config(); - } catch(error) { - console.log('.env file does not exist. Assuming environment variables are pre-loaded.'); - } process.env.webpackAssets = JSON.stringify(require('./dist/static/manifest.json')); process.env.webpackChunkAssets = JSON.stringify(require('./dist/static/chunk-manifest.json')); require('./dist/server.bundle.js'); diff --git a/package.json b/package.json index a0b8bc59..e76f9646 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js --progress", "test": "npm run lint", - "fetch-examples": "node server/scripts/fetch-examples.js", - "fetch-examples-gg": "node server/scripts/fetch-examples-gg.js" + "fetch-examples": "node scripts/fetch-examples.js", + "fetch-examples-gg": "node scripts/fetch-examples-gg.js" }, "main": "index.js", "author": "Cassie Tarakajian", diff --git a/backup.sh b/scripts/backup.sh similarity index 100% rename from backup.sh rename to scripts/backup.sh diff --git a/server/scripts/examples-gg-latest.js b/scripts/examples-gg-latest.js similarity index 100% rename from server/scripts/examples-gg-latest.js rename to scripts/examples-gg-latest.js diff --git a/server/scripts/examples.js b/scripts/examples.js similarity index 100% rename from server/scripts/examples.js rename to scripts/examples.js diff --git a/server/scripts/fetch-examples-gg.js b/scripts/fetch-examples-gg.js similarity index 53% rename from server/scripts/fetch-examples-gg.js rename to scripts/fetch-examples-gg.js index 73fcc26b..647618d9 100644 --- a/server/scripts/fetch-examples-gg.js +++ b/scripts/fetch-examples-gg.js @@ -1,4 +1,6 @@ require('babel-register'); require('babel-polyfill'); -require('dotenv').config(); +if (process.env.NODE_ENV !== "production") { + require('dotenv').config(); +} require('./examples-gg-latest.js'); diff --git a/server/scripts/fetch-examples.js b/scripts/fetch-examples.js similarity index 50% rename from server/scripts/fetch-examples.js rename to scripts/fetch-examples.js index c46eeb54..d4037179 100644 --- a/server/scripts/fetch-examples.js +++ b/scripts/fetch-examples.js @@ -1,4 +1,6 @@ require('babel-register'); require('babel-polyfill'); -require('dotenv').config(); +if (process.env.NODE_ENV !== "production") { + require('dotenv').config(); +} require('./examples.js'); diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 64bae5ff..7170b9c0 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -6,10 +6,8 @@ const cssnext = require('postcss-cssnext'); const postcssFocus = require('postcss-focus'); const postcssReporter = require('postcss-reporter'); const cssnano = require('cssnano'); -try { +if (process.env.NODE_ENV !== "production") { require('dotenv').config(); -} catch (error) { - console.log('.env file does not exist. Assuming environment variables are pre-loaded.'); } module.exports = { From 6ecfe6448573e8153f8f443d40fb17dc05c555b3 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 13 Jun 2018 17:40:46 -0700 Subject: [PATCH 08/75] fix fetch example scripts, add webpack config to build fetch script bundles --- scripts/backup.sh => backup.sh | 0 package.json | 4 +- .../scripts}/examples-gg-latest.js | 0 {scripts => server/scripts}/examples.js | 0 .../scripts}/fetch-examples-gg.js | 0 {scripts => server/scripts}/fetch-examples.js | 0 webpack.config.examples.js | 93 +++++++++++++++++++ 7 files changed, 95 insertions(+), 2 deletions(-) rename scripts/backup.sh => backup.sh (100%) rename {scripts => server/scripts}/examples-gg-latest.js (100%) rename {scripts => server/scripts}/examples.js (100%) rename {scripts => server/scripts}/fetch-examples-gg.js (100%) rename {scripts => server/scripts}/fetch-examples.js (100%) create mode 100644 webpack.config.examples.js diff --git a/scripts/backup.sh b/backup.sh similarity index 100% rename from scripts/backup.sh rename to backup.sh diff --git a/package.json b/package.json index e76f9646..6edafcd9 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js --progress", "test": "npm run lint", - "fetch-examples": "node scripts/fetch-examples.js", - "fetch-examples-gg": "node scripts/fetch-examples-gg.js" + "fetch-examples": "node ./server/scripts/fetch-examples.js", + "fetch-examples-gg": "node ./server/scripts/fetch-examples-gg.js" }, "main": "index.js", "author": "Cassie Tarakajian", diff --git a/scripts/examples-gg-latest.js b/server/scripts/examples-gg-latest.js similarity index 100% rename from scripts/examples-gg-latest.js rename to server/scripts/examples-gg-latest.js diff --git a/scripts/examples.js b/server/scripts/examples.js similarity index 100% rename from scripts/examples.js rename to server/scripts/examples.js diff --git a/scripts/fetch-examples-gg.js b/server/scripts/fetch-examples-gg.js similarity index 100% rename from scripts/fetch-examples-gg.js rename to server/scripts/fetch-examples-gg.js diff --git a/scripts/fetch-examples.js b/server/scripts/fetch-examples.js similarity index 100% rename from scripts/fetch-examples.js rename to server/scripts/fetch-examples.js diff --git a/webpack.config.examples.js b/webpack.config.examples.js new file mode 100644 index 00000000..a2e08e7e --- /dev/null +++ b/webpack.config.examples.js @@ -0,0 +1,93 @@ +const path = require('path'); +const nodeExternals = require('webpack-node-externals'); + +module.exports = [{ + entry: path.resolve(__dirname, 'server/scripts/fetch-examples.js'), + + output: { + path: __dirname + '/dist/', + filename: 'fetch-examples.bundle.js' + }, + + target: 'node', + + externals: [nodeExternals()], + + resolve: { + extensions: ['*', '.js', '.jsx'], + modules: [ + 'client', + 'node_modules', + ], + }, + + module: { + loaders: [ + { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader', + query: { + presets: [ + 'react', + 'env', + 'stage-0', + ], + plugins: [ + [ + 'babel-plugin-webpack-loaders', { + 'config': './webpack.config.babel.js', + "verbose": false + } + ] + ] + }, + } + ], + }, +}, +{ + entry: path.resolve(__dirname, 'server/scripts/fetch-examples-gg.js'), + + output: { + path: __dirname + '/dist/', + filename: 'fetch-examples-gg.bundle.js' + }, + + target: 'node', + + externals: [nodeExternals()], + + resolve: { + extensions: ['*', '.js', '.jsx'], + modules: [ + 'client', + 'node_modules', + ], + }, + + module: { + loaders: [ + { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader', + query: { + presets: [ + 'react', + 'env', + 'stage-0', + ], + plugins: [ + [ + 'babel-plugin-webpack-loaders', { + 'config': './webpack.config.babel.js', + "verbose": false + } + ] + ] + }, + } + ], + }, +}]; \ No newline at end of file From d8e129780341f7e52deecca062cf7e9f3d870933 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 15 Jun 2018 13:51:42 -0700 Subject: [PATCH 09/75] get local-ssl-proxy working for testing prod locally --- Dockerfile | 13 +++++++------ docker-compose.yml | 8 ++++++-- package.json | 8 ++++++-- server/scripts/fetch-examples-gg.js | 2 +- server/scripts/fetch-examples.js | 2 +- webpack.config.dev.js | 4 +++- webpack.config.prod.js | 2 +- 7 files changed, 25 insertions(+), 14 deletions(-) diff --git a/Dockerfile b/Dockerfile index b47c384f..05076099 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,21 +4,21 @@ ENV APP_HOME=/usr/src/app \ RUN mkdir -p $APP_HOME WORKDIR $APP_HOME EXPOSE 8000 +EXPOSE 80 +EXPOSE 443 FROM base as development ENV NODE_ENV development COPY package.json package-lock.json ./ RUN npm install RUN npm rebuild node-sass -COPY .babelrc index.js nodemon.json webpack.config.babel.js webpack.config.dev.js webpack.config.prod.js webpack.config.server.js ./ +COPY .babelrc index.js nodemon.json webpack.config.babel.js webpack.config.dev.js webpack.config.prod.js webpack.config.server.js webpack.config.examples.js ./ COPY client ./client COPY server ./server -COPY scripts ./scripts CMD ["npm", "start"] FROM development as build ENV NODE_ENV production -# COPY .env ./ RUN npm run build FROM base as production @@ -27,8 +27,9 @@ COPY package.json package-lock.json ./ RUN npm install --production RUN npm rebuild node-sass RUN npm install pm2 -g -COPY index.js ecosystem.json .babelrc ./ -COPY scripts ./scripts -# COPY .env ./ +RUN npm install local-ssl-proxy +COPY index.js ecosystem.json ./ COPY --from=build /usr/src/app/dist ./dist +RUN npm run ssl-proxy +#RUN npm run fetch-examples:prod CMD ["pm2-runtime", "ecosystem.json"] diff --git a/docker-compose.yml b/docker-compose.yml index f7c2a490..87d5fd93 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,8 +6,8 @@ services: - dbdata:/data/db expose: - "27017" - nginx: - build: ./nginx + # nginx: + # build: ./nginx server: build: context: . @@ -17,11 +17,15 @@ services: - .env environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor + - API_URL=https://localhost/api + - PORT=80 volumes: - .:/opt/node/app - /opt/node/app/node_modules ports: - '8000:8000' + - '80:80' + - '443:443' depends_on: - mongo volumes: diff --git a/package.json b/package.json index 6edafcd9..09d90d7c 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,16 @@ "start:prod": "cross-env NODE_ENV=production node index.js", "lint": "eslint client server --ext .jsx --ext .js", "lint-fix": "eslint client server --ext .jsx --ext .js --fix", - "build": "npm run build:client && npm run build:server", + "build": "npm run build:client && npm run build:server && npm run build:examples", "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js --progress", + "build:examples": "cross-env NODE_ENV=production webpack --config webpack.config.examples.js --progress", "test": "npm run lint", "fetch-examples": "node ./server/scripts/fetch-examples.js", - "fetch-examples-gg": "node ./server/scripts/fetch-examples-gg.js" + "fetch-examples-gg": "node ./server/scripts/fetch-examples-gg.js", + "fetch-examples:prod": "node ./dist/fetch-examples.bundle.js", + "fetch-examples-gg:prod": "node ./dist/fetch-examples.bundle.js", + "ssl-proxy": "local-ssl-proxy --source 443 --target 80 &" }, "main": "index.js", "author": "Cassie Tarakajian", diff --git a/server/scripts/fetch-examples-gg.js b/server/scripts/fetch-examples-gg.js index 647618d9..51867785 100644 --- a/server/scripts/fetch-examples-gg.js +++ b/server/scripts/fetch-examples-gg.js @@ -1,6 +1,6 @@ require('babel-register'); require('babel-polyfill'); -if (process.env.NODE_ENV !== "production") { +if (process.env.NODE_ENV === "development") { require('dotenv').config(); } require('./examples-gg-latest.js'); diff --git a/server/scripts/fetch-examples.js b/server/scripts/fetch-examples.js index d4037179..e287b076 100644 --- a/server/scripts/fetch-examples.js +++ b/server/scripts/fetch-examples.js @@ -1,6 +1,6 @@ require('babel-register'); require('babel-polyfill'); -if (process.env.NODE_ENV !== "production") { +if (process.env.NODE_ENV === "development") { require('dotenv').config(); } require('./examples.js'); diff --git a/webpack.config.dev.js b/webpack.config.dev.js index 9b453932..81d542ba 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -1,5 +1,7 @@ const webpack = require('webpack'); -require('dotenv').config(); +if (process.env.NODE_ENV === 'development') { + require('dotenv').config(); +} module.exports = { devtool: 'cheap-module-eval-source-map', diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 7170b9c0..2f02835e 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -6,7 +6,7 @@ const cssnext = require('postcss-cssnext'); const postcssFocus = require('postcss-focus'); const postcssReporter = require('postcss-reporter'); const cssnano = require('cssnano'); -if (process.env.NODE_ENV !== "production") { +if (process.env.NODE_ENV === "development") { require('dotenv').config(); } From 5613a285f6fefc25a27980231b921a46d6528995 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 17 May 2018 17:45:48 -0700 Subject: [PATCH 10/75] move github files to .github folder, delete useless server config, get development Docker build working --- CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md | 0 contributing.md => .github/CONTRIBUTING.md | 0 ISSUE_TEMPLATE.md => .github/ISSUE_TEMPLATE.md | 0 .../PULL_REQUEST_TEMPLATE.md | 0 Dockerfile | 2 +- index.js | 11 ++++++----- server/config.js | 6 ------ server/server.js | 8 +++----- 8 files changed, 10 insertions(+), 17 deletions(-) rename CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md (100%) rename contributing.md => .github/CONTRIBUTING.md (100%) rename ISSUE_TEMPLATE.md => .github/ISSUE_TEMPLATE.md (100%) rename PULL_REQUEST_TEMPLATE.md => .github/PULL_REQUEST_TEMPLATE.md (100%) delete mode 100644 server/config.js diff --git a/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md similarity index 100% rename from CODE_OF_CONDUCT.md rename to .github/CODE_OF_CONDUCT.md diff --git a/contributing.md b/.github/CONTRIBUTING.md similarity index 100% rename from contributing.md rename to .github/CONTRIBUTING.md diff --git a/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from ISSUE_TEMPLATE.md rename to .github/ISSUE_TEMPLATE.md diff --git a/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from PULL_REQUEST_TEMPLATE.md rename to .github/PULL_REQUEST_TEMPLATE.md diff --git a/Dockerfile b/Dockerfile index 6d75fe0c..a1330f5c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:8.9.0 +FROM node:8.11.1 ENV APP_HOME=/opt/node/app \ TERM=xterm diff --git a/index.js b/index.js index e8b25418..f99dabf7 100644 --- a/index.js +++ b/index.js @@ -17,10 +17,11 @@ if (process.env.NODE_ENV === 'production') { }); require('babel-polyfill'); //// in development, let .env values override those in the environment already (i.e. in docker-compose.yml) - if (process.env.NODE_ENV === 'development') { - for (let key in parsed) { - process.env[key] = parsed[key]; - } - } + // so commenting this out makes the docker container work. + // if (process.env.NODE_ENV === 'development') { + // for (let key in parsed) { + // process.env[key] = parsed[key]; + // } + // } require('./server/server'); } diff --git a/server/config.js b/server/config.js deleted file mode 100644 index cf7fb8e8..00000000 --- a/server/config.js +++ /dev/null @@ -1,6 +0,0 @@ -const config = { - mongoURL: process.env.MONGO_URL || 'mongodb://localhost:27017/p5js-web-editor', - port: process.env.PORT || 8000, -}; - -export default config; diff --git a/server/server.js b/server/server.js index d186ff4e..efb915b7 100644 --- a/server/server.js +++ b/server/server.js @@ -15,7 +15,6 @@ import webpackHotMiddleware from 'webpack-hot-middleware'; import config from '../webpack.config.dev'; // Import all required modules -import serverConfig from './config'; import users from './routes/user.routes'; import sessions from './routes/session.routes'; import projects from './routes/project.routes'; @@ -106,8 +105,7 @@ require('./config/passport'); // const passportConfig = require('./config/passport'); // Connect to MongoDB -// mongoose.connect(process.env.MONGODB_URI || process.env.MONGOLAB_URI); -mongoose.connect(serverConfig.mongoURL); +mongoose.connect(process.env.MONGO_URL); mongoose.connection.on('error', () => { console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); process.exit(1); @@ -132,9 +130,9 @@ app.get('*', (req, res) => { }); // start app -app.listen(serverConfig.port, (error) => { +app.listen(process.env.PORT, (error) => { if (!error) { - console.log(`p5js web editor is running on port: ${serverConfig.port}!`); // eslint-disable-line + console.log(`p5js web editor is running on port: ${process.env.PORT}!`); // eslint-disable-line } }); From 41f793b130fd6c70477d22805a0ef8c986126b0b Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 17 May 2018 18:01:03 -0700 Subject: [PATCH 11/75] remove unused index.html, move example fetch to own folder --- index.html | 17 ----------------- package.json | 4 ++-- server/{ => scripts}/examples-gg-latest.js | 4 ++-- server/{ => scripts}/examples.js | 4 ++-- .../scripts/fetch-examples-gg.js | 2 +- .../scripts/fetch-examples.js | 2 +- 6 files changed, 8 insertions(+), 25 deletions(-) delete mode 100644 index.html rename server/{ => scripts}/examples-gg-latest.js (99%) rename server/{ => scripts}/examples.js (99%) rename fetch-examples-gg.js => server/scripts/fetch-examples-gg.js (65%) rename fetch-examples.js => server/scripts/fetch-examples.js (71%) diff --git a/index.html b/index.html deleted file mode 100644 index 10a68414..00000000 --- a/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - p5.js Web Editor - - - - -
-
- - - - diff --git a/package.json b/package.json index bc53a3a2..a0b8bc59 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js --progress", "test": "npm run lint", - "fetch-examples": "node fetch-examples.js", - "fetch-examples-gg": "node fetch-examples-gg.js" + "fetch-examples": "node server/scripts/fetch-examples.js", + "fetch-examples-gg": "node server/scripts/fetch-examples-gg.js" }, "main": "index.js", "author": "Cassie Tarakajian", diff --git a/server/examples-gg-latest.js b/server/scripts/examples-gg-latest.js similarity index 99% rename from server/examples-gg-latest.js rename to server/scripts/examples-gg-latest.js index f2fa5ff2..513e87ff 100644 --- a/server/examples-gg-latest.js +++ b/server/scripts/examples-gg-latest.js @@ -5,8 +5,8 @@ import objectID from 'bson-objectid'; import shortid from 'shortid'; import eachSeries from 'async/eachSeries'; -import User from './models/user'; -import Project from './models/project'; +import User from '../models/user'; +import Project from '../models/project'; // TODO: change to true when testing! const testMake = false; diff --git a/server/examples.js b/server/scripts/examples.js similarity index 99% rename from server/examples.js rename to server/scripts/examples.js index bdf54c1d..c1cccc60 100644 --- a/server/examples.js +++ b/server/scripts/examples.js @@ -4,8 +4,8 @@ import mongoose from 'mongoose'; import objectID from 'bson-objectid'; import shortid from 'shortid'; import eachSeries from 'async/eachSeries'; -import User from './models/user'; -import Project from './models/project'; +import User from '../models/user'; +import Project from '../models/project'; const defaultHTML = ` diff --git a/fetch-examples-gg.js b/server/scripts/fetch-examples-gg.js similarity index 65% rename from fetch-examples-gg.js rename to server/scripts/fetch-examples-gg.js index fc354c2c..73fcc26b 100644 --- a/fetch-examples-gg.js +++ b/server/scripts/fetch-examples-gg.js @@ -1,4 +1,4 @@ require('babel-register'); require('babel-polyfill'); require('dotenv').config(); -require('./server/examples-gg-latest.js'); +require('./examples-gg-latest.js'); diff --git a/fetch-examples.js b/server/scripts/fetch-examples.js similarity index 71% rename from fetch-examples.js rename to server/scripts/fetch-examples.js index aecc226a..c46eeb54 100644 --- a/fetch-examples.js +++ b/server/scripts/fetch-examples.js @@ -1,4 +1,4 @@ require('babel-register'); require('babel-polyfill'); require('dotenv').config(); -require('./server/examples.js'); +require('./examples.js'); From c10ae6131625f56f7e082556f4269913ae9dbc1d Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 17 May 2018 18:43:06 -0700 Subject: [PATCH 12/75] start production docker configuration --- Dockerfile => Dockerfile-development | 0 README.md | 10 +++++----- docker-compose-development.yml | 28 ++++++++++++++++++++++++++++ docker-compose.yml | 6 +++++- nginx/Dockerfile | 3 +++ nginx.conf => nginx/nginx.conf | 0 6 files changed, 41 insertions(+), 6 deletions(-) rename Dockerfile => Dockerfile-development (100%) create mode 100644 docker-compose-development.yml create mode 100644 nginx/Dockerfile rename nginx.conf => nginx/nginx.conf (100%) diff --git a/Dockerfile b/Dockerfile-development similarity index 100% rename from Dockerfile rename to Dockerfile-development diff --git a/README.md b/README.md index 44e8ebdf..ca6f472b 100644 --- a/README.md +++ b/README.md @@ -53,21 +53,21 @@ Note that this takes up a significant amount of space on your machine. Make sure * Mac: https://www.docker.com/docker-mac * Windows: https://www.docker.com/docker-windows 2. Clone this repository and cd into it -3. `$ docker-compose build` -4. `$ docker-compose run --rm server npm run fetch-examples` +3. `$ docker-compose -f docker-compose-development.yml build` +4. `$ docker-compose -f docker-compose-development.yml run --rm server npm run fetch-examples` Now, anytime you wish to start the server with its dependencies, you can run: -5. `$ docker-compose up` +5. `$ docker-compose -f docker-compose-development.yml up` 6. Navigate to [http://localhost:8000](http://localhost:8000) in your browser To open a terminal/shell in the running Docker server (i.e. after `docker-compose up` has been run): -7. `$ docker-compose exec server bash -l` +7. `$ docker-compose -f docker-compose-development.yml exec server bash -l` If you don't have the full server environment running, you can launch a one-off container instance (and have it automatically deleted after you're done using it): -8. `$ docker-compose run server --rm bash -l` +8. `$ docker-compose -f docker-compose-development.yml run server --rm bash -l` ## Production Installation 1. Clone this repository and `cd` into it diff --git a/docker-compose-development.yml b/docker-compose-development.yml new file mode 100644 index 00000000..9b97dd33 --- /dev/null +++ b/docker-compose-development.yml @@ -0,0 +1,28 @@ +version: '2' +services: + mongo: + image: mongo:3.4.7 + server: + build: + context: . + dockerfile: Dockerfile-development + command: npm start + environment: + - API_URL=/api + - MONGO_URL=mongodb://mongo:27017/p5js-web-editor + - PORT=8000 + - SESSION_SECRET=override_in_dotenv + - AWS_ACCESS_KEY=override_in_dotenv + - AWS_SECRET_KEY=override_in_dotenv + - AWS_REGION=override_in_dotenv + - S3_BUCKET=override_in_dotenv + - GITHUB_ID=override_in_dotenv + - GITHUB_SECRET=override_in_dotenv + - MAILGUN_KEY=override_in_dotenv + volumes: + - .:/opt/node/app + - /opt/node/app/node_modules + ports: + - '8000:8000' + depends_on: + - mongo diff --git a/docker-compose.yml b/docker-compose.yml index 7f6c97bf..c324527d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,8 +2,12 @@ version: '2' services: mongo: image: mongo:3.4.7 + nginx: + build: ./nginx server: - build: . + build: + context: . + dockerfile: Dockerfile-development command: npm start environment: - API_URL=/api diff --git a/nginx/Dockerfile b/nginx/Dockerfile new file mode 100644 index 00000000..4c45e83b --- /dev/null +++ b/nginx/Dockerfile @@ -0,0 +1,3 @@ +FROM nginx:1.13.12 + +COPY nginx.conf /etc/nginx/nginx.conf \ No newline at end of file diff --git a/nginx.conf b/nginx/nginx.conf similarity index 100% rename from nginx.conf rename to nginx/nginx.conf From 2f84fe12a60e43b2cf205feede96e9642983fde8 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 4 Jun 2018 15:34:40 -0700 Subject: [PATCH 13/75] more changes to get dockerization working --- docker-compose-development.yml | 2 +- docker-compose.yml | 4 +- ecosystem.json | 2 +- nginx/Dockerfile | 4 +- nginx/alpha.editor.p5js.org.conf | 61 ++++++++++++++++ nginx/nginx-aws.conf | 122 +++++++++++++++++++++++++++++++ nginx/nginx.conf | 61 ---------------- 7 files changed, 191 insertions(+), 65 deletions(-) create mode 100644 nginx/alpha.editor.p5js.org.conf create mode 100644 nginx/nginx-aws.conf diff --git a/docker-compose-development.yml b/docker-compose-development.yml index 9b97dd33..33d98f76 100644 --- a/docker-compose-development.yml +++ b/docker-compose-development.yml @@ -1,4 +1,4 @@ -version: '2' +version: '3' services: mongo: image: mongo:3.4.7 diff --git a/docker-compose.yml b/docker-compose.yml index c324527d..a5d58f68 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,9 @@ -version: '2' +version: '3' services: mongo: image: mongo:3.4.7 + expose: + - "27017" nginx: build: ./nginx server: diff --git a/ecosystem.json b/ecosystem.json index 5f56d91f..edcd6311 100644 --- a/ecosystem.json +++ b/ecosystem.json @@ -4,6 +4,6 @@ "env": { "NODE_ENV": "production" }, - "instances" : 2, + "instances" : "max", "exec_mode" : "cluster" } \ No newline at end of file diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 4c45e83b..9372b789 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,3 +1,5 @@ FROM nginx:1.13.12 -COPY nginx.conf /etc/nginx/nginx.conf \ No newline at end of file +COPY nginx.conf /etc/nginx/nginx.conf +RUN mkdir /etc/nginx/sites-enabled +COPY alpha.editor.p5js.org.conf /etc/nginx/sites-enabled \ No newline at end of file diff --git a/nginx/alpha.editor.p5js.org.conf b/nginx/alpha.editor.p5js.org.conf new file mode 100644 index 00000000..ec704743 --- /dev/null +++ b/nginx/alpha.editor.p5js.org.conf @@ -0,0 +1,61 @@ + # HTTP - redirect all requests to HTTPS: + server { + listen 80; + server_name alpha.editor.p5js.org; + location / { + proxy_pass http://127.0.0.1:8000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + location ~* \/login(\/)* { + return 301 https://$host$request_uri; + } + location ~* \/signup(\/)* { + return 301 https://$host$request_uri; + } + location ~* \/reset-password(\/)* { + return 301 https://$host$request_uri; + } + location ~* "\/[a-zA-Z0-9._-]{1,20}\/account(\/)*" { + return 301 https://$host$request_uri; + } + +} + +server { + listen 443; + ssl on; + ssl_certificate /etc/letsencrypt/live/alpha.editor.p5js.org/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/alpha.editor.p5js.org/privkey.pem; + server_name alpha.editor.p5js.org; + location / { + proxy_pass http://127.0.0.1:8000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } +} + +server { + listen 80; + server_name editor.p5js.org; + location ~ ^/(.*) { + return 302 http://alpha.editor.p5js.org/$1; + } +} + +server { + listen 443; + ssl on; + ssl_certificate /etc/letsencrypt/live/editor.p5js.org/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/editor.p5js.org/privkey.pem; + server_name editor.p5js.org; + location ~ ^/(.*) { + return 302 https://alpha.editor.p5js.org/$1; + } +} \ No newline at end of file diff --git a/nginx/nginx-aws.conf b/nginx/nginx-aws.conf new file mode 100644 index 00000000..b0ab9feb --- /dev/null +++ b/nginx/nginx-aws.conf @@ -0,0 +1,122 @@ +# For more information on configuration, see: +# * Official English Documentation: http://nginx.org/en/docs/ +# * Official Russian Documentation: http://nginx.org/ru/docs/ + +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Load modular configuration files from the /etc/nginx/conf.d directory. + # See http://nginx.org/en/docs/ngx_core_module.html#include + # for more information. + include /etc/nginx/conf.d/*.conf; + + include /etc/nginx/sites-enabled/*.conf; + + index index.html index.htm; + + server { + listen 80 default_server; + listen [::]:80 default_server; + server_name localhost; + root /usr/share/nginx/html; + + # Load configuration files for the default server block. + include /etc/nginx/default.d/*.conf; + + location / { + } + + # redirect server error pages to the static page /40x.html + # + error_page 404 /404.html; + location = /40x.html { + } + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + +# Settings for a TLS enabled server. +# +# server { +# listen 443 ssl; +# listen [::]:443 ssl; +# server_name localhost; +# root /usr/share/nginx/html; +# +# ssl_certificate "/etc/pki/nginx/server.crt"; +# ssl_certificate_key "/etc/pki/nginx/private/server.key"; +# # It is *strongly* recommended to generate unique DH parameters +# # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 +# #ssl_dhparam "/etc/pki/nginx/dhparams.pem"; +# ssl_session_cache shared:SSL:1m; +# ssl_session_timeout 10m; +# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; +# ssl_ciphers HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP; +# ssl_prefer_server_ciphers on; +# +# # Load configuration files for the default server block. +# include /etc/nginx/default.d/*.conf; +# +# location / { +# } +# +# error_page 404 /404.html; +# location = /40x.html { +# } +# +# error_page 500 502 503 504 /50x.html; +# location = /50x.html { +# } +# } + +} \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf index ec704743..e69de29b 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -1,61 +0,0 @@ - # HTTP - redirect all requests to HTTPS: - server { - listen 80; - server_name alpha.editor.p5js.org; - location / { - proxy_pass http://127.0.0.1:8000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } - location ~* \/login(\/)* { - return 301 https://$host$request_uri; - } - location ~* \/signup(\/)* { - return 301 https://$host$request_uri; - } - location ~* \/reset-password(\/)* { - return 301 https://$host$request_uri; - } - location ~* "\/[a-zA-Z0-9._-]{1,20}\/account(\/)*" { - return 301 https://$host$request_uri; - } - -} - -server { - listen 443; - ssl on; - ssl_certificate /etc/letsencrypt/live/alpha.editor.p5js.org/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/alpha.editor.p5js.org/privkey.pem; - server_name alpha.editor.p5js.org; - location / { - proxy_pass http://127.0.0.1:8000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } -} - -server { - listen 80; - server_name editor.p5js.org; - location ~ ^/(.*) { - return 302 http://alpha.editor.p5js.org/$1; - } -} - -server { - listen 443; - ssl on; - ssl_certificate /etc/letsencrypt/live/editor.p5js.org/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/editor.p5js.org/privkey.pem; - server_name editor.p5js.org; - location ~ ^/(.*) { - return 302 https://alpha.editor.p5js.org/$1; - } -} \ No newline at end of file From 0857a52326bcafa26eca13570f66446c90487342 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 7 Jun 2018 13:09:51 -0700 Subject: [PATCH 14/75] update .env.example and README, start to build out Docker development and prodiction setup --- .env.example | 11 ++- Dockerfile | 31 ++++++++ README.md | 75 +++++-------------- docker-compose-development.yml | 16 ++-- docker-compose.yml | 10 ++- nginx/alpha.editor.p5js.org.conf | 50 ++++++------- nginx/nginx.conf | 122 +++++++++++++++++++++++++++++++ 7 files changed, 222 insertions(+), 93 deletions(-) create mode 100644 Dockerfile diff --git a/.env.example b/.env.example index ee948df6..3bfd7e50 100644 --- a/.env.example +++ b/.env.example @@ -10,6 +10,13 @@ GITHUB_ID= GITHUB_SECRET= GOOGLE_ID= (use google+ api) GOOGLE_SECRET= (use google+ api) +MAILGUN_DOMAIN= MAILGUN_KEY= -EXAMPLE_USER_EMAIL= -EXAMPLE_USER_PASSWORD= \ No newline at end of file +EMAIL_SENDER= +EMAIL_VERIFY_SECRET_TOKEN=whatever_you_want_this_to_be_it_only_matters_for_production +S3_BUCKET_URL_BASE= +EXAMPLE_USER_EMAIL=examples@p5js.org +EXAMPLE_USER_PASSWORD=hellop5js +GG_EXAMPLES_USERNAME=generative-design +GG_EXAMPLES_PASS=generativedesign +GG_EXAMPLES_EMAIL=benedikt.gross@generative-gestaltung.de diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..788b9be1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,31 @@ +FROM node:8.11.1 as base +ENV APP_HOME=/usr/src/app \ + TERM=xterm +RUN mkdir -p $APP_HOME +WORKDIR $APP_HOME +EXPOSE 8000 + +FROM base as development +ENV NODE_ENV development +COPY package.json package-lock.json ./ +RUN npm install +RUN npm rebuild node-sass +COPY .babelrc index.js nodemon.json webpack.config.babel.js webpack.config.dev.js webpack.config.prod.js webpack.config.server.js ./ +COPY client ./client +COPY server ./server +CMD ["npm", "start"] + +FROM development as build +ENV NODE_ENV production +RUN npm run build + +FROM base as production +ENV NODE_ENV=production +COPY package.json package-lock.json ./ +RUN npm install --production +RUN npm rebuild node-sass +RUN npm install pm2 -g +COPY index.js ./ +COPY ecosystem.json ./ +COPY --from=build /usr/src/app/dist ./dist +CMD ["pm2-runtime", "ecosystem.json"] diff --git a/README.md b/README.md index ca6f472b..9ab0fcc1 100644 --- a/README.md +++ b/README.md @@ -10,33 +10,13 @@ This project is currently in development! It will be announced when there is a ( 4. Install MongoDB and make sure it is running * For Mac OSX with [homebrew](http://brew.sh/): `brew install mongodb` then `brew services start mongodb` * For Windows and Linux: [MongoDB Installation](https://docs.mongodb.com/manual/installation/) -5. Create a file called `.env` in the root of this directory that looks like - - ``` - API_URL=/api - MONGO_URL=mongodb://localhost:27017/p5js-web-editor - PORT=8000 - SESSION_SECRET=whatever_you_want_this_to_be_it_only_matters_for_production - AWS_ACCESS_KEY= - AWS_SECRET_KEY= - AWS_REGION= - S3_BUCKET= - GITHUB_ID= - GITHUB_SECRET= - GOOGLE_ID= (use google+ api) - GOOGLE_SECRET= (use google+ api) - MAILGUN_KEY= - EXAMPLE_USER_EMAIL= - EXAMPLE_USER_PASSWORD= - ``` - - If you don't care about being able to upload media files to S3 or Login with Github or Google, you can drop in the file exactly how it is. Or, if you don't want to do that, just ask me to send you mine. Refer to [this gist](https://gist.github.com/catarak/70c9301f0fd1ac2d6b58de03f61997e3) for creating an S3 bucket for testing, or if you don't want to do that, I can add you to one of my S3 buckets. - -6. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' -7. `$ npm start` -8. Navigate to [http://localhost:8000](http://localhost:8000) in your browser -9. Install the [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en). -10. Open and close the Redux DevTools using `ctrl+h`, and move them with `ctrl+w` +5. `$ cp .env.example .env` +6. (Optional) Update `.env` with necessary keys to enable certain app behavoirs, i.e. add Github ID and Github Secret if you want to be able to log in with Github. +7. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' +8. `$ npm start` +9. Navigate to [http://localhost:8000](http://localhost:8000) in your browser +10. Install the [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en) +11. Open and close the Redux DevTools using `ctrl+h`, and move them with `ctrl+w` ### Testing SSL on your local machine Please refer to [this gist](https://gist.github.com/andrewn/953ffd5cb17ac2634dc969fc7bdaff3f). This allows you to access the editor using both HTTP and HTTPS. Don't worry about this unless you need to make changes or test HTTPS behavior. @@ -73,51 +53,32 @@ If you don't have the full server environment running, you can launch a one-off 1. Clone this repository and `cd` into it 2. `$ npm install` 3. Install MongoDB and make sure it is running -4. Create a file called `.env` in the root of this directory that looks like - - ``` - API_URL=/api - MONGO_URL=mongodb://localhost:27017/p5js-web-editor - PORT=8000 - SESSION_SECRET=make_this_a_long-random_string_like_maybe_126_characters_long - AWS_ACCESS_KEY= - AWS_SECRET_KEY= - AWS_REGION= - S3_BUCKET= - GITHUB_ID= - GITHUB_SECRET= - GOOGLE_ID= (use google+ api) - GOOGLE_SECRET= (use google+ api) - EMAIL_SENDER= - MAILGUN_KEY= - MAILGUN_DOMAIN= - EMAIL_VERIFY_SECRET_TOKEN=whatever_you_want_this_to_be_it_only_matters_for_production - EXAMPLE_USER_EMAIL= - EXAMPLE_USER_PASSWORD= - ``` - For production, you will need to have real Github and Amazon credentials. Refer to [this gist](https://gist.github.com/catarak/70c9301f0fd1ac2d6b58de03f61997e3) for creating an S3 bucket for testing. - -5. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' -6. `$ npm run build` -7. `$ npm run start:prod` +4. `$ cp .env.example .env` +5. (NOT Optional) edit `.env` and fill in all necessart values. +6. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' +7. `$ npm run build` +8. `$ npm run start:prod` ### For Production Setup with PM2 1. `$ npm install -g pm2` 2. `$ pm2 start ecosystem.json` -## Optional S3 bucket URL base configuration +## S3 Bucket Configuration + +Please refer to the folllowing [gist](https://gist.github.com/catarak/70c9301f0fd1ac2d6b58de03f61997e3) to set up an S3 bucket to be used with this project. + If your S3 bucket is in the US East (N Virginia) region (us-east-1), you'll need to set a custom URL base for it, because it does not follow the standard naming pattern as the rest of the regions. Instead, add the following to your environment/.env file: -```S3_BUCKET_URL_BASE=https://s3.amazonaws.com``` +`S3_BUCKET_URL_BASE=https://s3.amazonaws.com` If you've configured your S3 bucket and DNS records to use a custom domain name, you can also set it using this variable. I.e.: -```S3_BUCKET_URL_BASE=https://files.mydomain.com``` +`S3_BUCKET_URL_BASE=https://files.mydomain.com` For more information on using a custom domain, see this documentation link: diff --git a/docker-compose-development.yml b/docker-compose-development.yml index 33d98f76..c0fbfdb6 100644 --- a/docker-compose-development.yml +++ b/docker-compose-development.yml @@ -1,12 +1,14 @@ -version: '3' +version: '3.4' services: mongo: image: mongo:3.4.7 + volumes: + - dbdata:/data/db server: build: - context: . - dockerfile: Dockerfile-development - command: npm start + context: ./ + dockerfile: Dockerfile + target: development environment: - API_URL=/api - MONGO_URL=mongodb://mongo:27017/p5js-web-editor @@ -20,9 +22,11 @@ services: - GITHUB_SECRET=override_in_dotenv - MAILGUN_KEY=override_in_dotenv volumes: - - .:/opt/node/app - - /opt/node/app/node_modules + - .:/usr/src/app + - /usr/src/app/node_modules ports: - '8000:8000' depends_on: - mongo +volumes: + dbdata: diff --git a/docker-compose.yml b/docker-compose.yml index a5d58f68..306c0694 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,9 @@ -version: '3' +version: '3.4' services: mongo: image: mongo:3.4.7 + volumes: + - dbdata:/data/db expose: - "27017" nginx: @@ -9,8 +11,8 @@ services: server: build: context: . - dockerfile: Dockerfile-development - command: npm start + dockerfile: Dockerfile + target: production environment: - API_URL=/api - MONGO_URL=mongodb://mongo:27017/p5js-web-editor @@ -30,3 +32,5 @@ services: - '8000:8000' depends_on: - mongo +volumes: + dbdata: diff --git a/nginx/alpha.editor.p5js.org.conf b/nginx/alpha.editor.p5js.org.conf index ec704743..f89e51bd 100644 --- a/nginx/alpha.editor.p5js.org.conf +++ b/nginx/alpha.editor.p5js.org.conf @@ -25,21 +25,21 @@ } -server { - listen 443; - ssl on; - ssl_certificate /etc/letsencrypt/live/alpha.editor.p5js.org/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/alpha.editor.p5js.org/privkey.pem; - server_name alpha.editor.p5js.org; - location / { - proxy_pass http://127.0.0.1:8000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } -} +# server { +# listen 443; +# ssl on; +# ssl_certificate /etc/letsencrypt/live/alpha.editor.p5js.org/fullchain.pem; +# ssl_certificate_key /etc/letsencrypt/live/alpha.editor.p5js.org/privkey.pem; +# server_name alpha.editor.p5js.org; +# location / { +# proxy_pass http://127.0.0.1:8000; +# proxy_http_version 1.1; +# proxy_set_header Upgrade $http_upgrade; +# proxy_set_header Connection 'upgrade'; +# proxy_set_header Host $host; +# proxy_cache_bypass $http_upgrade; +# } +# } server { listen 80; @@ -49,13 +49,13 @@ server { } } -server { - listen 443; - ssl on; - ssl_certificate /etc/letsencrypt/live/editor.p5js.org/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/editor.p5js.org/privkey.pem; - server_name editor.p5js.org; - location ~ ^/(.*) { - return 302 https://alpha.editor.p5js.org/$1; - } -} \ No newline at end of file +# server { +# listen 443; +# ssl on; +# ssl_certificate /etc/letsencrypt/live/editor.p5js.org/fullchain.pem; +# ssl_certificate_key /etc/letsencrypt/live/editor.p5js.org/privkey.pem; +# server_name editor.p5js.org; +# location ~ ^/(.*) { +# return 302 https://alpha.editor.p5js.org/$1; +# } +# } \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf index e69de29b..b0ab9feb 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -0,0 +1,122 @@ +# For more information on configuration, see: +# * Official English Documentation: http://nginx.org/en/docs/ +# * Official Russian Documentation: http://nginx.org/ru/docs/ + +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Load modular configuration files from the /etc/nginx/conf.d directory. + # See http://nginx.org/en/docs/ngx_core_module.html#include + # for more information. + include /etc/nginx/conf.d/*.conf; + + include /etc/nginx/sites-enabled/*.conf; + + index index.html index.htm; + + server { + listen 80 default_server; + listen [::]:80 default_server; + server_name localhost; + root /usr/share/nginx/html; + + # Load configuration files for the default server block. + include /etc/nginx/default.d/*.conf; + + location / { + } + + # redirect server error pages to the static page /40x.html + # + error_page 404 /404.html; + location = /40x.html { + } + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + +# Settings for a TLS enabled server. +# +# server { +# listen 443 ssl; +# listen [::]:443 ssl; +# server_name localhost; +# root /usr/share/nginx/html; +# +# ssl_certificate "/etc/pki/nginx/server.crt"; +# ssl_certificate_key "/etc/pki/nginx/private/server.key"; +# # It is *strongly* recommended to generate unique DH parameters +# # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 +# #ssl_dhparam "/etc/pki/nginx/dhparams.pem"; +# ssl_session_cache shared:SSL:1m; +# ssl_session_timeout 10m; +# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; +# ssl_ciphers HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP; +# ssl_prefer_server_ciphers on; +# +# # Load configuration files for the default server block. +# include /etc/nginx/default.d/*.conf; +# +# location / { +# } +# +# error_page 404 /404.html; +# location = /40x.html { +# } +# +# error_page 500 502 503 504 /50x.html; +# location = /50x.html { +# } +# } + +} \ No newline at end of file From 6dd92a15731091419bcc182c7ea7944a6ce43f9a Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 7 Jun 2018 14:49:17 -0700 Subject: [PATCH 15/75] start to handle environment variables --- Dockerfile | 4 ++-- index.js | 8 +++++++- nginx/Dockerfile | 2 +- webpack.config.prod.js | 6 +++++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 788b9be1..82c31e64 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,7 @@ CMD ["npm", "start"] FROM development as build ENV NODE_ENV production +COPY .env ./ RUN npm run build FROM base as production @@ -25,7 +26,6 @@ COPY package.json package-lock.json ./ RUN npm install --production RUN npm rebuild node-sass RUN npm install pm2 -g -COPY index.js ./ -COPY ecosystem.json ./ +COPY index.js ecosystem.json .env ./ COPY --from=build /usr/src/app/dist ./dist CMD ["pm2-runtime", "ecosystem.json"] diff --git a/index.js b/index.js index f99dabf7..289a8997 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,15 @@ -let parsed = require('dotenv').config(); +// let parsed = require('dotenv').config(); if (process.env.NODE_ENV === 'production') { + try { + require('dotenv').config(); + } catch(error) { + console.log('.env file does not exist. Assuming environment variables are pre-loaded.'); + } process.env.webpackAssets = JSON.stringify(require('./dist/static/manifest.json')); process.env.webpackChunkAssets = JSON.stringify(require('./dist/static/chunk-manifest.json')); require('./dist/server.bundle.js'); } else { + let parsed = require('dotenv').config(); require('babel-register')({ "plugins": [ [ diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 9372b789..49d6b29a 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,5 +1,5 @@ FROM nginx:1.13.12 +RUN mkdir -p /etc/nginx/sites-enabled COPY nginx.conf /etc/nginx/nginx.conf -RUN mkdir /etc/nginx/sites-enabled COPY alpha.editor.p5js.org.conf /etc/nginx/sites-enabled \ No newline at end of file diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 1a59fd96..64bae5ff 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -6,7 +6,11 @@ const cssnext = require('postcss-cssnext'); const postcssFocus = require('postcss-focus'); const postcssReporter = require('postcss-reporter'); const cssnano = require('cssnano'); -require('dotenv').config(); +try { + require('dotenv').config(); +} catch (error) { + console.log('.env file does not exist. Assuming environment variables are pre-loaded.'); +} module.exports = { devtool: 'source-map', From 131e853503678cd3aa18546ac79d3522df8ded31 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 8 Jun 2018 10:41:33 -0700 Subject: [PATCH 16/75] change Dockerfile to fix environment variables and fetching examples --- Dockerfile | 7 +++++-- docker-compose-development.yml | 10 ---------- docker-compose.yml | 12 ++---------- index.js | 6 ------ package.json | 4 ++-- backup.sh => scripts/backup.sh | 0 {server/scripts => scripts}/examples-gg-latest.js | 0 {server/scripts => scripts}/examples.js | 0 {server/scripts => scripts}/fetch-examples-gg.js | 4 +++- {server/scripts => scripts}/fetch-examples.js | 4 +++- webpack.config.prod.js | 4 +--- 11 files changed, 16 insertions(+), 35 deletions(-) rename backup.sh => scripts/backup.sh (100%) rename {server/scripts => scripts}/examples-gg-latest.js (100%) rename {server/scripts => scripts}/examples.js (100%) rename {server/scripts => scripts}/fetch-examples-gg.js (53%) rename {server/scripts => scripts}/fetch-examples.js (50%) diff --git a/Dockerfile b/Dockerfile index 82c31e64..b47c384f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,11 +13,12 @@ RUN npm rebuild node-sass COPY .babelrc index.js nodemon.json webpack.config.babel.js webpack.config.dev.js webpack.config.prod.js webpack.config.server.js ./ COPY client ./client COPY server ./server +COPY scripts ./scripts CMD ["npm", "start"] FROM development as build ENV NODE_ENV production -COPY .env ./ +# COPY .env ./ RUN npm run build FROM base as production @@ -26,6 +27,8 @@ COPY package.json package-lock.json ./ RUN npm install --production RUN npm rebuild node-sass RUN npm install pm2 -g -COPY index.js ecosystem.json .env ./ +COPY index.js ecosystem.json .babelrc ./ +COPY scripts ./scripts +# COPY .env ./ COPY --from=build /usr/src/app/dist ./dist CMD ["pm2-runtime", "ecosystem.json"] diff --git a/docker-compose-development.yml b/docker-compose-development.yml index c0fbfdb6..e07f2ebf 100644 --- a/docker-compose-development.yml +++ b/docker-compose-development.yml @@ -10,17 +10,7 @@ services: dockerfile: Dockerfile target: development environment: - - API_URL=/api - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - - PORT=8000 - - SESSION_SECRET=override_in_dotenv - - AWS_ACCESS_KEY=override_in_dotenv - - AWS_SECRET_KEY=override_in_dotenv - - AWS_REGION=override_in_dotenv - - S3_BUCKET=override_in_dotenv - - GITHUB_ID=override_in_dotenv - - GITHUB_SECRET=override_in_dotenv - - MAILGUN_KEY=override_in_dotenv volumes: - .:/usr/src/app - /usr/src/app/node_modules diff --git a/docker-compose.yml b/docker-compose.yml index 306c0694..f7c2a490 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,18 +13,10 @@ services: context: . dockerfile: Dockerfile target: production + env_file: + - .env environment: - - API_URL=/api - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - - PORT=8000 - - SESSION_SECRET=override_in_dotenv - - AWS_ACCESS_KEY=override_in_dotenv - - AWS_SECRET_KEY=override_in_dotenv - - AWS_REGION=override_in_dotenv - - S3_BUCKET=override_in_dotenv - - GITHUB_ID=override_in_dotenv - - GITHUB_SECRET=override_in_dotenv - - MAILGUN_KEY=override_in_dotenv volumes: - .:/opt/node/app - /opt/node/app/node_modules diff --git a/index.js b/index.js index 289a8997..b65d1733 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,4 @@ -// let parsed = require('dotenv').config(); if (process.env.NODE_ENV === 'production') { - try { - require('dotenv').config(); - } catch(error) { - console.log('.env file does not exist. Assuming environment variables are pre-loaded.'); - } process.env.webpackAssets = JSON.stringify(require('./dist/static/manifest.json')); process.env.webpackChunkAssets = JSON.stringify(require('./dist/static/chunk-manifest.json')); require('./dist/server.bundle.js'); diff --git a/package.json b/package.json index a0b8bc59..e76f9646 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js --progress", "test": "npm run lint", - "fetch-examples": "node server/scripts/fetch-examples.js", - "fetch-examples-gg": "node server/scripts/fetch-examples-gg.js" + "fetch-examples": "node scripts/fetch-examples.js", + "fetch-examples-gg": "node scripts/fetch-examples-gg.js" }, "main": "index.js", "author": "Cassie Tarakajian", diff --git a/backup.sh b/scripts/backup.sh similarity index 100% rename from backup.sh rename to scripts/backup.sh diff --git a/server/scripts/examples-gg-latest.js b/scripts/examples-gg-latest.js similarity index 100% rename from server/scripts/examples-gg-latest.js rename to scripts/examples-gg-latest.js diff --git a/server/scripts/examples.js b/scripts/examples.js similarity index 100% rename from server/scripts/examples.js rename to scripts/examples.js diff --git a/server/scripts/fetch-examples-gg.js b/scripts/fetch-examples-gg.js similarity index 53% rename from server/scripts/fetch-examples-gg.js rename to scripts/fetch-examples-gg.js index 73fcc26b..647618d9 100644 --- a/server/scripts/fetch-examples-gg.js +++ b/scripts/fetch-examples-gg.js @@ -1,4 +1,6 @@ require('babel-register'); require('babel-polyfill'); -require('dotenv').config(); +if (process.env.NODE_ENV !== "production") { + require('dotenv').config(); +} require('./examples-gg-latest.js'); diff --git a/server/scripts/fetch-examples.js b/scripts/fetch-examples.js similarity index 50% rename from server/scripts/fetch-examples.js rename to scripts/fetch-examples.js index c46eeb54..d4037179 100644 --- a/server/scripts/fetch-examples.js +++ b/scripts/fetch-examples.js @@ -1,4 +1,6 @@ require('babel-register'); require('babel-polyfill'); -require('dotenv').config(); +if (process.env.NODE_ENV !== "production") { + require('dotenv').config(); +} require('./examples.js'); diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 64bae5ff..7170b9c0 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -6,10 +6,8 @@ const cssnext = require('postcss-cssnext'); const postcssFocus = require('postcss-focus'); const postcssReporter = require('postcss-reporter'); const cssnano = require('cssnano'); -try { +if (process.env.NODE_ENV !== "production") { require('dotenv').config(); -} catch (error) { - console.log('.env file does not exist. Assuming environment variables are pre-loaded.'); } module.exports = { From a14c232935153e7b358979946c9092c2f94007e9 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 13 Jun 2018 17:40:46 -0700 Subject: [PATCH 17/75] fix fetch example scripts, add webpack config to build fetch script bundles --- scripts/backup.sh => backup.sh | 0 package.json | 4 +- .../scripts}/examples-gg-latest.js | 0 {scripts => server/scripts}/examples.js | 0 .../scripts}/fetch-examples-gg.js | 0 {scripts => server/scripts}/fetch-examples.js | 0 webpack.config.examples.js | 93 +++++++++++++++++++ 7 files changed, 95 insertions(+), 2 deletions(-) rename scripts/backup.sh => backup.sh (100%) rename {scripts => server/scripts}/examples-gg-latest.js (100%) rename {scripts => server/scripts}/examples.js (100%) rename {scripts => server/scripts}/fetch-examples-gg.js (100%) rename {scripts => server/scripts}/fetch-examples.js (100%) create mode 100644 webpack.config.examples.js diff --git a/scripts/backup.sh b/backup.sh similarity index 100% rename from scripts/backup.sh rename to backup.sh diff --git a/package.json b/package.json index e76f9646..6edafcd9 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js --progress", "test": "npm run lint", - "fetch-examples": "node scripts/fetch-examples.js", - "fetch-examples-gg": "node scripts/fetch-examples-gg.js" + "fetch-examples": "node ./server/scripts/fetch-examples.js", + "fetch-examples-gg": "node ./server/scripts/fetch-examples-gg.js" }, "main": "index.js", "author": "Cassie Tarakajian", diff --git a/scripts/examples-gg-latest.js b/server/scripts/examples-gg-latest.js similarity index 100% rename from scripts/examples-gg-latest.js rename to server/scripts/examples-gg-latest.js diff --git a/scripts/examples.js b/server/scripts/examples.js similarity index 100% rename from scripts/examples.js rename to server/scripts/examples.js diff --git a/scripts/fetch-examples-gg.js b/server/scripts/fetch-examples-gg.js similarity index 100% rename from scripts/fetch-examples-gg.js rename to server/scripts/fetch-examples-gg.js diff --git a/scripts/fetch-examples.js b/server/scripts/fetch-examples.js similarity index 100% rename from scripts/fetch-examples.js rename to server/scripts/fetch-examples.js diff --git a/webpack.config.examples.js b/webpack.config.examples.js new file mode 100644 index 00000000..a2e08e7e --- /dev/null +++ b/webpack.config.examples.js @@ -0,0 +1,93 @@ +const path = require('path'); +const nodeExternals = require('webpack-node-externals'); + +module.exports = [{ + entry: path.resolve(__dirname, 'server/scripts/fetch-examples.js'), + + output: { + path: __dirname + '/dist/', + filename: 'fetch-examples.bundle.js' + }, + + target: 'node', + + externals: [nodeExternals()], + + resolve: { + extensions: ['*', '.js', '.jsx'], + modules: [ + 'client', + 'node_modules', + ], + }, + + module: { + loaders: [ + { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader', + query: { + presets: [ + 'react', + 'env', + 'stage-0', + ], + plugins: [ + [ + 'babel-plugin-webpack-loaders', { + 'config': './webpack.config.babel.js', + "verbose": false + } + ] + ] + }, + } + ], + }, +}, +{ + entry: path.resolve(__dirname, 'server/scripts/fetch-examples-gg.js'), + + output: { + path: __dirname + '/dist/', + filename: 'fetch-examples-gg.bundle.js' + }, + + target: 'node', + + externals: [nodeExternals()], + + resolve: { + extensions: ['*', '.js', '.jsx'], + modules: [ + 'client', + 'node_modules', + ], + }, + + module: { + loaders: [ + { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader', + query: { + presets: [ + 'react', + 'env', + 'stage-0', + ], + plugins: [ + [ + 'babel-plugin-webpack-loaders', { + 'config': './webpack.config.babel.js', + "verbose": false + } + ] + ] + }, + } + ], + }, +}]; \ No newline at end of file From b172087b987be7d28af0121be84fbb2d51219e31 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 15 Jun 2018 13:51:42 -0700 Subject: [PATCH 18/75] get local-ssl-proxy working for testing prod locally --- Dockerfile | 13 +++++++------ docker-compose.yml | 8 ++++++-- package.json | 8 ++++++-- server/scripts/fetch-examples-gg.js | 2 +- server/scripts/fetch-examples.js | 2 +- webpack.config.dev.js | 4 +++- webpack.config.prod.js | 2 +- 7 files changed, 25 insertions(+), 14 deletions(-) diff --git a/Dockerfile b/Dockerfile index b47c384f..05076099 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,21 +4,21 @@ ENV APP_HOME=/usr/src/app \ RUN mkdir -p $APP_HOME WORKDIR $APP_HOME EXPOSE 8000 +EXPOSE 80 +EXPOSE 443 FROM base as development ENV NODE_ENV development COPY package.json package-lock.json ./ RUN npm install RUN npm rebuild node-sass -COPY .babelrc index.js nodemon.json webpack.config.babel.js webpack.config.dev.js webpack.config.prod.js webpack.config.server.js ./ +COPY .babelrc index.js nodemon.json webpack.config.babel.js webpack.config.dev.js webpack.config.prod.js webpack.config.server.js webpack.config.examples.js ./ COPY client ./client COPY server ./server -COPY scripts ./scripts CMD ["npm", "start"] FROM development as build ENV NODE_ENV production -# COPY .env ./ RUN npm run build FROM base as production @@ -27,8 +27,9 @@ COPY package.json package-lock.json ./ RUN npm install --production RUN npm rebuild node-sass RUN npm install pm2 -g -COPY index.js ecosystem.json .babelrc ./ -COPY scripts ./scripts -# COPY .env ./ +RUN npm install local-ssl-proxy +COPY index.js ecosystem.json ./ COPY --from=build /usr/src/app/dist ./dist +RUN npm run ssl-proxy +#RUN npm run fetch-examples:prod CMD ["pm2-runtime", "ecosystem.json"] diff --git a/docker-compose.yml b/docker-compose.yml index f7c2a490..87d5fd93 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,8 +6,8 @@ services: - dbdata:/data/db expose: - "27017" - nginx: - build: ./nginx + # nginx: + # build: ./nginx server: build: context: . @@ -17,11 +17,15 @@ services: - .env environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor + - API_URL=https://localhost/api + - PORT=80 volumes: - .:/opt/node/app - /opt/node/app/node_modules ports: - '8000:8000' + - '80:80' + - '443:443' depends_on: - mongo volumes: diff --git a/package.json b/package.json index 6edafcd9..09d90d7c 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,16 @@ "start:prod": "cross-env NODE_ENV=production node index.js", "lint": "eslint client server --ext .jsx --ext .js", "lint-fix": "eslint client server --ext .jsx --ext .js --fix", - "build": "npm run build:client && npm run build:server", + "build": "npm run build:client && npm run build:server && npm run build:examples", "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js --progress", + "build:examples": "cross-env NODE_ENV=production webpack --config webpack.config.examples.js --progress", "test": "npm run lint", "fetch-examples": "node ./server/scripts/fetch-examples.js", - "fetch-examples-gg": "node ./server/scripts/fetch-examples-gg.js" + "fetch-examples-gg": "node ./server/scripts/fetch-examples-gg.js", + "fetch-examples:prod": "node ./dist/fetch-examples.bundle.js", + "fetch-examples-gg:prod": "node ./dist/fetch-examples.bundle.js", + "ssl-proxy": "local-ssl-proxy --source 443 --target 80 &" }, "main": "index.js", "author": "Cassie Tarakajian", diff --git a/server/scripts/fetch-examples-gg.js b/server/scripts/fetch-examples-gg.js index 647618d9..51867785 100644 --- a/server/scripts/fetch-examples-gg.js +++ b/server/scripts/fetch-examples-gg.js @@ -1,6 +1,6 @@ require('babel-register'); require('babel-polyfill'); -if (process.env.NODE_ENV !== "production") { +if (process.env.NODE_ENV === "development") { require('dotenv').config(); } require('./examples-gg-latest.js'); diff --git a/server/scripts/fetch-examples.js b/server/scripts/fetch-examples.js index d4037179..e287b076 100644 --- a/server/scripts/fetch-examples.js +++ b/server/scripts/fetch-examples.js @@ -1,6 +1,6 @@ require('babel-register'); require('babel-polyfill'); -if (process.env.NODE_ENV !== "production") { +if (process.env.NODE_ENV === "development") { require('dotenv').config(); } require('./examples.js'); diff --git a/webpack.config.dev.js b/webpack.config.dev.js index 9b453932..81d542ba 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -1,5 +1,7 @@ const webpack = require('webpack'); -require('dotenv').config(); +if (process.env.NODE_ENV === 'development') { + require('dotenv').config(); +} module.exports = { devtool: 'cheap-module-eval-source-map', diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 7170b9c0..2f02835e 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -6,7 +6,7 @@ const cssnext = require('postcss-cssnext'); const postcssFocus = require('postcss-focus'); const postcssReporter = require('postcss-reporter'); const cssnano = require('cssnano'); -if (process.env.NODE_ENV !== "production") { +if (process.env.NODE_ENV === "development") { require('dotenv').config(); } From d4b927f0d4c8f31dcfdcb91a246326dd070d6f2f Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 19 Jun 2018 15:22:18 -0700 Subject: [PATCH 19/75] get nginx proxying working on local machine --- .travis.yml | 11 ++++- Dockerfile | 5 +- docker-compose.yml | 15 +++--- nginx/Dockerfile | 4 +- nginx/alpha.editor.p5js.org.conf | 42 ++++++++-------- nginx/nginx.conf | 84 ++++++++++++++++---------------- 6 files changed, 85 insertions(+), 76 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4eaef2a4..be52c161 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,12 @@ language: node_js node_js: - - "8.11.1" \ No newline at end of file + - "8.11.1" + +services: + - docker + +before_install: + # eventually set up AWS stuff here + - docker-compose up -d + - docker ps -a + diff --git a/Dockerfile b/Dockerfile index 05076099..8ba98119 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,6 +30,7 @@ RUN npm install pm2 -g RUN npm install local-ssl-proxy COPY index.js ecosystem.json ./ COPY --from=build /usr/src/app/dist ./dist -RUN npm run ssl-proxy -#RUN npm run fetch-examples:prod +# for reg production CMD ["pm2-runtime", "ecosystem.json"] +# for testing ssl locally +# CMD npm run ssl-proxy && pm2-runtime ecosystem.json diff --git a/docker-compose.yml b/docker-compose.yml index 87d5fd93..203fa5c8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,9 +6,11 @@ services: - dbdata:/data/db expose: - "27017" - # nginx: - # build: ./nginx - server: + nginx: + build: ./nginx + ports: + - '80:80' + app: build: context: . dockerfile: Dockerfile @@ -17,15 +19,14 @@ services: - .env environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - - API_URL=https://localhost/api - - PORT=80 + # - API_URL=https://localhost/api + # - PORT=80 volumes: - .:/opt/node/app - /opt/node/app/node_modules ports: - '8000:8000' - - '80:80' - - '443:443' + # - '443:443' depends_on: - mongo volumes: diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 49d6b29a..cbe1e0b1 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,5 +1,3 @@ FROM nginx:1.13.12 -RUN mkdir -p /etc/nginx/sites-enabled -COPY nginx.conf /etc/nginx/nginx.conf -COPY alpha.editor.p5js.org.conf /etc/nginx/sites-enabled \ No newline at end of file +COPY alpha.editor.p5js.org.conf /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/nginx/alpha.editor.p5js.org.conf b/nginx/alpha.editor.p5js.org.conf index f89e51bd..884d68bb 100644 --- a/nginx/alpha.editor.p5js.org.conf +++ b/nginx/alpha.editor.p5js.org.conf @@ -1,27 +1,27 @@ # HTTP - redirect all requests to HTTPS: server { listen 80; - server_name alpha.editor.p5js.org; + #server_name alpha.editor.p5js.org; location / { - proxy_pass http://127.0.0.1:8000; + proxy_pass http://app:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } - location ~* \/login(\/)* { - return 301 https://$host$request_uri; - } - location ~* \/signup(\/)* { - return 301 https://$host$request_uri; - } - location ~* \/reset-password(\/)* { - return 301 https://$host$request_uri; - } - location ~* "\/[a-zA-Z0-9._-]{1,20}\/account(\/)*" { - return 301 https://$host$request_uri; - } + # location ~* \/login(\/)* { + # return 301 https://$host$request_uri; + # } + # location ~* \/signup(\/)* { + # return 301 https://$host$request_uri; + # } + # location ~* \/reset-password(\/)* { + # return 301 https://$host$request_uri; + # } + # location ~* "\/[a-zA-Z0-9._-]{1,20}\/account(\/)*" { + # return 301 https://$host$request_uri; + # } } @@ -41,13 +41,13 @@ # } # } -server { - listen 80; - server_name editor.p5js.org; - location ~ ^/(.*) { - return 302 http://alpha.editor.p5js.org/$1; - } -} +# server { +# listen 80; +# server_name editor.p5js.org; +# location ~ ^/(.*) { +# return 302 http://alpha.editor.p5js.org/$1; +# } +# } # server { # listen 443; diff --git a/nginx/nginx.conf b/nginx/nginx.conf index b0ab9feb..7d128192 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -30,59 +30,59 @@ http { # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. - include /etc/nginx/conf.d/*.conf; + # include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*.conf; - index index.html index.htm; + # index index.html index.htm; - server { - listen 80 default_server; - listen [::]:80 default_server; - server_name localhost; - root /usr/share/nginx/html; + # server { + # listen 80 default_server; + # listen [::]:80 default_server; + # server_name localhost; + # root /usr/share/nginx/html; - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; + # # Load configuration files for the default server block. + # include /etc/nginx/default.d/*.conf; - location / { - } + # location / { + # } - # redirect server error pages to the static page /40x.html - # - error_page 404 /404.html; - location = /40x.html { - } + # # redirect server error pages to the static page /40x.html + # # + # error_page 404 /404.html; + # location = /40x.html { + # } - # redirect server error pages to the static page /50x.html - # - error_page 500 502 503 504 /50x.html; - location = /50x.html { - } + # # redirect server error pages to the static page /50x.html + # # + # error_page 500 502 503 504 /50x.html; + # location = /50x.html { + # } - # proxy the PHP scripts to Apache listening on 127.0.0.1:80 - # - #location ~ \.php$ { - # proxy_pass http://127.0.0.1; - #} + # # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # # + # #location ~ \.php$ { + # # proxy_pass http://127.0.0.1; + # #} - # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 - # - #location ~ \.php$ { - # root html; - # fastcgi_pass 127.0.0.1:9000; - # fastcgi_index index.php; - # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; - # include fastcgi_params; - #} + # # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # # + # #location ~ \.php$ { + # # root html; + # # fastcgi_pass 127.0.0.1:9000; + # # fastcgi_index index.php; + # # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # # include fastcgi_params; + # #} - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} - } + # # deny access to .htaccess files, if Apache's document root + # # concurs with nginx's one + # # + # #location ~ /\.ht { + # # deny all; + # #} + # } # Settings for a TLS enabled server. From f7db48910c374b7176eb1f43b94f1d505e166140 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 19 Jun 2018 19:22:35 -0700 Subject: [PATCH 20/75] remove reference to .env file from docker-compose.yml --- .travis.yml | 11 +++++++++++ docker-compose.yml | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index be52c161..87276657 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +sudo: required language: node_js node_js: - "8.11.1" @@ -10,3 +11,13 @@ before_install: - docker-compose up -d - docker ps -a +before_script: +# Install dependencies in the app container +- docker-compose exec -T app composer self-update +- docker-compose exec -T app composer install --no-interaction +- docker-compose exec -T app composer dump-autoload -o + +script: +# Run unit tests in the app container +- docker-compose exec -T app npm run test --verbose + diff --git a/docker-compose.yml b/docker-compose.yml index 203fa5c8..fa865432 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,8 +15,8 @@ services: context: . dockerfile: Dockerfile target: production - env_file: - - .env + # env_file: + # - .env environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor # - API_URL=https://localhost/api From 25aa5c77f1ceaad1c9dc969eeb6f836cd78b76f8 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 19 Jun 2018 19:46:34 -0700 Subject: [PATCH 21/75] remove --progress from webpack build to see if it prints error --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 09d90d7c..c270dcc5 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "lint": "eslint client server --ext .jsx --ext .js", "lint-fix": "eslint client server --ext .jsx --ext .js --fix", "build": "npm run build:client && npm run build:server && npm run build:examples", - "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", - "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js --progress", - "build:examples": "cross-env NODE_ENV=production webpack --config webpack.config.examples.js --progress", + "build:client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js", + "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js", + "build:examples": "cross-env NODE_ENV=production webpack --config webpack.config.examples.js", "test": "npm run lint", "fetch-examples": "node ./server/scripts/fetch-examples.js", "fetch-examples-gg": "node ./server/scripts/fetch-examples-gg.js", From f340d2715fe33e4ea5f5f46d9e7c5db9c4684308 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 19 Jun 2018 20:01:04 -0700 Subject: [PATCH 22/75] remove installation step from travis because it's in Dockerfile --- .travis.yml | 2 ++ Dockerfile | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 87276657..bf6ac436 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,8 @@ before_install: - docker-compose up -d - docker ps -a +install: true + before_script: # Install dependencies in the app container - docker-compose exec -T app composer self-update diff --git a/Dockerfile b/Dockerfile index 8ba98119..654a4090 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,7 +27,7 @@ COPY package.json package-lock.json ./ RUN npm install --production RUN npm rebuild node-sass RUN npm install pm2 -g -RUN npm install local-ssl-proxy +# RUN npm install local-ssl-proxy COPY index.js ecosystem.json ./ COPY --from=build /usr/src/app/dist ./dist # for reg production From b86a4093c55008d202a5cf83d1bc1320d7ef7dd0 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 20 Jun 2018 08:50:13 -0700 Subject: [PATCH 23/75] try removing before_script --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index bf6ac436..d722269a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,11 +13,11 @@ before_install: install: true -before_script: -# Install dependencies in the app container -- docker-compose exec -T app composer self-update -- docker-compose exec -T app composer install --no-interaction -- docker-compose exec -T app composer dump-autoload -o +# before_script: +# # Install dependencies in the app container +# - docker-compose exec -T app composer self-update +# - docker-compose exec -T app composer install --no-interaction +# - docker-compose exec -T app composer dump-autoload -o script: # Run unit tests in the app container From 217ae7011f91a12cc4ad7e4c45c52b984bfabc09 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 20 Jun 2018 10:01:11 -0700 Subject: [PATCH 24/75] try building docker images in development first for linting --- .travis.yml | 11 ++++------- README.md | 6 +++--- docker-compose-development.yml | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index d722269a..5b5f0b62 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,18 +8,15 @@ services: before_install: # eventually set up AWS stuff here - - docker-compose up -d + - docker-compose -f docker-compose-development.yml up -d - docker ps -a install: true -# before_script: -# # Install dependencies in the app container -# - docker-compose exec -T app composer self-update -# - docker-compose exec -T app composer install --no-interaction -# - docker-compose exec -T app composer dump-autoload -o - script: # Run unit tests in the app container - docker-compose exec -T app npm run test --verbose +after_success: +- docker-compose stop +- docker-compose build --no-cache \ No newline at end of file diff --git a/README.md b/README.md index 9ab0fcc1..667e5988 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Note that this takes up a significant amount of space on your machine. Make sure * Windows: https://www.docker.com/docker-windows 2. Clone this repository and cd into it 3. `$ docker-compose -f docker-compose-development.yml build` -4. `$ docker-compose -f docker-compose-development.yml run --rm server npm run fetch-examples` +4. `$ docker-compose -f docker-compose-development.yml run --rm app npm run fetch-examples` Now, anytime you wish to start the server with its dependencies, you can run: @@ -43,11 +43,11 @@ Now, anytime you wish to start the server with its dependencies, you can run: To open a terminal/shell in the running Docker server (i.e. after `docker-compose up` has been run): -7. `$ docker-compose -f docker-compose-development.yml exec server bash -l` +7. `$ docker-compose -f docker-compose-development.yml exec app bash -l` If you don't have the full server environment running, you can launch a one-off container instance (and have it automatically deleted after you're done using it): -8. `$ docker-compose -f docker-compose-development.yml run server --rm bash -l` +8. `$ docker-compose -f docker-compose-development.yml run app --rm bash -l` ## Production Installation 1. Clone this repository and `cd` into it diff --git a/docker-compose-development.yml b/docker-compose-development.yml index e07f2ebf..783d8d65 100644 --- a/docker-compose-development.yml +++ b/docker-compose-development.yml @@ -4,7 +4,7 @@ services: image: mongo:3.4.7 volumes: - dbdata:/data/db - server: + app: build: context: ./ dockerfile: Dockerfile From 432361bc86644820bd892cd225fa523ea23bb325 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 20 Jun 2018 10:28:54 -0700 Subject: [PATCH 25/75] fix lint errors --- server/scripts/fetch-examples-gg.js | 6 ++++-- server/scripts/fetch-examples.js | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/server/scripts/fetch-examples-gg.js b/server/scripts/fetch-examples-gg.js index 51867785..6aa5ac64 100644 --- a/server/scripts/fetch-examples-gg.js +++ b/server/scripts/fetch-examples-gg.js @@ -1,6 +1,8 @@ require('babel-register'); require('babel-polyfill'); -if (process.env.NODE_ENV === "development") { - require('dotenv').config(); +const dotenv = require('dotenv'); + +if (process.env.NODE_ENV === 'development') { + dotenv.config(); } require('./examples-gg-latest.js'); diff --git a/server/scripts/fetch-examples.js b/server/scripts/fetch-examples.js index e287b076..a4b05da4 100644 --- a/server/scripts/fetch-examples.js +++ b/server/scripts/fetch-examples.js @@ -1,6 +1,8 @@ require('babel-register'); require('babel-polyfill'); -if (process.env.NODE_ENV === "development") { - require('dotenv').config(); +const dotenv = require('dotenv'); + +if (process.env.NODE_ENV === 'development') { + dotenv.config(); } require('./examples.js'); From adebaaba450c4e804f528be14309d2b05f0ffdfd Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 20 Jun 2018 11:29:13 -0700 Subject: [PATCH 26/75] try pushing images to docker hub --- .travis.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5b5f0b62..b6f50836 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,5 +18,16 @@ script: - docker-compose exec -T app npm run test --verbose after_success: +# eventually wrap this in a if branch is master - docker-compose stop -- docker-compose build --no-cache \ No newline at end of file +- docker-compose build --no-cache +- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" +- docker tag docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$APP_IMAGE_NAME\_$TRAVIS_BUILD_ID +- docker tag docker tag $NGINX_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$NGINX_IMAGE_NAME\_$TRAVIS_BUILD_ID +- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$APP_IMAGE_NAME\_$TRAVIS_BUILD_ID +- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$NGINX_IMAGE_NAME\_$TRAVIS_BUILD_ID + +env: + global: + - APP_IMAGE_NAME=p5js-web-editor_app + - NGINX_IMAGE_NAME=p5js-web-editor_nginx \ No newline at end of file From 4b78b7be5b4a48dbad26298d835e190b1bf5012a Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 20 Jun 2018 11:47:21 -0700 Subject: [PATCH 27/75] fix docker tag command --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b6f50836..fd92651e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,8 +22,8 @@ after_success: - docker-compose stop - docker-compose build --no-cache - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" -- docker tag docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$APP_IMAGE_NAME\_$TRAVIS_BUILD_ID -- docker tag docker tag $NGINX_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$NGINX_IMAGE_NAME\_$TRAVIS_BUILD_ID +- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$APP_IMAGE_NAME\_$TRAVIS_BUILD_ID +- docker tag $NGINX_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$NGINX_IMAGE_NAME\_$TRAVIS_BUILD_ID - docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$APP_IMAGE_NAME\_$TRAVIS_BUILD_ID - docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$NGINX_IMAGE_NAME\_$TRAVIS_BUILD_ID From 72750e85689f7396ba32c413b46a95e7803ad50b Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 20 Jun 2018 12:09:54 -0700 Subject: [PATCH 28/75] try to tag docker images again --- .travis.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index fd92651e..ca6f47b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,10 +22,11 @@ after_success: - docker-compose stop - docker-compose build --no-cache - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" -- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$APP_IMAGE_NAME\_$TRAVIS_BUILD_ID -- docker tag $NGINX_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$NGINX_IMAGE_NAME\_$TRAVIS_BUILD_ID -- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$APP_IMAGE_NAME\_$TRAVIS_BUILD_ID -- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$NGINX_IMAGE_NAME\_$TRAVIS_BUILD_ID +- docker image ls +- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:app_$TRAVIS_BUILD_ID +- docker tag $NGINX_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:nginx_$TRAVIS_BUILD_ID +- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:app_$TRAVIS_BUILD_ID +- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:nginx_$TRAVIS_BUILD_ID env: global: From 1c135635ca4c8a64f150096536cedbeaa91bd372 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 20 Jun 2018 13:34:09 -0700 Subject: [PATCH 29/75] okay this time definitely the docker push will work --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ca6f47b0..c78422d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,5 +30,5 @@ after_success: env: global: - - APP_IMAGE_NAME=p5js-web-editor_app - - NGINX_IMAGE_NAME=p5js-web-editor_nginx \ No newline at end of file + - APP_IMAGE_NAME=p5jswebeditor_app + - NGINX_IMAGE_NAME=p5jswebeditor_nginx \ No newline at end of file From f06198a4e1e6ec3a2d2cffb6da5a1fc3d0a3ae85 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 25 Jun 2018 16:13:31 -0700 Subject: [PATCH 30/75] start to add mongo configuration --- .env.example | 5 ++ .travis.yml | 22 ++++++++- docker-compose.yml | 53 +++++++++++--------- mongo/Dockerfile | 13 +++++ mongo/docker-entrypoint.sh | 42 ++++++++++++++++ server/Dockerrun.aws.json | 73 ++++++++++++++++++++++++++++ server/scripts/examples-gg-latest.js | 13 ++++- server/scripts/examples.js | 14 +++++- server/server.js | 16 +++++- 9 files changed, 222 insertions(+), 29 deletions(-) create mode 100644 mongo/Dockerfile create mode 100644 mongo/docker-entrypoint.sh create mode 100644 server/Dockerrun.aws.json diff --git a/.env.example b/.env.example index 3bfd7e50..0c80d768 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,10 @@ API_URL=/api MONGO_URL=mongodb://localhost:27017/p5js-web-editor +MONGO_HOSTNAME=localhost +MONGO_PORT=27017 +MONGO_NAME=p5js-web-editor +MONGO_ROOT_USERNAME=processing_user +MONGO_ROOT_PASSWORD= PORT=8000 SESSION_SECRET=whatever_you_want_this_to_be_it_only_matters_for_production AWS_ACCESS_KEY= diff --git a/.travis.yml b/.travis.yml index c78422d0..721092f3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,9 @@ sudo: required language: node_js node_js: - "8.11.1" +python: +- "3.4" +- "pypy-5.3.1" services: - docker @@ -18,7 +21,24 @@ script: - docker-compose exec -T app npm run test --verbose after_success: -# eventually wrap this in a if branch is master +# only run this if on the master branch eventually, not while testing tho +- sudo apt-get install -y python3.4 +- sudo apt-get install --upgrade -y python-pip +- sudo apt-get install jq +- sudo pip install --user virtualenv +# Create a virtual environment for AWS CLI +- virtualenv my_py3 --python=/usr/bin/python3.4 +- source my_py3/bin/activate +- pip install --upgrade awscli +- pip install --upgrade awsebcli +# Set AWS information +- aws configure set aws_access_key_id $AWS_ACCESS_KEY +- aws configure set aws_secret_access_key $AWS_SECRET_KEY +- aws configure set default.region $AWS_REGION +- aws configure set metadata_service_timeout 1200 +- aws configure set metadata_service_num_attempts 3 +- aws configure list +# build images - docker-compose stop - docker-compose build --no-cache - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" diff --git a/docker-compose.yml b/docker-compose.yml index fa865432..971789ec 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,33 +1,38 @@ version: '3.4' services: mongo: - image: mongo:3.4.7 + build: ./mongo volumes: - dbdata:/data/db expose: - "27017" - nginx: - build: ./nginx - ports: - - '80:80' - app: - build: - context: . - dockerfile: Dockerfile - target: production - # env_file: - # - .env - environment: - - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - # - API_URL=https://localhost/api - # - PORT=80 - volumes: - - .:/opt/node/app - - /opt/node/app/node_modules - ports: - - '8000:8000' - # - '443:443' - depends_on: - - mongo + # restart: always + env_file: + - .env + # nginx: + # build: ./nginx + # ports: + # - '80:80' + # app: + # build: + # context: . + # dockerfile: Dockerfile + # target: production + # env_file: + # - .env + # environment: + # - MONGO_URL=mongodb://mongo:27017/p5js-web-editor + # - MONGO_HOSTNAME=mongo + # # - API_URL=https://localhost/api + # # - PORT=80 + # volumes: + # - .:/opt/node/app + # - /opt/node/app/node_modules + # ports: + # - '8000:8000' + # # - '443:443' + # # - '80:80' + # depends_on: + # - mongo volumes: dbdata: diff --git a/mongo/Dockerfile b/mongo/Dockerfile new file mode 100644 index 00000000..ca519793 --- /dev/null +++ b/mongo/Dockerfile @@ -0,0 +1,13 @@ +# Use an official mongo runtime as a parent image +FROM mongo:3.4 + +# Expose the mongo port +EXPOSE 27017 + +# Copy the mongod.conf file to env +# COPY mongod.conf /env/ + +# Copy the entrypoint file as well +COPY ./docker-entrypoint.sh . + +CMD ["/bin/bash", "docker-entrypoint.sh"] \ No newline at end of file diff --git a/mongo/docker-entrypoint.sh b/mongo/docker-entrypoint.sh new file mode 100644 index 00000000..179b5c2f --- /dev/null +++ b/mongo/docker-entrypoint.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -euo pipefail + +function waitForMongo { + port=$1 + n=0 + until [ $n -ge 20 ] + do + mongo admin --quiet --port $port --eval "db" && break + n=$[$n+1] + sleep 2 + done +} + +if ! [[ -a /data/db/mydb-initialized ]]; then + mongod & MONGO_PID=$! + waitForMongo 27017 + mongo admin --port 27017 --eval "db.system.version.insert({ '_id' : 'authSchema', 'currentVersion' : 3 })" + mongod --shutdown + + mongod & MONGO_PID=$! + waitForMongo 27017 + mongo admin --port 27017 --eval "db.createUser({ user: '${MONGO_INITDB_ROOT_USERNAME}', pwd: '${MONGO_INITDB_ROOT_PASSWORD}', roles: [ 'root' ]})" + mongo admin -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} --port 27017 --eval "db.createUser({ user: '${MONGO_RW_USERNAME}', pwd: '${MONGO_RW_PASSWORD}', roles: [ {role: 'readWrite', db: 'isf-website'}, {role: 'readWrite', db: 'sessions'} ]})" + mongod --shutdown + + mongod -f /env/mongod.conf --auth & MONGO_PID=$! + waitForMongo 27017 + mongo admin -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} --port 27017 --eval "db.runCommand({ replSetInitiate: '{}' })" + mongo admin -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} --port 27017 --eval "db.setSlaveOk()" + mongod --shutdown + + touch /data/db/mydb-initialized +fi + +mongod -f /env/mongod.conf --auth & MONGO_PID=$! + +waitForMongo 27017 + +trap 'echo "KILLING"; kill $MONGO_PID; wait $MONGO_PID' SIGINT SIGTERM EXIT + +wait $MONGO_PID \ No newline at end of file diff --git a/server/Dockerrun.aws.json b/server/Dockerrun.aws.json new file mode 100644 index 00000000..261d66c5 --- /dev/null +++ b/server/Dockerrun.aws.json @@ -0,0 +1,73 @@ +{ + "AWSEBDockerrunVersion": 2, + "authentication": { + "bucket": "", + "key": ".dockercfg" + }, + "volumes": [ + { + "name": "storage", + "host": { + "sourcePath": "/var/data" + } + }, + { + "name": "app", + "host": { + "sourcePath": "/var/app/current/app" + } + } + ], + "containerDefinitions": [ + { + "name": "mongo", + "image": "mongo:3.4", + "essential": true, + "memory": 512, + "portMappings": [ + { + "hostPort": 27017, + "containerPort": 27017 + } + ], + "mountPoints": [ + { + "sourceVolume": "storage", + "containerPath": "/var/lib/mysql" + } + ], + "environment": [ + { + "name": "MYSQL_ROOT_PASSWORD", + "value": "password" + }, + { + "name": "MYSQL_DATABASE", + "value": "my_db" + } + ] + }, + { + "name": "app", + "image": ":", + "essential": true, + "memory": 256, + "portMappings": [ + { + "hostPort": 80, + "containerPort": 80 + } + ], + "links": [ + "db" + ], + "mountPoints": [ + { + "sourceVolume": "app", + "containerPath": "/var/www/html", + "readOnly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/server/scripts/examples-gg-latest.js b/server/scripts/examples-gg-latest.js index a9a0a2cd..52f66b1b 100644 --- a/server/scripts/examples-gg-latest.js +++ b/server/scripts/examples-gg-latest.js @@ -3,6 +3,7 @@ import Q from 'q'; import mongoose from 'mongoose'; import objectID from 'bson-objectid'; import shortid from 'shortid'; +import { URL } from 'url'; import eachSeries from 'async/eachSeries'; import User from '../models/user'; @@ -65,7 +66,17 @@ canvas { const headers = { 'User-Agent': 'p5js-web-editor/0.0.1' }; -mongoose.connect(process.env.MONGO_URL); +let mongoConnectionString; +if (process.env.NODE_ENV === 'production') { + const { MONGO_RW_USERNAME, MONGO_RW_PASSWORD, MONGO_HOSTNAME, MONGO_PORT, MONGO_NAME } = process.env; + const muo = new URL(`mongodb://${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_NAME}`); + muo.username = MONGO_RW_USERNAME; + muo.password = MONGO_RW_PASSWORD; + mongoConnectionString = muo.href + "?authSource=admin"; +} else { + mongoConnectionString = process.env.MONGO_URL; +} +mongoose.connect(mongoConnectionString); mongoose.connection.on('error', () => { console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); process.exit(1); diff --git a/server/scripts/examples.js b/server/scripts/examples.js index c1cccc60..51841b2a 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -4,6 +4,7 @@ import mongoose from 'mongoose'; import objectID from 'bson-objectid'; import shortid from 'shortid'; import eachSeries from 'async/eachSeries'; +import { URL } from 'url'; import User from '../models/user'; import Project from '../models/project'; @@ -35,7 +36,18 @@ const clientSecret = process.env.GITHUB_SECRET; const headers = { 'User-Agent': 'p5js-web-editor/0.0.1' }; -mongoose.connect(process.env.MONGO_URL); +let mongoConnectionString; +if (process.env.NODE_ENV === 'production') { + const { MONGO_RW_USERNAME, MONGO_RW_PASSWORD, MONGO_HOSTNAME, MONGO_PORT, MONGO_NAME } = process.env; + const muo = new URL(`mongodb://${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_NAME}`); + muo.username = MONGO_RW_USERNAME; + muo.password = MONGO_RW_PASSWORD; + mongoConnectionString = muo.href + "?authSource=admin"; +} else { + mongoConnectionString = process.env.MONGO_URL; +} + +mongoose.connect(mongoConnectionString); mongoose.connection.on('error', () => { console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); process.exit(1); diff --git a/server/server.js b/server/server.js index efb915b7..4e471e29 100644 --- a/server/server.js +++ b/server/server.js @@ -7,6 +7,7 @@ import session from 'express-session'; import connectMongo from 'connect-mongo'; import passport from 'passport'; import path from 'path'; +import { URL } from 'url'; // Webpack Requirements import webpack from 'webpack'; @@ -44,6 +45,17 @@ if (process.env.NODE_ENV === 'development') { corsOriginsWhitelist.push(/localhost/); } +let mongoConnectionString; +if (process.env.NODE_ENV === 'production') { + const { MONGO_RW_USERNAME, MONGO_RW_PASSWORD, MONGO_HOSTNAME, MONGO_PORT, MONGO_NAME } = process.env; + const muo = new URL(`mongodb://${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_NAME}`); + muo.username = MONGO_RW_USERNAME; + muo.password = MONGO_RW_PASSWORD; + mongoConnectionString = muo.href + "?authSource=admin"; +} else { + mongoConnectionString = process.env.MONGO_URL; +} + // Enable Cross-Origin Resource Sharing (CORS) for all origins const corsMiddleware = cors({ credentials: true, @@ -72,7 +84,7 @@ app.use(session({ secure: false, }, store: new MongoStore({ - url: process.env.MONGO_URL, + url: mongoConnectionString, autoReconnect: true }) })); @@ -105,7 +117,7 @@ require('./config/passport'); // const passportConfig = require('./config/passport'); // Connect to MongoDB -mongoose.connect(process.env.MONGO_URL); +mongoose.connect(mongoConnectionString); mongoose.connection.on('error', () => { console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); process.exit(1); From a7f319a727d44362e6a08a42f685067b47702455 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 25 Jun 2018 18:18:40 -0700 Subject: [PATCH 31/75] add authentication to mongo, properly, not tested to see if it works with server --- docker-compose.yml | 54 ++++++++++++++++++++------------------ mongo/Dockerfile | 13 --------- mongo/docker-entrypoint.sh | 42 ----------------------------- mongo/init.sh | 1 + 4 files changed, 29 insertions(+), 81 deletions(-) delete mode 100644 mongo/Dockerfile delete mode 100644 mongo/docker-entrypoint.sh create mode 100644 mongo/init.sh diff --git a/docker-compose.yml b/docker-compose.yml index 971789ec..8108d373 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,38 +1,40 @@ version: '3.4' services: mongo: - build: ./mongo + image: mongo:3.4 volumes: - dbdata:/data/db + - "$PWD/mongo/:/docker-entrypoint-initdb.d/" expose: - "27017" + ports: + - '27017:27017' # restart: always env_file: - .env - # nginx: - # build: ./nginx - # ports: - # - '80:80' - # app: - # build: - # context: . - # dockerfile: Dockerfile - # target: production - # env_file: - # - .env - # environment: - # - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - # - MONGO_HOSTNAME=mongo - # # - API_URL=https://localhost/api - # # - PORT=80 - # volumes: - # - .:/opt/node/app - # - /opt/node/app/node_modules - # ports: - # - '8000:8000' - # # - '443:443' - # # - '80:80' - # depends_on: - # - mongo + nginx: + build: ./nginx + ports: + - '80:80' + app: + build: + context: . + dockerfile: Dockerfile + target: production + env_file: + - .env + environment: + - MONGO_URL=mongodb://mongo:27017/p5js-web-editor + - MONGO_HOSTNAME=mongo + # - API_URL=https://localhost/api + # - PORT=80 + volumes: + - .:/opt/node/app + - /opt/node/app/node_modules + ports: + - '8000:8000' + # - '443:443' + depends_on: + - mongo volumes: dbdata: diff --git a/mongo/Dockerfile b/mongo/Dockerfile deleted file mode 100644 index ca519793..00000000 --- a/mongo/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -# Use an official mongo runtime as a parent image -FROM mongo:3.4 - -# Expose the mongo port -EXPOSE 27017 - -# Copy the mongod.conf file to env -# COPY mongod.conf /env/ - -# Copy the entrypoint file as well -COPY ./docker-entrypoint.sh . - -CMD ["/bin/bash", "docker-entrypoint.sh"] \ No newline at end of file diff --git a/mongo/docker-entrypoint.sh b/mongo/docker-entrypoint.sh deleted file mode 100644 index 179b5c2f..00000000 --- a/mongo/docker-entrypoint.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -set -euo pipefail - -function waitForMongo { - port=$1 - n=0 - until [ $n -ge 20 ] - do - mongo admin --quiet --port $port --eval "db" && break - n=$[$n+1] - sleep 2 - done -} - -if ! [[ -a /data/db/mydb-initialized ]]; then - mongod & MONGO_PID=$! - waitForMongo 27017 - mongo admin --port 27017 --eval "db.system.version.insert({ '_id' : 'authSchema', 'currentVersion' : 3 })" - mongod --shutdown - - mongod & MONGO_PID=$! - waitForMongo 27017 - mongo admin --port 27017 --eval "db.createUser({ user: '${MONGO_INITDB_ROOT_USERNAME}', pwd: '${MONGO_INITDB_ROOT_PASSWORD}', roles: [ 'root' ]})" - mongo admin -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} --port 27017 --eval "db.createUser({ user: '${MONGO_RW_USERNAME}', pwd: '${MONGO_RW_PASSWORD}', roles: [ {role: 'readWrite', db: 'isf-website'}, {role: 'readWrite', db: 'sessions'} ]})" - mongod --shutdown - - mongod -f /env/mongod.conf --auth & MONGO_PID=$! - waitForMongo 27017 - mongo admin -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} --port 27017 --eval "db.runCommand({ replSetInitiate: '{}' })" - mongo admin -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} --port 27017 --eval "db.setSlaveOk()" - mongod --shutdown - - touch /data/db/mydb-initialized -fi - -mongod -f /env/mongod.conf --auth & MONGO_PID=$! - -waitForMongo 27017 - -trap 'echo "KILLING"; kill $MONGO_PID; wait $MONGO_PID' SIGINT SIGTERM EXIT - -wait $MONGO_PID \ No newline at end of file diff --git a/mongo/init.sh b/mongo/init.sh new file mode 100644 index 00000000..76248c51 --- /dev/null +++ b/mongo/init.sh @@ -0,0 +1 @@ +mongo $MONGO_INITDB_DATABASE --eval "db.createUser({ user: '$MONGO_RW_USERNAME', pwd: '$MONGO_RW_PASSWORD', roles: [ 'readWrite' ] })" \ No newline at end of file From f6f8e145d1fc92118b874cbe0f4c3aeb29b33dc5 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 25 Jun 2018 19:16:42 -0700 Subject: [PATCH 32/75] get the mongo authentication to workgit add . --- mongo/init.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mongo/init.sh b/mongo/init.sh index 76248c51..c574d6b4 100644 --- a/mongo/init.sh +++ b/mongo/init.sh @@ -1 +1 @@ -mongo $MONGO_INITDB_DATABASE --eval "db.createUser({ user: '$MONGO_RW_USERNAME', pwd: '$MONGO_RW_PASSWORD', roles: [ 'readWrite' ] })" \ No newline at end of file +mongo admin -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval "db.createUser({ user: '$MONGO_RW_USERNAME', pwd: '$MONGO_RW_PASSWORD', roles: [ { role: 'readWrite', db: '$MONGO_INITDB_DATABASE' }, { role: 'readWrite', db: 'sessions' }] })" \ No newline at end of file From ffeb900d89477799f005cc0b6c43e3b9eba9af40 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 26 Jun 2018 14:50:21 -0700 Subject: [PATCH 33/75] comment out .env file --- docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8108d373..8db3575b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,8 +10,8 @@ services: ports: - '27017:27017' # restart: always - env_file: - - .env + # env_file: + # - .env nginx: build: ./nginx ports: @@ -21,8 +21,8 @@ services: context: . dockerfile: Dockerfile target: production - env_file: - - .env + # env_file: + # - .env environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - MONGO_HOSTNAME=mongo From 82059bbfb0cf7dca802d3bee9e6a5cf1b427b3b5 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 26 Jun 2018 19:05:08 -0700 Subject: [PATCH 34/75] remove nginx Dockerfile because it's not actually necessary --- .travis.yml | 50 +++---- .../Dockerrun.aws.json => Dockerrun.aws.json | 24 +++- docker-compose.yml | 14 +- nginx/Dockerfile | 3 - nginx/nginx-aws.conf | 122 ------------------ nginx/nginx.conf | 122 ------------------ 6 files changed, 59 insertions(+), 276 deletions(-) rename server/Dockerrun.aws.json => Dockerrun.aws.json (72%) delete mode 100644 nginx/Dockerfile delete mode 100644 nginx/nginx-aws.conf delete mode 100644 nginx/nginx.conf diff --git a/.travis.yml b/.travis.yml index 721092f3..1a6f47f4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,33 +22,39 @@ script: after_success: # only run this if on the master branch eventually, not while testing tho -- sudo apt-get install -y python3.4 -- sudo apt-get install --upgrade -y python-pip -- sudo apt-get install jq -- sudo pip install --user virtualenv -# Create a virtual environment for AWS CLI -- virtualenv my_py3 --python=/usr/bin/python3.4 -- source my_py3/bin/activate -- pip install --upgrade awscli -- pip install --upgrade awsebcli -# Set AWS information -- aws configure set aws_access_key_id $AWS_ACCESS_KEY -- aws configure set aws_secret_access_key $AWS_SECRET_KEY -- aws configure set default.region $AWS_REGION -- aws configure set metadata_service_timeout 1200 -- aws configure set metadata_service_num_attempts 3 -- aws configure list +# - sudo apt-get install -y python3.4 +# - sudo apt-get install --upgrade -y python-pip +# - sudo apt-get install jq +# - sudo pip install --user virtualenv +# # Create a virtual environment for AWS CLI +# - virtualenv my_py3 --python=/usr/bin/python3.4 +# - source my_py3/bin/activate +# - pip install --upgrade awscli +# - pip install --upgrade awsebcli +# # Set AWS information +# - aws configure set aws_access_key_id $AWS_ACCESS_KEY +# - aws configure set aws_secret_access_key $AWS_SECRET_KEY +# - aws configure set default.region $AWS_REGION +# - aws configure set metadata_service_timeout 1200 +# - aws configure set metadata_service_num_attempts 3 +# - aws configure list # build images - docker-compose stop - docker-compose build --no-cache - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" -- docker image ls -- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:app_$TRAVIS_BUILD_ID -- docker tag $NGINX_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:nginx_$TRAVIS_BUILD_ID -- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:app_$TRAVIS_BUILD_ID -- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:nginx_$TRAVIS_BUILD_ID +- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_BUILD_ID +- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_BUILD_ID env: global: - APP_IMAGE_NAME=p5jswebeditor_app - - NGINX_IMAGE_NAME=p5jswebeditor_nginx \ No newline at end of file + +deploy: + provider: elasticbeanstalk + access_key_id: $AWS_ACCESS_KEY + secret_access_key: + secure: $AWS_SECRET_KEY + region: $AWS_REGION + app: $AWS_EBS_APP + env: $AWS_EBS_ENV + bucket_name: "the-target-S3-bucket" \ No newline at end of file diff --git a/server/Dockerrun.aws.json b/Dockerrun.aws.json similarity index 72% rename from server/Dockerrun.aws.json rename to Dockerrun.aws.json index 261d66c5..ba49309a 100644 --- a/server/Dockerrun.aws.json +++ b/Dockerrun.aws.json @@ -33,7 +33,7 @@ "mountPoints": [ { "sourceVolume": "storage", - "containerPath": "/var/lib/mysql" + "containerPath": "/var/opt/mongo" } ], "environment": [ @@ -64,10 +64,30 @@ "mountPoints": [ { "sourceVolume": "app", - "containerPath": "/var/www/html", + "containerPath": "/var/opt/app", "readOnly": true } ] + }, + { + "name": "nginx", + "essential": true, + "memory": 128, + "portMappings": [ + { + "hostPort": 80, + "containerPort": 8000 + } + ], + "links": [ + "app" + ], + "mountPoints": [ + { + "sourceVolume": "awseb-logs-nginx-proxy", + "containerPath": "/var/log/nginx" + } + ] } ] } \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 8db3575b..1533a45a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,19 +10,23 @@ services: ports: - '27017:27017' # restart: always - # env_file: - # - .env + env_file: + - .env nginx: - build: ./nginx + image: nginx:1.13 + volumes: + - "$PWD/nginx/alpha.editor.p5js.org.conf:/etc/nginx/conf.d/default.conf" ports: - '80:80' + depends_on: + - app app: build: context: . dockerfile: Dockerfile target: production - # env_file: - # - .env + env_file: + - .env environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - MONGO_HOSTNAME=mongo diff --git a/nginx/Dockerfile b/nginx/Dockerfile deleted file mode 100644 index cbe1e0b1..00000000 --- a/nginx/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:1.13.12 - -COPY alpha.editor.p5js.org.conf /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/nginx/nginx-aws.conf b/nginx/nginx-aws.conf deleted file mode 100644 index b0ab9feb..00000000 --- a/nginx/nginx-aws.conf +++ /dev/null @@ -1,122 +0,0 @@ -# For more information on configuration, see: -# * Official English Documentation: http://nginx.org/en/docs/ -# * Official Russian Documentation: http://nginx.org/ru/docs/ - -user nginx; -worker_processes auto; -error_log /var/log/nginx/error.log; -pid /var/run/nginx.pid; - -events { - worker_connections 1024; -} - -http { - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; - types_hash_max_size 2048; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - # Load modular configuration files from the /etc/nginx/conf.d directory. - # See http://nginx.org/en/docs/ngx_core_module.html#include - # for more information. - include /etc/nginx/conf.d/*.conf; - - include /etc/nginx/sites-enabled/*.conf; - - index index.html index.htm; - - server { - listen 80 default_server; - listen [::]:80 default_server; - server_name localhost; - root /usr/share/nginx/html; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location / { - } - - # redirect server error pages to the static page /40x.html - # - error_page 404 /404.html; - location = /40x.html { - } - - # redirect server error pages to the static page /50x.html - # - error_page 500 502 503 504 /50x.html; - location = /50x.html { - } - - # proxy the PHP scripts to Apache listening on 127.0.0.1:80 - # - #location ~ \.php$ { - # proxy_pass http://127.0.0.1; - #} - - # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 - # - #location ~ \.php$ { - # root html; - # fastcgi_pass 127.0.0.1:9000; - # fastcgi_index index.php; - # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; - # include fastcgi_params; - #} - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} - } - - -# Settings for a TLS enabled server. -# -# server { -# listen 443 ssl; -# listen [::]:443 ssl; -# server_name localhost; -# root /usr/share/nginx/html; -# -# ssl_certificate "/etc/pki/nginx/server.crt"; -# ssl_certificate_key "/etc/pki/nginx/private/server.key"; -# # It is *strongly* recommended to generate unique DH parameters -# # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 -# #ssl_dhparam "/etc/pki/nginx/dhparams.pem"; -# ssl_session_cache shared:SSL:1m; -# ssl_session_timeout 10m; -# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; -# ssl_ciphers HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP; -# ssl_prefer_server_ciphers on; -# -# # Load configuration files for the default server block. -# include /etc/nginx/default.d/*.conf; -# -# location / { -# } -# -# error_page 404 /404.html; -# location = /40x.html { -# } -# -# error_page 500 502 503 504 /50x.html; -# location = /50x.html { -# } -# } - -} \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf deleted file mode 100644 index 7d128192..00000000 --- a/nginx/nginx.conf +++ /dev/null @@ -1,122 +0,0 @@ -# For more information on configuration, see: -# * Official English Documentation: http://nginx.org/en/docs/ -# * Official Russian Documentation: http://nginx.org/ru/docs/ - -user nginx; -worker_processes auto; -error_log /var/log/nginx/error.log; -pid /var/run/nginx.pid; - -events { - worker_connections 1024; -} - -http { - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; - types_hash_max_size 2048; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - # Load modular configuration files from the /etc/nginx/conf.d directory. - # See http://nginx.org/en/docs/ngx_core_module.html#include - # for more information. - # include /etc/nginx/conf.d/*.conf; - - include /etc/nginx/sites-enabled/*.conf; - - # index index.html index.htm; - - # server { - # listen 80 default_server; - # listen [::]:80 default_server; - # server_name localhost; - # root /usr/share/nginx/html; - - # # Load configuration files for the default server block. - # include /etc/nginx/default.d/*.conf; - - # location / { - # } - - # # redirect server error pages to the static page /40x.html - # # - # error_page 404 /404.html; - # location = /40x.html { - # } - - # # redirect server error pages to the static page /50x.html - # # - # error_page 500 502 503 504 /50x.html; - # location = /50x.html { - # } - - # # proxy the PHP scripts to Apache listening on 127.0.0.1:80 - # # - # #location ~ \.php$ { - # # proxy_pass http://127.0.0.1; - # #} - - # # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 - # # - # #location ~ \.php$ { - # # root html; - # # fastcgi_pass 127.0.0.1:9000; - # # fastcgi_index index.php; - # # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; - # # include fastcgi_params; - # #} - - # # deny access to .htaccess files, if Apache's document root - # # concurs with nginx's one - # # - # #location ~ /\.ht { - # # deny all; - # #} - # } - - -# Settings for a TLS enabled server. -# -# server { -# listen 443 ssl; -# listen [::]:443 ssl; -# server_name localhost; -# root /usr/share/nginx/html; -# -# ssl_certificate "/etc/pki/nginx/server.crt"; -# ssl_certificate_key "/etc/pki/nginx/private/server.key"; -# # It is *strongly* recommended to generate unique DH parameters -# # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 -# #ssl_dhparam "/etc/pki/nginx/dhparams.pem"; -# ssl_session_cache shared:SSL:1m; -# ssl_session_timeout 10m; -# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; -# ssl_ciphers HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP; -# ssl_prefer_server_ciphers on; -# -# # Load configuration files for the default server block. -# include /etc/nginx/default.d/*.conf; -# -# location / { -# } -# -# error_page 404 /404.html; -# location = /40x.html { -# } -# -# error_page 500 502 503 504 /50x.html; -# location = /50x.html { -# } -# } - -} \ No newline at end of file From fa5a9e39b24fff52a11913b9756b3a9241c7bd60 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 26 Jun 2018 19:13:13 -0700 Subject: [PATCH 35/75] fix linting errors and do stuff to make build work --- .travis.yml | 18 +++++++++--------- docker-compose.yml | 8 ++++---- server/scripts/examples-gg-latest.js | 10 ++++++++-- server/scripts/examples.js | 10 ++++++++-- server/server.js | 10 ++++++++-- 5 files changed, 37 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1a6f47f4..e4768f10 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,12 +49,12 @@ env: global: - APP_IMAGE_NAME=p5jswebeditor_app -deploy: - provider: elasticbeanstalk - access_key_id: $AWS_ACCESS_KEY - secret_access_key: - secure: $AWS_SECRET_KEY - region: $AWS_REGION - app: $AWS_EBS_APP - env: $AWS_EBS_ENV - bucket_name: "the-target-S3-bucket" \ No newline at end of file +# deploy: +# provider: elasticbeanstalk +# access_key_id: $AWS_ACCESS_KEY +# secret_access_key: +# secure: $AWS_SECRET_KEY +# region: $AWS_REGION +# app: $AWS_EBS_APP +# env: $AWS_EBS_ENV +# bucket_name: "the-target-S3-bucket" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 1533a45a..4676f017 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,8 +10,8 @@ services: ports: - '27017:27017' # restart: always - env_file: - - .env + # env_file: + # - .env nginx: image: nginx:1.13 volumes: @@ -25,8 +25,8 @@ services: context: . dockerfile: Dockerfile target: production - env_file: - - .env + # env_file: + # - .env environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - MONGO_HOSTNAME=mongo diff --git a/server/scripts/examples-gg-latest.js b/server/scripts/examples-gg-latest.js index 52f66b1b..64885a66 100644 --- a/server/scripts/examples-gg-latest.js +++ b/server/scripts/examples-gg-latest.js @@ -68,11 +68,17 @@ const headers = { 'User-Agent': 'p5js-web-editor/0.0.1' }; let mongoConnectionString; if (process.env.NODE_ENV === 'production') { - const { MONGO_RW_USERNAME, MONGO_RW_PASSWORD, MONGO_HOSTNAME, MONGO_PORT, MONGO_NAME } = process.env; + const { + MONGO_RW_USERNAME, + MONGO_RW_PASSWORD, + MONGO_HOSTNAME, + MONGO_PORT, + MONGO_NAME + } = process.env; const muo = new URL(`mongodb://${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_NAME}`); muo.username = MONGO_RW_USERNAME; muo.password = MONGO_RW_PASSWORD; - mongoConnectionString = muo.href + "?authSource=admin"; + mongoConnectionString = `${muo.href}?authSource=admin`; } else { mongoConnectionString = process.env.MONGO_URL; } diff --git a/server/scripts/examples.js b/server/scripts/examples.js index 51841b2a..3bac39e7 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -38,11 +38,17 @@ const headers = { 'User-Agent': 'p5js-web-editor/0.0.1' }; let mongoConnectionString; if (process.env.NODE_ENV === 'production') { - const { MONGO_RW_USERNAME, MONGO_RW_PASSWORD, MONGO_HOSTNAME, MONGO_PORT, MONGO_NAME } = process.env; + const { + MONGO_RW_USERNAME, + MONGO_RW_PASSWORD, + MONGO_HOSTNAME, + MONGO_PORT, + MONGO_NAME + } = process.env; const muo = new URL(`mongodb://${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_NAME}`); muo.username = MONGO_RW_USERNAME; muo.password = MONGO_RW_PASSWORD; - mongoConnectionString = muo.href + "?authSource=admin"; + mongoConnectionString = `${muo.href}?authSource=admin`; } else { mongoConnectionString = process.env.MONGO_URL; } diff --git a/server/server.js b/server/server.js index 4e471e29..12e2ac3b 100644 --- a/server/server.js +++ b/server/server.js @@ -47,11 +47,17 @@ if (process.env.NODE_ENV === 'development') { let mongoConnectionString; if (process.env.NODE_ENV === 'production') { - const { MONGO_RW_USERNAME, MONGO_RW_PASSWORD, MONGO_HOSTNAME, MONGO_PORT, MONGO_NAME } = process.env; + const { + MONGO_RW_USERNAME, + MONGO_RW_PASSWORD, + MONGO_HOSTNAME, + MONGO_PORT, + MONGO_NAME + } = process.env; const muo = new URL(`mongodb://${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_NAME}`); muo.username = MONGO_RW_USERNAME; muo.password = MONGO_RW_PASSWORD; - mongoConnectionString = muo.href + "?authSource=admin"; + mongoConnectionString = `${muo.href}?authSource=admin`; } else { mongoConnectionString = process.env.MONGO_URL; } From 97acbf19787b94bb3d2b68e46f28a1aa68d09e26 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 2 Jul 2018 18:08:00 -0700 Subject: [PATCH 36/75] change tag to docker hub to latest --- .travis.yml | 14 +------ Dockerrun.aws.json | 93 ---------------------------------------------- docker-cloud.yml | 40 ++++++++++++++++++++ docker-compose.yml | 4 +- 4 files changed, 44 insertions(+), 107 deletions(-) delete mode 100644 Dockerrun.aws.json create mode 100644 docker-cloud.yml diff --git a/.travis.yml b/.travis.yml index e4768f10..3e54ea9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,19 +42,9 @@ after_success: - docker-compose stop - docker-compose build --no-cache - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" -- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_BUILD_ID -- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_BUILD_ID +- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest +- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest env: global: - APP_IMAGE_NAME=p5jswebeditor_app - -# deploy: -# provider: elasticbeanstalk -# access_key_id: $AWS_ACCESS_KEY -# secret_access_key: -# secure: $AWS_SECRET_KEY -# region: $AWS_REGION -# app: $AWS_EBS_APP -# env: $AWS_EBS_ENV -# bucket_name: "the-target-S3-bucket" \ No newline at end of file diff --git a/Dockerrun.aws.json b/Dockerrun.aws.json deleted file mode 100644 index ba49309a..00000000 --- a/Dockerrun.aws.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "AWSEBDockerrunVersion": 2, - "authentication": { - "bucket": "", - "key": ".dockercfg" - }, - "volumes": [ - { - "name": "storage", - "host": { - "sourcePath": "/var/data" - } - }, - { - "name": "app", - "host": { - "sourcePath": "/var/app/current/app" - } - } - ], - "containerDefinitions": [ - { - "name": "mongo", - "image": "mongo:3.4", - "essential": true, - "memory": 512, - "portMappings": [ - { - "hostPort": 27017, - "containerPort": 27017 - } - ], - "mountPoints": [ - { - "sourceVolume": "storage", - "containerPath": "/var/opt/mongo" - } - ], - "environment": [ - { - "name": "MYSQL_ROOT_PASSWORD", - "value": "password" - }, - { - "name": "MYSQL_DATABASE", - "value": "my_db" - } - ] - }, - { - "name": "app", - "image": ":", - "essential": true, - "memory": 256, - "portMappings": [ - { - "hostPort": 80, - "containerPort": 80 - } - ], - "links": [ - "db" - ], - "mountPoints": [ - { - "sourceVolume": "app", - "containerPath": "/var/opt/app", - "readOnly": true - } - ] - }, - { - "name": "nginx", - "essential": true, - "memory": 128, - "portMappings": [ - { - "hostPort": 80, - "containerPort": 8000 - } - ], - "links": [ - "app" - ], - "mountPoints": [ - { - "sourceVolume": "awseb-logs-nginx-proxy", - "containerPath": "/var/log/nginx" - } - ] - } - ] -} \ No newline at end of file diff --git a/docker-cloud.yml b/docker-cloud.yml new file mode 100644 index 00000000..82502897 --- /dev/null +++ b/docker-cloud.yml @@ -0,0 +1,40 @@ +version: '3.4' +services: + mongo: + image: mongo:3.4 + volumes: + - dbdata:/data/db + - "$PWD/mongo/:/docker-entrypoint-initdb.d/" + ports: + - '27017:27017' + environment: + - MONGO_INITDB_ROOT_USERNAME + - MONGO_INITDB_ROOT_PASSWORD + - MONGO_INITDB_DATABASE + - MONGO_RW_USERNAME + - MONGO_RW_PASSWORD + nginx: + image: nginx:1.13 + volumes: + - "$PWD/nginx/alpha.editor.p5js.org.conf:/etc/nginx/conf.d/default.conf" + ports: + - '80:80' + links: + - app + app: + image: catarak/p5.js-web-editor + environment: + - MONGO_URL=mongodb://mongo:27017/p5js-web-editor + - MONGO_HOSTNAME=mongo + # - API_URL=https://localhost/api + # - PORT=80 + volumes: + - .:/opt/node/app + - /opt/node/app/node_modules + ports: + - '8000:8000' + # - '443:443' + links: + - mongo +volumes: + dbdata: diff --git a/docker-compose.yml b/docker-compose.yml index 4676f017..5d518c9a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ services: - '27017:27017' # restart: always # env_file: - # - .env + # - "$PWD/.env" nginx: image: nginx:1.13 volumes: @@ -26,7 +26,7 @@ services: dockerfile: Dockerfile target: production # env_file: - # - .env + # - "$PWD/.env" environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - MONGO_HOSTNAME=mongo From 6b560fb9043570c4c122540120958a8bc40fe0d1 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 3 Jul 2018 12:04:49 -0700 Subject: [PATCH 37/75] in process changes to start kubernetes --- docker-cloud.yml | 40 +++++++++++++++++++++++++++++++++------- docker-compose.yml | 2 ++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/docker-cloud.yml b/docker-cloud.yml index 82502897..14cacb6b 100644 --- a/docker-cloud.yml +++ b/docker-cloud.yml @@ -8,11 +8,11 @@ services: ports: - '27017:27017' environment: - - MONGO_INITDB_ROOT_USERNAME - - MONGO_INITDB_ROOT_PASSWORD - - MONGO_INITDB_DATABASE - - MONGO_RW_USERNAME - - MONGO_RW_PASSWORD + - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME} + - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD} + - MONGO_INITDB_DATABASE=${MONGO_INITDB_DATABASE} + - MONGO_RW_USERNAME=${MONGO_RW_USERNAME} + - MONGO_RW_PASSWORD=${MONGO_RW_PASSWORD} nginx: image: nginx:1.13 volumes: @@ -23,11 +23,37 @@ services: - app app: image: catarak/p5.js-web-editor + # this is so infuriating that i have to map EVERY ENV VARIABLE environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - MONGO_HOSTNAME=mongo - # - API_URL=https://localhost/api - # - PORT=80 + - MONGO_PORT=${MONGO_PORT} + - MONGO_NAME=${MONGO_NAME} + - PORT=${PORT} + - SESSION_SECRET=${SESSION_SECRET} + - AWS_ACCESS_KEY=${AWS_ACCESS_KEY} + - AWS_SECRET_KEY=${AWS_SECRET_KEY} + - S3_BUCKET=${S3_BUCKET} + - AWS_REGION=${AWS_REGION} + - GITHUB_ID=${GITHUB_ID} + - GITHUB_SECRET=${GITHUB_SECRET} + - MAILGUN_DOMAIN=${MAILGUN_DOMAIN} + - MAILGUN_KEY=${MAILGUN_KEY} + - EMAIL_SENDER=${EMAIL_SENDER} + - EMAIL_VERIFY_SECRET_TOKEN=${EMAIL_VERIFY_SECRET_TOKEN} + - S3_BUCKET_URL_BASE=${S3_BUCKET_URL_BASE} + - GG_EXAMPLES_USERNAME=${GG_EXAMPLES_USERNAME} + - GG_EXAMPLES_PASS=${GG_EXAMPLES_PASS} + - GG_EXAMPLES_EMAIL=${GG_EXAMPLES_EMAIL} + - GOOGLE_ID=${GOOGLE_ID} + - GOOGLE_SECRET=${GOOGLE_SECRET} + - EXAMPLE_USER_EMAIL=${EXAMPLE_USER_EMAIL} + - EXAMPLE_USER_PASSWORD=${EXAMPLE_USER_PASSWORD} + - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME} + - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD} + - MONGO_INITDB_DATABASE=${MONGO_INITDB_DATABASE} + - MONGO_RW_USERNAME=${MONGO_RW_USERNAME} + - MONGO_RW_PASSWORD=${MONGO_RW_PASSWORD} volumes: - .:/opt/node/app - /opt/node/app/node_modules diff --git a/docker-compose.yml b/docker-compose.yml index 5d518c9a..bfd6baf1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,6 +20,8 @@ services: - '80:80' depends_on: - app + links: + - app app: build: context: . From d53ed3c16b68678748242a9340eb8847e611ae63 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 26 Jul 2018 13:18:21 -0400 Subject: [PATCH 38/75] start to add kubernetes configuration --- kubernetes/app.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 kubernetes/app.yml diff --git a/kubernetes/app.yml b/kubernetes/app.yml new file mode 100644 index 00000000..13277b78 --- /dev/null +++ b/kubernetes/app.yml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Deployment +spec: + selector: + matchLabels: + app: web-editor + replicas: 1 + template: + metadata: + app: web-editor + spec: + containers: + - name: web-editor-app + image: From 549d622c6f266de5291392676517b36e428476c3 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 9 Aug 2018 13:58:48 -0400 Subject: [PATCH 39/75] more config for kubernetes, fix example fetching tasks to include node env --- docker-compose.yml | 8 +++--- kubernetes/app.yml | 40 +++++++++++++++++++++++++--- package.json | 8 +++--- server/scripts/examples-gg-latest.js | 2 +- server/scripts/examples.js | 2 +- server/server.js | 2 +- 6 files changed, 48 insertions(+), 14 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index bfd6baf1..71140233 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,8 +10,8 @@ services: ports: - '27017:27017' # restart: always - # env_file: - # - "$PWD/.env" + env_file: + - "$PWD/.env" nginx: image: nginx:1.13 volumes: @@ -27,8 +27,8 @@ services: context: . dockerfile: Dockerfile target: production - # env_file: - # - "$PWD/.env" + env_file: + - "$PWD/.env" environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - MONGO_HOSTNAME=mongo diff --git a/kubernetes/app.yml b/kubernetes/app.yml index 13277b78..69eac2ba 100644 --- a/kubernetes/app.yml +++ b/kubernetes/app.yml @@ -1,5 +1,23 @@ apiVersion: v1 +kind: Service +metadata: + name: web-editor-node + labels: + app: web-editor +spec: + # if your cluster supports it, uncomment the following to automatically create + # an external load-balanced IP for the frontend service. + type: LoadBalancer + ports: + - port: 80 + targetPort: 8000 + selector: + app: web-editor +--- +apiVersion: apps/v1 kind: Deployment +metadata: + name: web-editor-node spec: selector: matchLabels: @@ -7,8 +25,24 @@ spec: replicas: 1 template: metadata: - app: web-editor + labels: + app: web-editor spec: containers: - - name: web-editor-app - image: + - name: web-editor-app + image: index.docker.io/catarak/p5.js-web-editor:latest + # temp, just to test kubernetes + # envFrom: + # - configMapRef: + # name: web-editor-env + envFrom: + - secretRef: + name: web-editor-credentials + imagePullPolicy: Always + resources: + requests: + cpu: 100m + memory: 100Mi + ports: + - containerPort: 8000 + diff --git a/package.json b/package.json index c270dcc5..c9c206ec 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,10 @@ "build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js", "build:examples": "cross-env NODE_ENV=production webpack --config webpack.config.examples.js", "test": "npm run lint", - "fetch-examples": "node ./server/scripts/fetch-examples.js", - "fetch-examples-gg": "node ./server/scripts/fetch-examples-gg.js", - "fetch-examples:prod": "node ./dist/fetch-examples.bundle.js", - "fetch-examples-gg:prod": "node ./dist/fetch-examples.bundle.js", + "fetch-examples": "cross-env NODE_ENV=development node ./server/scripts/fetch-examples.js", + "fetch-examples-gg": "cross-env NODE_ENV=development node ./server/scripts/fetch-examples-gg.js", + "fetch-examples:prod": "cross-env NODE_ENV=production node ./dist/fetch-examples.bundle.js", + "fetch-examples-gg:prod": "cross-env NODE_ENV=production node ./dist/fetch-examples.bundle.js", "ssl-proxy": "local-ssl-proxy --source 443 --target 80 &" }, "main": "index.js", diff --git a/server/scripts/examples-gg-latest.js b/server/scripts/examples-gg-latest.js index 64885a66..251c5315 100644 --- a/server/scripts/examples-gg-latest.js +++ b/server/scripts/examples-gg-latest.js @@ -78,7 +78,7 @@ if (process.env.NODE_ENV === 'production') { const muo = new URL(`mongodb://${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_NAME}`); muo.username = MONGO_RW_USERNAME; muo.password = MONGO_RW_PASSWORD; - mongoConnectionString = `${muo.href}?authSource=admin`; + mongoConnectionString = `${muo.href}`; } else { mongoConnectionString = process.env.MONGO_URL; } diff --git a/server/scripts/examples.js b/server/scripts/examples.js index 3bac39e7..2bdf37ce 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -48,7 +48,7 @@ if (process.env.NODE_ENV === 'production') { const muo = new URL(`mongodb://${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_NAME}`); muo.username = MONGO_RW_USERNAME; muo.password = MONGO_RW_PASSWORD; - mongoConnectionString = `${muo.href}?authSource=admin`; + mongoConnectionString = `${muo.href}`; } else { mongoConnectionString = process.env.MONGO_URL; } diff --git a/server/server.js b/server/server.js index 12e2ac3b..bae5ff5b 100644 --- a/server/server.js +++ b/server/server.js @@ -57,7 +57,7 @@ if (process.env.NODE_ENV === 'production') { const muo = new URL(`mongodb://${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_NAME}`); muo.username = MONGO_RW_USERNAME; muo.password = MONGO_RW_PASSWORD; - mongoConnectionString = `${muo.href}?authSource=admin`; + mongoConnectionString = `${muo.href}`; } else { mongoConnectionString = process.env.MONGO_URL; } From 27c9ea8939ab4a1f59c3a2da22bfc61b85c24e3f Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 9 Aug 2018 14:12:17 -0400 Subject: [PATCH 40/75] remove references to .env in docker-compose --- docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 71140233..bfd6baf1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,8 +10,8 @@ services: ports: - '27017:27017' # restart: always - env_file: - - "$PWD/.env" + # env_file: + # - "$PWD/.env" nginx: image: nginx:1.13 volumes: @@ -27,8 +27,8 @@ services: context: . dockerfile: Dockerfile target: production - env_file: - - "$PWD/.env" + # env_file: + # - "$PWD/.env" environment: - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - MONGO_HOSTNAME=mongo From a1b9d394d7a40278aeee07af84b57104a91ecf44 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 9 Aug 2018 14:23:21 -0400 Subject: [PATCH 41/75] try regenerating package-lock.json --- package-lock.json | 1000 ++++++++++++++++++++++++++++----------------- 1 file changed, 623 insertions(+), 377 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23b7a646..dd2e5013 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,13 +78,14 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "kind-of": "3.2.2", "longest": "1.0.1", "repeat-string": "1.6.1" } }, "amdefine": { - "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", "dev": true }, @@ -95,11 +96,13 @@ "dev": true }, "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" }, "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "anymatch": { @@ -452,9 +455,13 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { - "version": "0.2.3", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } }, "asn1.js": { "version": "4.10.1", @@ -589,8 +596,8 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "chalk": "1.1.3", + "esutils": "2.0.2", "js-tokens": "3.0.2" } }, @@ -616,8 +623,8 @@ "minimatch": "3.0.4", "path-is-absolute": "1.0.1", "private": "0.1.8", - "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "slash": "1.0.0", + "source-map": "0.5.6" }, "dependencies": { "babel-code-frame": { @@ -625,8 +632,8 @@ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "chalk": "1.1.3", + "esutils": "2.0.2", "js-tokens": "3.0.2" } }, @@ -641,7 +648,7 @@ "detect-indent": "4.0.0", "jsesc": "1.3.0", "lodash": "4.17.4", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "trim-right": "1.0.1" } }, @@ -672,7 +679,7 @@ "core-js": "2.5.3", "home-or-tmp": "2.0.0", "lodash": "4.17.4", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "source-map-support": "0.4.18" }, "dependencies": { @@ -688,7 +695,7 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "core-js": "2.4.1", "regenerator-runtime": "0.11.1" } }, @@ -726,7 +733,7 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "esutils": "2.0.2", "lodash": "4.17.4", "to-fast-properties": "1.0.3" } @@ -747,7 +754,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { "balanced-match": "1.0.0", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "concat-map": "0.0.1" } }, "convert-source-map": { @@ -781,8 +788,8 @@ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.1" } }, "invariant": { @@ -790,7 +797,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz" + "loose-envify": "1.2.0" } }, "js-tokens": { @@ -846,7 +853,7 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + "is-finite": "1.0.2" } }, "source-map-support": { @@ -854,7 +861,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "source-map": "0.5.6" } }, "to-fast-properties": { @@ -1196,7 +1203,7 @@ "requires": { "find-cache-dir": "1.0.0", "loader-utils": "1.1.0", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "mkdirp": "0.5.1" } }, "babel-messages": { @@ -10261,7 +10268,7 @@ "dev": true, "requires": { "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "esutils": "2.0.2", "lodash": "4.17.4", "to-fast-properties": "1.0.3" } @@ -10385,7 +10392,7 @@ "resolved": "https://registry.npmjs.org/native-or-lie/-/native-or-lie-1.0.2.tgz", "integrity": "sha1-yHDuC6C/D/ETUFldIWz+poptgIY=", "requires": { - "lie": "https://registry.npmjs.org/lie/-/lie-3.1.0.tgz" + "lie": "3.1.0" } } } @@ -10567,7 +10574,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "1.0.0", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "concat-map": "0.0.1" } }, "braces": { @@ -10592,7 +10599,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -10703,7 +10710,8 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { - "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { @@ -10792,14 +10800,15 @@ } }, "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "chardet": { @@ -10945,7 +10954,7 @@ "requires": { "for-own": "1.0.0", "is-plain-object": "2.0.4", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "kind-of": "3.2.2", "shallow-clone": "0.1.2" }, "dependencies": { @@ -10955,7 +10964,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + "for-in": "1.0.2" } } } @@ -10966,7 +10975,8 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codemirror": { @@ -11029,7 +11039,8 @@ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { @@ -11201,11 +11212,13 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" }, "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cors": { @@ -13457,7 +13470,8 @@ } }, "decamelize": { - "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { @@ -13547,13 +13561,14 @@ "is-path-cwd": "1.0.0", "is-path-in-cwd": "1.0.1", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", "rimraf": "2.6.2" } }, "delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, @@ -13593,7 +13608,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" + "esutils": "2.0.2" } }, "dom-walk": { @@ -13617,12 +13632,14 @@ "integrity": "sha1-SLC48q0JKHLktTW2cqfD8aHWfJE=" }, "ecc-jsbn": { - "version": "0.1.1", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "electron-to-chromium": { @@ -13652,7 +13669,8 @@ "dev": true }, "emojis-list": { - "version": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "encoding": { @@ -13825,7 +13843,7 @@ "espree": "3.5.4", "esquery": "1.0.1", "estraverse": "4.2.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "esutils": "2.0.2", "file-entry-cache": "2.0.0", "functional-red-black-tree": "1.0.1", "glob": "7.1.2", @@ -13839,7 +13857,7 @@ "levn": "0.3.0", "lodash": "4.17.4", "minimatch": "3.0.4", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "natural-compare": "1.4.0", "optionator": "0.8.2", "path-is-inside": "1.0.2", @@ -14429,7 +14447,8 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "event-emitter": { @@ -14482,7 +14501,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -14951,7 +14970,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -15143,7 +15162,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -15160,11 +15179,12 @@ } }, "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "2.0.1" } }, "flat-cache": { @@ -15180,7 +15200,8 @@ } }, "for-in": { - "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "foreach": { @@ -15227,7 +15248,8 @@ } }, "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, @@ -15243,21 +15265,25 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { "delegates": "1.0.0", @@ -15266,11 +15292,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -15278,29 +15306,35 @@ }, "chownr": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "optional": true }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "optional": true, "requires": { "ms": "2.0.0" @@ -15308,22 +15342,26 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "optional": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "optional": true, "requires": { "minipass": "2.2.4" @@ -15331,12 +15369,14 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { "aproba": "1.2.0", @@ -15351,7 +15391,8 @@ }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "optional": true, "requires": { "fs.realpath": "1.0.0", @@ -15364,12 +15405,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, "iconv-lite": { "version": "0.4.21", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "optional": true, "requires": { "safer-buffer": "2.1.2" @@ -15377,7 +15420,8 @@ }, "ignore-walk": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "optional": true, "requires": { "minimatch": "3.0.4" @@ -15385,7 +15429,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "optional": true, "requires": { "once": "1.4.0", @@ -15394,39 +15439,46 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "1.0.1" } }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.11" } }, "minimist": { "version": "0.0.8", - "bundled": true + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { "version": "2.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", + "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "requires": { "safe-buffer": "5.1.1", "yallist": "3.0.2" @@ -15434,7 +15486,8 @@ }, "minizlib": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "optional": true, "requires": { "minipass": "2.2.4" @@ -15442,14 +15495,16 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "optional": true }, "nan": { @@ -15460,7 +15515,8 @@ }, "needle": { "version": "2.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", + "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", "optional": true, "requires": { "debug": "2.6.9", @@ -15470,7 +15526,8 @@ }, "node-pre-gyp": { "version": "0.9.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz", + "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=", "optional": true, "requires": { "detect-libc": "1.0.3", @@ -15487,7 +15544,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { "abbrev": "1.1.1", @@ -15496,12 +15554,14 @@ }, "npm-bundled": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", + "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", "optional": true }, "npm-packlist": { "version": "1.1.10", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", + "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", "optional": true, "requires": { "ignore-walk": "3.0.1", @@ -15510,7 +15570,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "optional": true, "requires": { "are-we-there-yet": "1.1.4", @@ -15521,33 +15582,39 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1.0.2" } }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "optional": true, "requires": { "os-homedir": "1.0.2", @@ -15556,17 +15623,20 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "optional": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "optional": true }, "rc": { "version": "1.2.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "optional": true, "requires": { "deep-extend": "0.4.2", @@ -15577,14 +15647,16 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "optional": true } } }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "optional": true, "requires": { "core-util-is": "1.0.2", @@ -15598,7 +15670,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "optional": true, "requires": { "glob": "7.1.2" @@ -15606,36 +15679,43 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "optional": true }, "semver": { "version": "5.5.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -15644,7 +15724,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "optional": true, "requires": { "safe-buffer": "5.1.1" @@ -15652,19 +15733,22 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "2.1.1" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "optional": true }, "tar": { "version": "4.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", + "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", "optional": true, "requires": { "chownr": "1.0.1", @@ -15678,12 +15762,14 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "optional": true }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { "string-width": "1.0.2" @@ -15691,11 +15777,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "yallist": { "version": "3.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" } } }, @@ -15707,7 +15795,7 @@ "requires": { "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "rimraf": "2.6.2" } }, @@ -15733,8 +15821,8 @@ "has-unicode": "2.0.1", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", "signal-exit": "3.0.2", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", "wide-align": "1.1.2" } }, @@ -15801,11 +15889,11 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "fs.realpath": "1.0.0", "inflight": "1.0.6", "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "minimatch": "3.0.4", - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "once": "1.3.3", "path-is-absolute": "1.0.1" } }, @@ -15853,8 +15941,8 @@ "arrify": "1.0.1", "glob": "7.1.2", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "globule": { @@ -15878,10 +15966,10 @@ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "chalk": "1.1.3", "commander": "2.15.1", "is-my-json-valid": "2.17.2", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "2.0.1" } }, "has": { @@ -15894,10 +15982,11 @@ } }, "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + "ansi-regex": "2.0.0" } }, "has-flag": { @@ -15940,7 +16029,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "1.1.6" } } } @@ -16422,7 +16511,8 @@ "dev": true }, "immediate": { - "version": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, "imurmurhash": { @@ -16462,8 +16552,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "once": "1.3.3", + "wrappy": "1.0.2" } }, "inherits": { @@ -16593,7 +16683,8 @@ } }, "invert-kv": { - "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "is-accessor-descriptor": { @@ -16601,7 +16692,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "is-arrayish": { @@ -16618,7 +16709,8 @@ } }, "is-buffer": { - "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" }, "is-builtin-module": { @@ -16626,7 +16718,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + "builtin-modules": "1.1.1" } }, "is-callable": { @@ -16640,7 +16732,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "is-date-object": { @@ -16667,7 +16759,8 @@ } }, "is-extendable": { - "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { @@ -16676,17 +16769,19 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { - "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + "number-is-nan": "1.0.0" } }, "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + "number-is-nan": "1.0.0" } }, "is-glob": { @@ -16721,7 +16816,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "is-odd": { @@ -16843,7 +16938,8 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { - "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, @@ -17470,6 +17566,7 @@ }, "json-schema": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, @@ -17558,10 +17655,11 @@ } }, "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "1.1.6" } }, "klaw": { @@ -17588,10 +17686,11 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lcid": { - "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + "invert-kv": "1.0.0" } }, "levn": { @@ -17605,10 +17704,11 @@ } }, "lie": { - "version": "https://registry.npmjs.org/lie/-/lie-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.0.tgz", "integrity": "sha1-ZeATnq75rnkaH1yMU2ksjTtHGPQ=", "requires": { - "immediate": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + "immediate": "3.0.6" } }, "load-json-file": { @@ -17618,8 +17718,8 @@ "requires": { "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "parse-json": "2.2.0", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", "strip-bom": "2.0.0" }, "dependencies": { @@ -17721,7 +17821,7 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "emojis-list": "2.1.0", "json5": "0.5.1" } }, @@ -17859,14 +17959,16 @@ "version": "github:catarak/loop-protect#2691548c37c7883e6d72f01ce1724de37b6f9692" }, "loose-envify": { - "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", "integrity": "sha1-aaZarT3lQs9O4PT+dOjjPHCcyw8=", "requires": { - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz" + "js-tokens": "1.0.3" }, "dependencies": { "js-tokens": { - "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" } } @@ -18430,7 +18532,7 @@ "dev": true, "requires": { "camelcase-keys": "2.1.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "decamelize": "1.2.0", "loud-rejection": "1.6.0", "map-obj": "1.0.1", "minimist": "1.2.0", @@ -18538,7 +18640,8 @@ } }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { @@ -18546,7 +18649,7 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "for-in": "1.0.2", "is-extendable": "1.0.1" }, "dependencies": { @@ -18567,7 +18670,7 @@ "dev": true, "requires": { "for-in": "0.1.8", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" }, "dependencies": { "for-in": { @@ -18973,12 +19076,14 @@ "dependencies": { "abbrev": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", "optional": true }, "ajv": { "version": "4.11.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "optional": true, "requires": { "co": "4.6.0", @@ -18987,16 +19092,19 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { "delegates": "1.0.0", @@ -19005,36 +19113,43 @@ }, "asn1": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "optional": true }, "assert-plus": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "optional": true }, "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "optional": true }, "aws-sign2": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "optional": true }, "aws4": { "version": "1.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "optional": true }, "balanced-match": { "version": "0.4.2", - "bundled": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { "tweetnacl": "0.14.5" @@ -19042,21 +19157,24 @@ }, "block-stream": { "version": "0.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { "inherits": "2.0.3" } }, "boom": { "version": "2.10.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { "hoek": "2.16.3" } }, "brace-expansion": { "version": "1.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", "requires": { "balanced-match": "0.4.2", "concat-map": "0.0.1" @@ -19064,51 +19182,61 @@ }, "buffer-shims": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, "caseless": { "version": "0.12.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "optional": true }, "co": { "version": "4.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "combined-stream": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "1.0.0" } }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cryptiles": { "version": "2.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { "boom": "2.10.1" } }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "optional": true, "requires": { "assert-plus": "1.0.0" @@ -19116,14 +19244,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "debug": { "version": "2.6.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", "optional": true, "requires": { "ms": "2.0.0" @@ -19131,26 +19261,31 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "optional": true }, "delayed-stream": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, "detect-libc": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", + "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", "optional": true }, "ecc-jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { "jsbn": "0.1.1" @@ -19158,21 +19293,25 @@ }, "extend": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "optional": true }, "extsprintf": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "optional": true }, "form-data": { "version": "2.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "optional": true, "requires": { "asynckit": "0.4.0", @@ -19182,11 +19321,13 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fstream": { "version": "1.0.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { "graceful-fs": "4.1.11", "inherits": "2.0.3", @@ -19196,7 +19337,8 @@ }, "fstream-ignore": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "optional": true, "requires": { "fstream": "1.0.11", @@ -19206,7 +19348,8 @@ }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { "aproba": "1.1.1", @@ -19221,7 +19364,8 @@ }, "getpass": { "version": "0.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "optional": true, "requires": { "assert-plus": "1.0.0" @@ -19229,14 +19373,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -19248,16 +19394,19 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "har-schema": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", "optional": true }, "har-validator": { "version": "4.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "optional": true, "requires": { "ajv": "4.11.8", @@ -19266,12 +19415,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, "hawk": { "version": "3.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -19281,11 +19432,13 @@ }, "hoek": { "version": "2.16.3", - "bundled": true + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "http-signature": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "optional": true, "requires": { "assert-plus": "0.2.0", @@ -19295,7 +19448,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -19303,37 +19457,44 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "1.0.1" } }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "optional": true }, "isarray": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "optional": true }, "jodid25519": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "optional": true, "requires": { "jsbn": "0.1.1" @@ -19341,17 +19502,20 @@ }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "optional": true }, "json-stable-stringify": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "optional": true, "requires": { "jsonify": "0.0.0" @@ -19359,17 +19523,20 @@ }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "optional": true }, "jsonify": { "version": "0.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "optional": true }, "jsprim": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", "optional": true, "requires": { "assert-plus": "1.0.0", @@ -19380,48 +19547,56 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "mime-db": { "version": "1.27.0", - "bundled": true + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" }, "mime-types": { "version": "2.1.15", - "bundled": true, + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", "requires": { "mime-db": "1.27.0" } }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "optional": true }, "node-pre-gyp": { "version": "0.6.39", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", + "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", "optional": true, "requires": { "detect-libc": "1.0.2", @@ -19439,7 +19614,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { "abbrev": "1.1.0", @@ -19448,7 +19624,8 @@ }, "npmlog": { "version": "4.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", "optional": true, "requires": { "are-we-there-yet": "1.1.4", @@ -19459,38 +19636,45 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.8.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1.0.2" } }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "optional": true }, "osenv": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "optional": true, "requires": { "os-homedir": "1.0.2", @@ -19499,30 +19683,36 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "performance-now": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", "optional": true }, "process-nextick-args": { "version": "1.0.7", - "bundled": true + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "punycode": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "optional": true }, "qs": { "version": "6.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", "optional": true }, "rc": { "version": "1.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", "optional": true, "requires": { "deep-extend": "0.4.2", @@ -19533,14 +19723,16 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "optional": true } } }, "readable-stream": { "version": "2.2.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "requires": { "buffer-shims": "1.0.0", "core-util-is": "1.0.2", @@ -19553,7 +19745,8 @@ }, "request": { "version": "2.81.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "optional": true, "requires": { "aws-sign2": "0.6.0", @@ -19582,40 +19775,47 @@ }, "rimraf": { "version": "2.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { "glob": "7.1.2" } }, "safe-buffer": { "version": "5.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "semver": { "version": "5.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, "sntp": { "version": "1.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { "hoek": "2.16.3" } }, "sshpk": { "version": "1.13.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", "optional": true, "requires": { "asn1": "0.2.3", @@ -19631,14 +19831,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -19647,31 +19849,36 @@ }, "string_decoder": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", "requires": { "safe-buffer": "5.0.1" } }, "stringstream": { "version": "0.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "optional": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "2.1.1" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "optional": true }, "tar": { "version": "2.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { "block-stream": "0.0.9", "fstream": "1.0.11", @@ -19680,7 +19887,8 @@ }, "tar-pack": { "version": "3.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", "optional": true, "requires": { "debug": "2.6.8", @@ -19695,7 +19903,8 @@ }, "tough-cookie": { "version": "2.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "optional": true, "requires": { "punycode": "1.4.1" @@ -19703,7 +19912,8 @@ }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "optional": true, "requires": { "safe-buffer": "5.0.1" @@ -19711,26 +19921,31 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "uid-number": { "version": "0.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "optional": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", "optional": true }, "verror": { "version": "1.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "optional": true, "requires": { "extsprintf": "1.0.2" @@ -19738,7 +19953,8 @@ }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { "string-width": "1.0.2" @@ -19746,7 +19962,8 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" } } }, @@ -21140,10 +21357,11 @@ } }, "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "minimist": "0.0.8" } }, "moment": { @@ -21418,7 +21636,7 @@ "glob": "7.1.2", "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "minimatch": "3.0.4", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "nopt": "3.0.6", "npmlog": "4.1.2", "osenv": "0.1.5", @@ -21454,7 +21672,7 @@ "os-browserify": "0.3.0", "path-browserify": "0.0.0", "process": "0.11.10", - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "punycode": "1.4.1", "querystring-es3": "0.2.1", "readable-stream": "2.3.6", "stream-browserify": "2.0.1", @@ -21481,7 +21699,7 @@ "dev": true, "requires": { "async-foreach": "0.1.3", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "chalk": "1.1.3", "cross-spawn": "3.0.1", "gaze": "1.1.2", "get-stdin": "4.0.1", @@ -21491,7 +21709,7 @@ "lodash.clonedeep": "4.5.0", "lodash.mergewith": "4.6.1", "meow": "3.7.0", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "nan": "2.10.0", "node-gyp": "3.6.2", "npmlog": "4.1.2", @@ -22117,7 +22335,7 @@ "optional": true, "requires": { "nan": "2.3.5", - "node-pre-gyp": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.25.tgz" + "node-pre-gyp": "0.6.25" }, "dependencies": { "ansi": { @@ -22232,7 +22450,7 @@ "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", "dev": true, "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "inherits": "2.0.1" } }, "boom": { @@ -22405,8 +22623,8 @@ "dev": true, "requires": { "graceful-fs": "4.1.3", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "inherits": "2.0.1", + "mkdirp": "0.5.1", "rimraf": "2.5.2" } }, @@ -22418,7 +22636,7 @@ "optional": true, "requires": { "fstream": "1.0.8", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "inherits": "2.0.1", "minimatch": "3.0.0" }, "dependencies": { @@ -22569,7 +22787,8 @@ } }, "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true }, @@ -22734,16 +22953,18 @@ } }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "minimist": "0.0.8" } }, "ms": { @@ -22761,12 +22982,13 @@ "optional": true }, "node-pre-gyp": { - "version": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.25.tgz", + "version": "0.6.25", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.25.tgz", "integrity": "sha1-LGgYd15vHfXjU7qAJPHAEYcmVFs=", "dev": true, "optional": true, "requires": { - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "nopt": "3.0.6", "npmlog": "2.0.3", "rc": "1.1.6", @@ -22893,7 +23115,7 @@ "dev": true, "requires": { "core-util-is": "1.0.2", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "inherits": "2.0.1", "isarray": "1.0.0", "process-nextick-args": "1.0.6", "string_decoder": "0.10.31", @@ -23116,7 +23338,7 @@ "requires": { "block-stream": "0.0.8", "fstream": "1.0.8", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "inherits": "2.0.1" } }, "tar-pack": { @@ -24246,7 +24468,7 @@ "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", - "semver": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "semver": "5.0.3", "validate-npm-package-license": "3.0.1" } }, @@ -24271,7 +24493,8 @@ } }, "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" }, "oauth": { @@ -24296,7 +24519,7 @@ "requires": { "copy-descriptor": "0.1.1", "define-property": "0.2.5", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -24342,11 +24565,12 @@ } }, "once": { - "version": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "dev": true, "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "wrappy": "1.0.2" } }, "onetime": { @@ -24386,18 +24610,21 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { - "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + "lcid": "1.0.0" } }, "os-tmpdir": { - "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=" }, "osenv": { @@ -24406,8 +24633,8 @@ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.1" } }, "p-limit": { @@ -24580,7 +24807,7 @@ "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "2.0.1" } }, "path-is-absolute": { @@ -24606,8 +24833,8 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pbkdf2": { @@ -24623,18 +24850,21 @@ } }, "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -26265,7 +26495,8 @@ } }, "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "pure-color": { @@ -27259,7 +27490,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "find-up": "1.1.2", "read-pkg": "1.1.0" } }, @@ -27268,13 +27499,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", "process-nextick-args": "2.0.0", "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" }, "dependencies": { "inherits": { @@ -27646,7 +27877,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + "is-finite": "1.0.2" } }, "request": { @@ -28271,6 +28502,12 @@ "ret": "0.1.15" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sass-graph": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", @@ -28295,8 +28532,8 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", "wrap-ansi": "2.1.0" } }, @@ -28308,16 +28545,16 @@ "requires": { "camelcase": "3.0.0", "cliui": "3.2.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "decamelize": "1.2.0", "get-caller-file": "1.0.2", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "os-locale": "1.4.0", "read-pkg-up": "1.0.1", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "string-width": "1.0.2", "which-module": "1.0.0", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "y18n": "3.2.1", "yargs-parser": "5.0.0" } } @@ -28358,7 +28595,7 @@ "dev": true, "requires": { "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "emojis-list": "2.1.0", "json5": "0.5.1" } }, @@ -28395,13 +28632,14 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + "amdefine": "1.0.0" } } } }, "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=" }, "set-blocking": { @@ -28420,7 +28658,7 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "requires": { "extend-shallow": "2.0.1", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-extendable": "0.1.1", "is-plain-object": "2.0.4", "split-string": "3.1.0" }, @@ -28430,7 +28668,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -28455,7 +28693,7 @@ "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", "dev": true, "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-extendable": "0.1.1", "kind-of": "2.0.1", "lazy-cache": "0.2.7", "mixin-object": "2.0.1" @@ -28467,7 +28705,7 @@ "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "1.1.6" } }, "lazy-cache": { @@ -28507,7 +28745,8 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { - "version": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { @@ -28542,7 +28781,7 @@ "define-property": "0.2.5", "extend-shallow": "2.0.1", "map-cache": "0.2.2", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "source-map-resolve": "0.5.1", "use": "3.1.0" }, @@ -28560,7 +28799,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -28621,7 +28860,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "sntp": { @@ -28639,7 +28878,8 @@ "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" }, "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" }, "source-map-resolve": { @@ -28702,11 +28942,11 @@ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { - "asn1": "0.2.3", + "asn1": "0.2.4", "assert-plus": "1.0.0", "bcrypt-pbkdf": "1.0.1", "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", + "ecc-jsbn": "0.1.2", "getpass": "0.1.7", "jsbn": "0.1.1", "tweetnacl": "0.14.5" @@ -28775,12 +29015,13 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -28798,10 +29039,11 @@ "dev": true }, "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + "ansi-regex": "2.0.0" } }, "strip-indent": { @@ -28869,7 +29111,8 @@ } }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "symbol-observable": { @@ -29046,7 +29289,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "to-regex": { @@ -29075,7 +29318,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "punycode": "1.4.1" } }, "trim-newlines": { @@ -29107,7 +29350,7 @@ "inflight": "1.0.6", "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "minimatch": "3.0.4", - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "once": "1.3.3", "path-is-absolute": "1.0.1" } } @@ -29156,7 +29399,7 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "uglify-to-browserify": "1.0.2", "yargs": "3.10.0" }, @@ -29168,7 +29411,7 @@ "requires": { "camelcase": "1.2.1", "cliui": "2.1.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -29185,7 +29428,7 @@ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "uglify-js": "2.8.29", "webpack-sources": "1.0.2" } @@ -29202,7 +29445,7 @@ "requires": { "arr-union": "3.1.0", "get-value": "2.0.6", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-extendable": "0.1.1", "set-value": "0.4.3" }, "dependencies": { @@ -29211,7 +29454,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } }, "set-value": { @@ -29220,7 +29463,7 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { "extend-shallow": "2.0.1", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-extendable": "0.1.1", "is-plain-object": "2.0.4", "to-object-path": "0.3.0" } @@ -29360,7 +29603,8 @@ } }, "util-deprecate": { - "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { @@ -29389,7 +29633,7 @@ "dev": true, "requires": { "assert-plus": "1.0.0", - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "core-util-is": "1.0.2", "extsprintf": "1.3.0" }, "dependencies": { @@ -29460,9 +29704,9 @@ "loader-runner": "2.3.0", "loader-utils": "1.1.0", "memory-fs": "0.4.1", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "node-libs-browser": "2.1.0", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "supports-color": "3.2.3", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", @@ -29503,7 +29747,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + "amdefine": "1.0.0" } } } @@ -29665,7 +29909,7 @@ "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", "dev": true, "requires": { - "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "isexe": "2.0.0" } }, "which-module": { @@ -29679,7 +29923,7 @@ "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", "dev": true, "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + "string-width": "1.0.2" } }, "window-size": { @@ -29702,12 +29946,13 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" } }, "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, @@ -29717,7 +29962,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "mkdirp": "0.5.1" } }, "xhr": { @@ -29803,7 +30048,8 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { - "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yargs": { @@ -29813,16 +30059,16 @@ "requires": { "camelcase": "3.0.0", "cliui": "3.2.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "decamelize": "1.2.0", "get-caller-file": "1.0.2", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "os-locale": "1.4.0", "read-pkg-up": "1.0.1", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "string-width": "1.0.2", "which-module": "1.0.0", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "y18n": "3.2.1", "yargs-parser": "4.2.1" }, "dependencies": { @@ -29836,8 +30082,8 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", "wrap-ansi": "2.1.0" } }, From b25f0d3ab5cb4cdc64df8ac5f518bcff77a5fb64 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 9 Aug 2018 15:43:44 -0400 Subject: [PATCH 42/75] add ability to disable FORCE_TO_HTTPS in prod --- webpack.config.prod.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 2f02835e..2ea0b31f 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -89,7 +89,10 @@ module.exports = { NODE_ENV: JSON.stringify('production'), S3_BUCKET: process.env.S3_BUCKET ? `"${process.env.S3_BUCKET}"` : undefined, S3_BUCKET_URL_BASE: process.env.S3_BUCKET_URL_BASE ? `"${process.env.S3_BUCKET_URL_BASE}"` : undefined, - AWS_REGION: process.env.AWS_REGION ? `"${process.env.AWS_REGION}"` : undefined + AWS_REGION: process.env.AWS_REGION ? `"${process.env.AWS_REGION}"` : undefined, + FORCE_TO_HTTPS: process.env.FORCE_TO_HTTPS === 'false' ? + JSON.stringify(false) : + undefined } }), new webpack.optimize.CommonsChunkPlugin({ From 8f912fe8ce23328f04440f81dc9d6818c20eb9bd Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 9 Aug 2018 16:43:51 -0400 Subject: [PATCH 43/75] fix webpack configuration to create source map --- webpack.config.prod.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 2ea0b31f..6e12644d 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -109,6 +109,7 @@ module.exports = { manifestVariable: 'webpackManifest', }), new webpack.optimize.UglifyJsPlugin({ + sourceMap: true, compress: { warnings: false } From c4b676d7546b95f546c013e89e9052021a2428e4 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 10 Aug 2018 17:11:04 -0400 Subject: [PATCH 44/75] fix Dockerfile and docker-compose.yml so that image will hopefully build correctly on travis --- Dockerfile | 14 ++++++++------ docker-compose.yml | 41 +++++++++++++++++++++++++++++++++++++---- mongo/init.sh | 2 +- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 654a4090..d0082250 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,8 +4,8 @@ ENV APP_HOME=/usr/src/app \ RUN mkdir -p $APP_HOME WORKDIR $APP_HOME EXPOSE 8000 -EXPOSE 80 -EXPOSE 443 +# EXPOSE 80 +# EXPOSE 443 FROM base as development ENV NODE_ENV development @@ -23,14 +23,16 @@ RUN npm run build FROM base as production ENV NODE_ENV=production -COPY package.json package-lock.json ./ +COPY package.json package-lock.json index.js ./ RUN npm install --production RUN npm rebuild node-sass -RUN npm install pm2 -g +# RUN npm install pm2 -g # RUN npm install local-ssl-proxy -COPY index.js ecosystem.json ./ +# COPY index.js ecosystem.json ./ COPY --from=build /usr/src/app/dist ./dist # for reg production -CMD ["pm2-runtime", "ecosystem.json"] +CMD ["npm", "run", "start:prod"] +# for production with pm2 +# CMD ["pm2-runtime", "ecosystem.json"] # for testing ssl locally # CMD npm run ssl-proxy && pm2-runtime ecosystem.json diff --git a/docker-compose.yml b/docker-compose.yml index bfd6baf1..ac5f4ee6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,12 @@ services: # restart: always # env_file: # - "$PWD/.env" + environment: + - MONGO_INITDB_ROOT_USERNAME + - MONGO_INITDB_ROOT_PASSWORD + - MONGO_INITDB_DATABASE + - MONGO_RW_USERNAME + - MONGO_RW_PASSWORD nginx: image: nginx:1.13 volumes: @@ -30,10 +36,37 @@ services: # env_file: # - "$PWD/.env" environment: - - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - - MONGO_HOSTNAME=mongo - # - API_URL=https://localhost/api - # - PORT=80 + - API_URL + - MONGO_URL + - MONGO_NAME + - PORT + - SESSION_SECRET + - AWS_ACCESS_KEY + - AWS_SECRET_KEY + - S3_BUCKET + - AWS_REGION + - GITHUB_ID + - GITHUB_SECRET + - MAILGUN_DOMAIN + - MAILGUN_KEY + - EMAIL_SENDER + - EMAIL_VERIFY_SECRET_TOKEN + - S3_BUCKET_URL_BASE + - GG_EXAMPLES_USERNAME + - GG_EXAMPLES_PASS + - GG_EXAMPLES_EMAIL + - GOOGLE_ID + - GOOGLE_SECRET + - EXAMPLE_USER_EMAIL + - EXAMPLE_USER_PASSWORD + - MONGO_INITDB_ROOT_USERNAME + - MONGO_INITDB_ROOT_PASSWORD + - MONGO_INITDB_DATABASE + - MONGO_RW_USERNAME + - MONGO_RW_PASSWORD + - MONGO_HOSTNAME + - MONGO_PORT + - FORCE_TO_HTTPS volumes: - .:/opt/node/app - /opt/node/app/node_modules diff --git a/mongo/init.sh b/mongo/init.sh index c574d6b4..eb241f09 100644 --- a/mongo/init.sh +++ b/mongo/init.sh @@ -1 +1 @@ -mongo admin -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval "db.createUser({ user: '$MONGO_RW_USERNAME', pwd: '$MONGO_RW_PASSWORD', roles: [ { role: 'readWrite', db: '$MONGO_INITDB_DATABASE' }, { role: 'readWrite', db: 'sessions' }] })" \ No newline at end of file +mongo $MONGO_INITDB_DATABASE -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --authenticationDatabase admin --eval "db.createUser({ user: '$MONGO_RW_USERNAME', pwd: '$MONGO_RW_PASSWORD', roles: [ { role: 'readWrite', db: '$MONGO_INITDB_DATABASE' }, { role: 'readWrite', db: 'sessions' }] })" \ No newline at end of file From 66d24fcbfa40b3ff6efdec12b87c20399099b99c Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 13 Aug 2018 14:24:02 -0400 Subject: [PATCH 45/75] try to get some insight on why env variables aren't being build into image on travis --- .travis.yml | 1 + docker-compose.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 3e54ea9f..116516c7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,6 +41,7 @@ after_success: # build images - docker-compose stop - docker-compose build --no-cache +- docker container ls - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" - docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest - docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest diff --git a/docker-compose.yml b/docker-compose.yml index ac5f4ee6..e9e50f5a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,6 +33,7 @@ services: context: . dockerfile: Dockerfile target: production + # image: index.docker.io/catarak/p5.js-web-editor:latest # env_file: # - "$PWD/.env" environment: From b06c874a0086cde1aa65602def4ff215a0f36e61 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 13 Aug 2018 15:28:44 -0400 Subject: [PATCH 46/75] this time actually execute the right docker command --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 116516c7..a442f80c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,7 +41,7 @@ after_success: # build images - docker-compose stop - docker-compose build --no-cache -- docker container ls +- docker image ls - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" - docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest - docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest From ba051c2f3174f08f08f89a6cf28c0a36b46fbbe8 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 13 Aug 2018 16:12:25 -0400 Subject: [PATCH 47/75] try adding args to the build process and maybe this fixes it --- docker-compose.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index e9e50f5a..fcbfb7e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,6 +33,13 @@ services: context: . dockerfile: Dockerfile target: production + args: + - API_URL + - NODE_ENV + - S3_BUCKET + - AWS_REGION + - S3_BUCKET_URL_BASE + - FORCE_TO_HTTPS # image: index.docker.io/catarak/p5.js-web-editor:latest # env_file: # - "$PWD/.env" From 7f9a435a7f2345aa6767f5149a18e6f74321d98b Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 13 Aug 2018 16:40:51 -0400 Subject: [PATCH 48/75] add args to Dockerfile --- Dockerfile | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Dockerfile b/Dockerfile index d0082250..73d09545 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,17 @@ WORKDIR $APP_HOME EXPOSE 8000 # EXPOSE 80 # EXPOSE 443 +ARG API_URL +ARG S3_BUCKET +ARG AWS_REGION +ARG S3_BUCKET_URL_BASE +ARG FORCE_TO_HTTPS + +ENV API_URL=$API_URL +ENV S3_BUCKET=$S3_BUCKET +ENV AWS_REGION=$AWS_REGION +ENV S3_BUCKET_URL_BASE=$S3_BUCKET_URL_BASE +ENV FORCE_TO_HTTPS=$FORCE_TO_HTTPS FROM base as development ENV NODE_ENV development From dcb72b9b0b00fe45dc8bb025ee8766d73e1199a6 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 20 Aug 2018 12:06:53 -0400 Subject: [PATCH 49/75] continue to develop kubernetes setup --- docker-compose.yml | 28 ++++++++++++++-------------- kubernetes/app.yml | 18 ++++++++++++++++-- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index fcbfb7e2..e00a0ef5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,20 +29,20 @@ services: links: - app app: - build: - context: . - dockerfile: Dockerfile - target: production - args: - - API_URL - - NODE_ENV - - S3_BUCKET - - AWS_REGION - - S3_BUCKET_URL_BASE - - FORCE_TO_HTTPS - # image: index.docker.io/catarak/p5.js-web-editor:latest - # env_file: - # - "$PWD/.env" + # build: + # context: . + # dockerfile: Dockerfile + # target: production + # args: + # - API_URL + # - NODE_ENV + # - S3_BUCKET + # - AWS_REGION + # - S3_BUCKET_URL_BASE + # - FORCE_TO_HTTPS + image: index.docker.io/catarak/p5.js-web-editor:latest + env_file: + - "$PWD/.env" environment: - API_URL - MONGO_URL diff --git a/kubernetes/app.yml b/kubernetes/app.yml index 69eac2ba..fc31f37f 100644 --- a/kubernetes/app.yml +++ b/kubernetes/app.yml @@ -1,3 +1,16 @@ +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: editor-ingress + annotations: + kubernetes.io/ingress.global-static-ip-name: "test-web-editor" +spec: + tls: + - secretName: sslcerts + backend: + serviceName: web-editor-node + servicePort: 8000 +--- apiVersion: v1 kind: Service metadata: @@ -7,9 +20,10 @@ metadata: spec: # if your cluster supports it, uncomment the following to automatically create # an external load-balanced IP for the frontend service. - type: LoadBalancer + # type: LoadBalancer + type: NodePort ports: - - port: 80 + - port: 8000 targetPort: 8000 selector: app: web-editor From bd476d3d381b91481fe80ebefaa8a177b94301b0 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 21 Aug 2018 16:09:41 -0400 Subject: [PATCH 50/75] add basic auth to server for beta editor setup --- kubernetes/app.yml | 2 - package-lock.json | 1031 ++++++++++++++++++++++++++--------------- package.json | 1 + server/server.js | 11 + webpack.config.dev.js | 2 + 5 files changed, 659 insertions(+), 388 deletions(-) diff --git a/kubernetes/app.yml b/kubernetes/app.yml index fc31f37f..3919aada 100644 --- a/kubernetes/app.yml +++ b/kubernetes/app.yml @@ -5,8 +5,6 @@ metadata: annotations: kubernetes.io/ingress.global-static-ip-name: "test-web-editor" spec: - tls: - - secretName: sslcerts backend: serviceName: web-editor-node servicePort: 8000 diff --git a/package-lock.json b/package-lock.json index 7847efb7..d5bd4a73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.51.tgz", "integrity": "sha1-2AK3tUO1g2x3iqaReXq/APPZfqk=", "requires": { - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "esutils": "2.0.2", "lodash": "4.17.10", "to-fast-properties": "2.0.0" }, @@ -179,13 +179,14 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "kind-of": "3.2.2", "longest": "1.0.1", "repeat-string": "1.6.1" } }, "amdefine": { - "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", "dev": true }, @@ -196,11 +197,13 @@ "dev": true }, "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" }, "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "anymatch": { @@ -552,9 +555,13 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { - "version": "0.2.3", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } }, "asn1.js": { "version": "4.10.1", @@ -688,8 +695,8 @@ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "chalk": "1.1.3", + "esutils": "2.0.2", "js-tokens": "3.0.2" } }, @@ -715,8 +722,8 @@ "minimatch": "3.0.4", "path-is-absolute": "1.0.1", "private": "0.1.8", - "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "slash": "1.0.0", + "source-map": "0.5.6" }, "dependencies": { "babel-code-frame": { @@ -724,8 +731,8 @@ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "chalk": "1.1.3", + "esutils": "2.0.2", "js-tokens": "3.0.2" } }, @@ -740,7 +747,7 @@ "detect-indent": "4.0.0", "jsesc": "1.3.0", "lodash": "4.17.4", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "trim-right": "1.0.1" } }, @@ -771,7 +778,7 @@ "core-js": "2.5.3", "home-or-tmp": "2.0.0", "lodash": "4.17.4", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "source-map-support": "0.4.18" }, "dependencies": { @@ -787,7 +794,7 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "core-js": "2.4.1", "regenerator-runtime": "0.11.1" } }, @@ -825,7 +832,7 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "esutils": "2.0.2", "lodash": "4.17.4", "to-fast-properties": "1.0.3" } @@ -846,7 +853,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { "balanced-match": "1.0.0", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "concat-map": "0.0.1" } }, "convert-source-map": { @@ -880,8 +887,8 @@ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.1" } }, "invariant": { @@ -889,7 +896,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz" + "loose-envify": "1.2.0" } }, "js-tokens": { @@ -945,7 +952,7 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + "is-finite": "1.0.2" } }, "source-map-support": { @@ -953,7 +960,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "source-map": "0.5.6" } }, "to-fast-properties": { @@ -1331,7 +1338,7 @@ "requires": { "find-cache-dir": "1.0.0", "loader-utils": "1.1.0", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "mkdirp": "0.5.1" } }, "babel-messages": { @@ -1366,7 +1373,7 @@ "babel-plugin-syntax-jsx": "6.18.0", "convert-source-map": "1.5.1", "find-root": "1.1.0", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "source-map": "0.5.7", "touch": "1.0.0" }, @@ -1393,7 +1400,7 @@ "minimatch": "3.0.4", "path-is-absolute": "1.0.1", "private": "0.1.8", - "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "slash": "1.0.0", "source-map": "0.5.7" } }, @@ -1407,7 +1414,7 @@ "core-js": "2.5.7", "home-or-tmp": "2.0.0", "lodash": "4.17.4", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "source-map-support": "0.4.18" } }, @@ -10477,7 +10484,7 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "esutils": "2.0.2", "lodash": "4.17.4", "to-fast-properties": "1.0.3" } @@ -10557,6 +10564,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, + "basic-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", + "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" + }, "bcrypt-nodejs": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", @@ -10600,7 +10612,7 @@ "resolved": "https://registry.npmjs.org/native-or-lie/-/native-or-lie-1.0.2.tgz", "integrity": "sha1-yHDuC6C/D/ETUFldIWz+poptgIY=", "requires": { - "lie": "https://registry.npmjs.org/lie/-/lie-3.1.0.tgz" + "lie": "3.1.0" } } } @@ -10787,7 +10799,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "1.0.0", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "concat-map": "0.0.1" } }, "braces": { @@ -10812,7 +10824,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -10923,7 +10935,8 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { - "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { @@ -11021,14 +11034,15 @@ } }, "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "chardet": { @@ -11174,7 +11188,7 @@ "requires": { "for-own": "1.0.0", "is-plain-object": "2.0.4", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "kind-of": "3.2.2", "shallow-clone": "0.1.2" }, "dependencies": { @@ -11184,7 +11198,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + "for-in": "1.0.2" } } } @@ -11195,7 +11209,8 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codemirror": { @@ -11258,7 +11273,8 @@ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { @@ -11447,11 +11463,13 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" }, "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cors": { @@ -13751,7 +13769,8 @@ } }, "decamelize": { - "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { @@ -13841,13 +13860,14 @@ "is-path-cwd": "1.0.0", "is-path-in-cwd": "1.0.1", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", "rimraf": "2.6.2" } }, "delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, @@ -13895,7 +13915,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" + "esutils": "2.0.2" } }, "dom-walk": { @@ -13919,12 +13939,14 @@ "integrity": "sha1-SLC48q0JKHLktTW2cqfD8aHWfJE=" }, "ecc-jsbn": { - "version": "0.1.1", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "electron-to-chromium": { @@ -13954,7 +13976,8 @@ "dev": true }, "emojis-list": { - "version": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "emotion": { @@ -14144,7 +14167,7 @@ "espree": "3.5.4", "esquery": "1.0.1", "estraverse": "4.2.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "esutils": "2.0.2", "file-entry-cache": "2.0.0", "functional-red-black-tree": "1.0.1", "glob": "7.1.2", @@ -14158,7 +14181,7 @@ "levn": "0.3.0", "lodash": "4.17.4", "minimatch": "3.0.4", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "natural-compare": "1.4.0", "optionator": "0.8.2", "path-is-inside": "1.0.2", @@ -14747,7 +14770,8 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "event-emitter": { @@ -14800,7 +14824,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -15122,6 +15146,14 @@ } } }, + "express-basic-auth": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.1.5.tgz", + "integrity": "sha512-mDp1yMjZbCzH7Ixp8k20TyYiNgUdEso8XwUglWHbFZwivX32c5pbB24wcGL+feWXLqinJCvGvuuJSqLih+MV/g==", + "requires": { + "basic-auth": "1.1.0" + } + }, "express-session": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.13.0.tgz", @@ -15269,7 +15301,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -15461,7 +15493,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -15483,11 +15515,12 @@ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "2.0.1" } }, "flat-cache": { @@ -15503,7 +15536,8 @@ } }, "for-in": { - "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "foreach": { @@ -15550,7 +15584,8 @@ } }, "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, @@ -15566,21 +15601,25 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { "delegates": "1.0.0", @@ -15589,11 +15628,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -15601,29 +15642,35 @@ }, "chownr": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "optional": true }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "optional": true, "requires": { "ms": "2.0.0" @@ -15631,22 +15678,26 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "optional": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "optional": true, "requires": { "minipass": "2.2.4" @@ -15654,12 +15705,14 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { "aproba": "1.2.0", @@ -15674,7 +15727,8 @@ }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "optional": true, "requires": { "fs.realpath": "1.0.0", @@ -15687,12 +15741,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, "iconv-lite": { "version": "0.4.21", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "optional": true, "requires": { "safer-buffer": "2.1.2" @@ -15700,7 +15756,8 @@ }, "ignore-walk": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "optional": true, "requires": { "minimatch": "3.0.4" @@ -15708,7 +15765,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "optional": true, "requires": { "once": "1.4.0", @@ -15717,39 +15775,46 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "1.0.1" } }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.11" } }, "minimist": { "version": "0.0.8", - "bundled": true + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { "version": "2.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", + "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "requires": { "safe-buffer": "5.1.1", "yallist": "3.0.2" @@ -15757,7 +15822,8 @@ }, "minizlib": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "optional": true, "requires": { "minipass": "2.2.4" @@ -15765,14 +15831,16 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "optional": true }, "nan": { @@ -15783,7 +15851,8 @@ }, "needle": { "version": "2.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", + "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", "optional": true, "requires": { "debug": "2.6.9", @@ -15793,7 +15862,8 @@ }, "node-pre-gyp": { "version": "0.9.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz", + "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=", "optional": true, "requires": { "detect-libc": "1.0.3", @@ -15810,7 +15880,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { "abbrev": "1.1.1", @@ -15819,12 +15890,14 @@ }, "npm-bundled": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", + "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", "optional": true }, "npm-packlist": { "version": "1.1.10", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", + "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", "optional": true, "requires": { "ignore-walk": "3.0.1", @@ -15833,7 +15906,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "optional": true, "requires": { "are-we-there-yet": "1.1.4", @@ -15844,33 +15918,39 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1.0.2" } }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "optional": true, "requires": { "os-homedir": "1.0.2", @@ -15879,17 +15959,20 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "optional": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "optional": true }, "rc": { "version": "1.2.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "optional": true, "requires": { "deep-extend": "0.4.2", @@ -15900,14 +15983,16 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "optional": true } } }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "optional": true, "requires": { "core-util-is": "1.0.2", @@ -15921,7 +16006,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "optional": true, "requires": { "glob": "7.1.2" @@ -15929,36 +16015,43 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "optional": true }, "semver": { "version": "5.5.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -15967,7 +16060,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "optional": true, "requires": { "safe-buffer": "5.1.1" @@ -15975,19 +16069,22 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "2.1.1" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "optional": true }, "tar": { "version": "4.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", + "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", "optional": true, "requires": { "chownr": "1.0.1", @@ -16001,12 +16098,14 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "optional": true }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { "string-width": "1.0.2" @@ -16014,11 +16113,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "yallist": { "version": "3.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" } } }, @@ -16030,7 +16131,7 @@ "requires": { "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "rimraf": "2.6.2" } }, @@ -16056,8 +16157,8 @@ "has-unicode": "2.0.1", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", "signal-exit": "3.0.2", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", "wide-align": "1.1.2" } }, @@ -16124,11 +16225,11 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "fs.realpath": "1.0.0", "inflight": "1.0.6", "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "minimatch": "3.0.4", - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "once": "1.3.3", "path-is-absolute": "1.0.1" } }, @@ -16175,8 +16276,8 @@ "arrify": "1.0.1", "glob": "7.1.2", "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "globule": { @@ -16215,10 +16316,10 @@ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "chalk": "1.1.3", "commander": "2.15.1", "is-my-json-valid": "2.17.2", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "2.0.1" } }, "has": { @@ -16231,10 +16332,11 @@ } }, "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + "ansi-regex": "2.0.0" } }, "has-flag": { @@ -16277,7 +16379,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "1.1.6" } } } @@ -16366,8 +16468,8 @@ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.1" } }, "hosted-git-info": { @@ -16768,7 +16870,8 @@ "dev": true }, "immediate": { - "version": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, "imurmurhash": { @@ -16808,8 +16911,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "once": "1.3.3", + "wrappy": "1.0.2" } }, "inherits": { @@ -16939,7 +17042,8 @@ } }, "invert-kv": { - "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "is-accessor-descriptor": { @@ -16947,7 +17051,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "is-arrayish": { @@ -16964,7 +17068,8 @@ } }, "is-buffer": { - "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" }, "is-builtin-module": { @@ -16972,7 +17077,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + "builtin-modules": "1.1.1" } }, "is-callable": { @@ -16986,7 +17091,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "is-date-object": { @@ -17023,7 +17128,8 @@ "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" }, "is-extendable": { - "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { @@ -17032,17 +17138,19 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { - "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + "number-is-nan": "1.0.0" } }, "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + "number-is-nan": "1.0.0" } }, "is-glob": { @@ -17077,7 +17185,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "is-odd": { @@ -17199,7 +17307,8 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { - "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, @@ -17836,6 +17945,7 @@ }, "json-schema": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, @@ -17924,10 +18034,11 @@ } }, "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "1.1.6" } }, "klaw": { @@ -17954,10 +18065,11 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lcid": { - "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + "invert-kv": "1.0.0" } }, "levn": { @@ -17971,10 +18083,11 @@ } }, "lie": { - "version": "https://registry.npmjs.org/lie/-/lie-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.0.tgz", "integrity": "sha1-ZeATnq75rnkaH1yMU2ksjTtHGPQ=", "requires": { - "immediate": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + "immediate": "3.0.6" } }, "linkifyjs": { @@ -17994,8 +18107,8 @@ "requires": { "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "parse-json": "2.2.0", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", "strip-bom": "2.0.0" }, "dependencies": { @@ -18097,7 +18210,7 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "emojis-list": "2.1.0", "json5": "0.5.1" } }, @@ -18235,14 +18348,16 @@ "version": "github:catarak/loop-protect#2691548c37c7883e6d72f01ce1724de37b6f9692" }, "loose-envify": { - "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", "integrity": "sha1-aaZarT3lQs9O4PT+dOjjPHCcyw8=", "requires": { - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz" + "js-tokens": "1.0.3" }, "dependencies": { "js-tokens": { - "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" } } @@ -18811,7 +18926,7 @@ "dev": true, "requires": { "camelcase-keys": "2.1.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "decamelize": "1.2.0", "loud-rejection": "1.6.0", "map-obj": "1.0.1", "minimist": "1.2.0", @@ -18919,7 +19034,8 @@ } }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { @@ -18927,7 +19043,7 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "for-in": "1.0.2", "is-extendable": "1.0.1" }, "dependencies": { @@ -18948,7 +19064,7 @@ "dev": true, "requires": { "for-in": "0.1.8", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" }, "dependencies": { "for-in": { @@ -19354,12 +19470,14 @@ "dependencies": { "abbrev": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", "optional": true }, "ajv": { "version": "4.11.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "optional": true, "requires": { "co": "4.6.0", @@ -19368,16 +19486,19 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { "delegates": "1.0.0", @@ -19386,36 +19507,43 @@ }, "asn1": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "optional": true }, "assert-plus": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "optional": true }, "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "optional": true }, "aws-sign2": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "optional": true }, "aws4": { "version": "1.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "optional": true }, "balanced-match": { "version": "0.4.2", - "bundled": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { "tweetnacl": "0.14.5" @@ -19423,21 +19551,24 @@ }, "block-stream": { "version": "0.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { "inherits": "2.0.3" } }, "boom": { "version": "2.10.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { "hoek": "2.16.3" } }, "brace-expansion": { "version": "1.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", "requires": { "balanced-match": "0.4.2", "concat-map": "0.0.1" @@ -19445,51 +19576,61 @@ }, "buffer-shims": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, "caseless": { "version": "0.12.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "optional": true }, "co": { "version": "4.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "combined-stream": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "1.0.0" } }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cryptiles": { "version": "2.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { "boom": "2.10.1" } }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "optional": true, "requires": { "assert-plus": "1.0.0" @@ -19497,14 +19638,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "debug": { "version": "2.6.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", "optional": true, "requires": { "ms": "2.0.0" @@ -19512,26 +19655,31 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "optional": true }, "delayed-stream": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, "detect-libc": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", + "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", "optional": true }, "ecc-jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { "jsbn": "0.1.1" @@ -19539,21 +19687,25 @@ }, "extend": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "optional": true }, "extsprintf": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "optional": true }, "form-data": { "version": "2.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "optional": true, "requires": { "asynckit": "0.4.0", @@ -19563,11 +19715,13 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fstream": { "version": "1.0.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { "graceful-fs": "4.1.11", "inherits": "2.0.3", @@ -19577,7 +19731,8 @@ }, "fstream-ignore": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "optional": true, "requires": { "fstream": "1.0.11", @@ -19587,7 +19742,8 @@ }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { "aproba": "1.1.1", @@ -19602,7 +19758,8 @@ }, "getpass": { "version": "0.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "optional": true, "requires": { "assert-plus": "1.0.0" @@ -19610,14 +19767,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -19629,16 +19788,19 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "har-schema": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", "optional": true }, "har-validator": { "version": "4.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "optional": true, "requires": { "ajv": "4.11.8", @@ -19647,12 +19809,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, "hawk": { "version": "3.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -19662,11 +19826,13 @@ }, "hoek": { "version": "2.16.3", - "bundled": true + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "http-signature": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "optional": true, "requires": { "assert-plus": "0.2.0", @@ -19676,7 +19842,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -19684,37 +19851,44 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "1.0.1" } }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "optional": true }, "isarray": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "optional": true }, "jodid25519": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "optional": true, "requires": { "jsbn": "0.1.1" @@ -19722,17 +19896,20 @@ }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "optional": true }, "json-stable-stringify": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "optional": true, "requires": { "jsonify": "0.0.0" @@ -19740,17 +19917,20 @@ }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "optional": true }, "jsonify": { "version": "0.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "optional": true }, "jsprim": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", "optional": true, "requires": { "assert-plus": "1.0.0", @@ -19761,48 +19941,56 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "mime-db": { "version": "1.27.0", - "bundled": true + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" }, "mime-types": { "version": "2.1.15", - "bundled": true, + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", "requires": { "mime-db": "1.27.0" } }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "optional": true }, "node-pre-gyp": { "version": "0.6.39", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", + "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", "optional": true, "requires": { "detect-libc": "1.0.2", @@ -19820,7 +20008,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { "abbrev": "1.1.0", @@ -19829,7 +20018,8 @@ }, "npmlog": { "version": "4.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", "optional": true, "requires": { "are-we-there-yet": "1.1.4", @@ -19840,38 +20030,45 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.8.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1.0.2" } }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "optional": true }, "osenv": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "optional": true, "requires": { "os-homedir": "1.0.2", @@ -19880,30 +20077,36 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "performance-now": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", "optional": true }, "process-nextick-args": { "version": "1.0.7", - "bundled": true + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "punycode": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "optional": true }, "qs": { "version": "6.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", "optional": true }, "rc": { "version": "1.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", "optional": true, "requires": { "deep-extend": "0.4.2", @@ -19914,14 +20117,16 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "optional": true } } }, "readable-stream": { "version": "2.2.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "requires": { "buffer-shims": "1.0.0", "core-util-is": "1.0.2", @@ -19934,7 +20139,8 @@ }, "request": { "version": "2.81.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "optional": true, "requires": { "aws-sign2": "0.6.0", @@ -19963,40 +20169,47 @@ }, "rimraf": { "version": "2.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { "glob": "7.1.2" } }, "safe-buffer": { "version": "5.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "semver": { "version": "5.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, "sntp": { "version": "1.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { "hoek": "2.16.3" } }, "sshpk": { "version": "1.13.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", "optional": true, "requires": { "asn1": "0.2.3", @@ -20012,14 +20225,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -20028,31 +20243,36 @@ }, "string_decoder": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", "requires": { "safe-buffer": "5.0.1" } }, "stringstream": { "version": "0.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "optional": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "2.1.1" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "optional": true }, "tar": { "version": "2.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { "block-stream": "0.0.9", "fstream": "1.0.11", @@ -20061,7 +20281,8 @@ }, "tar-pack": { "version": "3.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", "optional": true, "requires": { "debug": "2.6.8", @@ -20076,7 +20297,8 @@ }, "tough-cookie": { "version": "2.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "optional": true, "requires": { "punycode": "1.4.1" @@ -20084,7 +20306,8 @@ }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "optional": true, "requires": { "safe-buffer": "5.0.1" @@ -20092,26 +20315,31 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "uid-number": { "version": "0.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "optional": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", "optional": true }, "verror": { "version": "1.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "optional": true, "requires": { "extsprintf": "1.0.2" @@ -20119,7 +20347,8 @@ }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { "string-width": "1.0.2" @@ -20127,7 +20356,8 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" } } }, @@ -21521,10 +21751,11 @@ } }, "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "minimist": "0.0.8" } }, "moment": { @@ -21807,7 +22038,7 @@ "glob": "7.1.2", "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "minimatch": "3.0.4", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "nopt": "3.0.6", "npmlog": "4.1.2", "osenv": "0.1.5", @@ -21843,7 +22074,7 @@ "os-browserify": "0.3.0", "path-browserify": "0.0.0", "process": "0.11.10", - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "punycode": "1.4.1", "querystring-es3": "0.2.1", "readable-stream": "2.3.6", "stream-browserify": "2.0.1", @@ -21870,7 +22101,7 @@ "dev": true, "requires": { "async-foreach": "0.1.3", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "chalk": "1.1.3", "cross-spawn": "3.0.1", "gaze": "1.1.2", "get-stdin": "4.0.1", @@ -21880,7 +22111,7 @@ "lodash.clonedeep": "4.5.0", "lodash.mergewith": "4.6.1", "meow": "3.7.0", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "nan": "2.10.0", "node-gyp": "3.6.2", "npmlog": "4.1.2", @@ -22506,7 +22737,7 @@ "optional": true, "requires": { "nan": "2.3.5", - "node-pre-gyp": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.25.tgz" + "node-pre-gyp": "0.6.25" }, "dependencies": { "ansi": { @@ -22621,7 +22852,7 @@ "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", "dev": true, "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "inherits": "2.0.1" } }, "boom": { @@ -22794,8 +23025,8 @@ "dev": true, "requires": { "graceful-fs": "4.1.3", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "inherits": "2.0.1", + "mkdirp": "0.5.1", "rimraf": "2.5.2" } }, @@ -22807,7 +23038,7 @@ "optional": true, "requires": { "fstream": "1.0.8", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "inherits": "2.0.1", "minimatch": "3.0.0" }, "dependencies": { @@ -22958,7 +23189,8 @@ } }, "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true }, @@ -23123,16 +23355,18 @@ } }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "minimist": "0.0.8" } }, "ms": { @@ -23150,12 +23384,13 @@ "optional": true }, "node-pre-gyp": { - "version": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.25.tgz", + "version": "0.6.25", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.25.tgz", "integrity": "sha1-LGgYd15vHfXjU7qAJPHAEYcmVFs=", "dev": true, "optional": true, "requires": { - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "nopt": "3.0.6", "npmlog": "2.0.3", "rc": "1.1.6", @@ -23282,7 +23517,7 @@ "dev": true, "requires": { "core-util-is": "1.0.2", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "inherits": "2.0.1", "isarray": "1.0.0", "process-nextick-args": "1.0.6", "string_decoder": "0.10.31", @@ -23505,7 +23740,7 @@ "requires": { "block-stream": "0.0.8", "fstream": "1.0.8", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "inherits": "2.0.1" } }, "tar-pack": { @@ -24635,7 +24870,7 @@ "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", - "semver": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "semver": "5.0.3", "validate-npm-package-license": "3.0.1" } }, @@ -24660,7 +24895,8 @@ } }, "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" }, "oauth": { @@ -24685,7 +24921,7 @@ "requires": { "copy-descriptor": "0.1.1", "define-property": "0.2.5", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -24731,11 +24967,12 @@ } }, "once": { - "version": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "dev": true, "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "wrappy": "1.0.2" } }, "onetime": { @@ -24775,18 +25012,21 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { - "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + "lcid": "1.0.0" } }, "os-tmpdir": { - "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=" }, "osenv": { @@ -24795,8 +25035,8 @@ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.1" } }, "p-limit": { @@ -24984,7 +25224,7 @@ "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "2.0.1" } }, "path-is-absolute": { @@ -25010,8 +25250,8 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pbkdf2": { @@ -25027,18 +25267,21 @@ } }, "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -26668,7 +26911,8 @@ } }, "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "pure-color": { @@ -26789,7 +27033,7 @@ "integrity": "sha512-dMv7YrbxO4y2aqnvA7f/ik9ibeLSHQJTI6TrYAenPSaQ6OXfb+Oti+oJiy8WBxgRzlKatYqtCjphTgDSCEiWFg==", "requires": { "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", + "loose-envify": "1.2.0", "object-assign": "4.1.1", "prop-types": "15.6.0" }, @@ -26827,7 +27071,7 @@ "integrity": "sha512-Usl73nQqzvmJN+89r97zmeUpQDKDlh58eX6Hbs/ERdDHzeBzWy+ENk7fsGQ+5KxArV1iOFPT46/VneklK9zoWw==", "requires": { "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", + "loose-envify": "1.2.0", "object-assign": "4.1.1", "prop-types": "15.6.0" }, @@ -27492,7 +27736,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "find-up": "1.1.2", "read-pkg": "1.1.0" } }, @@ -27501,13 +27745,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", "process-nextick-args": "2.0.0", "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" }, "dependencies": { "inherits": { @@ -27878,7 +28122,7 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + "is-finite": "1.0.2" } }, "request": { @@ -28503,6 +28747,12 @@ "ret": "0.1.15" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sass-extract": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sass-extract/-/sass-extract-2.1.0.tgz", @@ -28554,8 +28804,8 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", "wrap-ansi": "2.1.0" } }, @@ -28567,16 +28817,16 @@ "requires": { "camelcase": "3.0.0", "cliui": "3.2.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "decamelize": "1.2.0", "get-caller-file": "1.0.2", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "os-locale": "1.4.0", "read-pkg-up": "1.0.1", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "string-width": "1.0.2", "which-module": "1.0.0", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "y18n": "3.2.1", "yargs-parser": "5.0.0" } } @@ -28617,7 +28867,7 @@ "dev": true, "requires": { "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "emojis-list": "2.1.0", "json5": "0.5.1" } }, @@ -28654,13 +28904,14 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + "amdefine": "1.0.0" } } } }, "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=" }, "set-blocking": { @@ -28679,7 +28930,7 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "requires": { "extend-shallow": "2.0.1", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-extendable": "0.1.1", "is-plain-object": "2.0.4", "split-string": "3.1.0" }, @@ -28689,7 +28940,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -28714,7 +28965,7 @@ "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", "dev": true, "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-extendable": "0.1.1", "kind-of": "2.0.1", "lazy-cache": "0.2.7", "mixin-object": "2.0.1" @@ -28726,7 +28977,7 @@ "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "1.1.6" } }, "lazy-cache": { @@ -28766,7 +29017,8 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { - "version": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { @@ -28801,7 +29053,7 @@ "define-property": "0.2.5", "extend-shallow": "2.0.1", "map-cache": "0.2.2", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "source-map-resolve": "0.5.1", "use": "3.1.0" }, @@ -28819,7 +29071,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } } } @@ -28880,7 +29132,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "sntp": { @@ -28898,7 +29150,8 @@ "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" }, "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" }, "source-map-resolve": { @@ -28918,7 +29171,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "source-map": "0.5.6" } }, "source-map-url": { @@ -28968,11 +29221,11 @@ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { - "asn1": "0.2.3", + "asn1": "0.2.4", "assert-plus": "1.0.0", "bcrypt-pbkdf": "1.0.1", "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", + "ecc-jsbn": "0.1.2", "getpass": "0.1.7", "jsbn": "0.1.1", "tweetnacl": "0.14.5" @@ -29041,12 +29294,13 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -29064,10 +29318,11 @@ "dev": true }, "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + "ansi-regex": "2.0.0" } }, "strip-indent": { @@ -29145,7 +29400,8 @@ "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "symbol-observable": { @@ -29321,7 +29577,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "3.2.2" } }, "to-regex": { @@ -29368,7 +29624,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "punycode": "1.4.1" } }, "trim-newlines": { @@ -29400,7 +29656,7 @@ "inflight": "1.0.6", "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "minimatch": "3.0.4", - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "once": "1.3.3", "path-is-absolute": "1.0.1" } } @@ -29449,7 +29705,7 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "uglify-to-browserify": "1.0.2", "yargs": "3.10.0" }, @@ -29461,7 +29717,7 @@ "requires": { "camelcase": "1.2.1", "cliui": "2.1.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -29478,7 +29734,7 @@ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "uglify-js": "2.8.29", "webpack-sources": "1.0.2" } @@ -29495,7 +29751,7 @@ "requires": { "arr-union": "3.1.0", "get-value": "2.0.6", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-extendable": "0.1.1", "set-value": "0.4.3" }, "dependencies": { @@ -29504,7 +29760,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "0.1.1" } }, "set-value": { @@ -29513,7 +29769,7 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { "extend-shallow": "2.0.1", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-extendable": "0.1.1", "is-plain-object": "2.0.4", "to-object-path": "0.3.0" } @@ -29658,7 +29914,8 @@ } }, "util-deprecate": { - "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { @@ -29687,7 +29944,7 @@ "dev": true, "requires": { "assert-plus": "1.0.0", - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "core-util-is": "1.0.2", "extsprintf": "1.3.0" }, "dependencies": { @@ -29758,9 +30015,9 @@ "loader-runner": "2.3.0", "loader-utils": "1.1.0", "memory-fs": "0.4.1", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "mkdirp": "0.5.1", "node-libs-browser": "2.1.0", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map": "0.5.6", "supports-color": "3.2.3", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", @@ -29801,7 +30058,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + "amdefine": "1.0.0" } } } @@ -29963,7 +30220,7 @@ "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", "dev": true, "requires": { - "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "isexe": "2.0.0" } }, "which-module": { @@ -29977,7 +30234,7 @@ "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", "dev": true, "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + "string-width": "1.0.2" } }, "window-size": { @@ -30000,12 +30257,13 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" } }, "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, @@ -30015,7 +30273,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "mkdirp": "0.5.1" } }, "xhr": { @@ -30101,7 +30359,8 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { - "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yargs": { @@ -30111,16 +30370,16 @@ "requires": { "camelcase": "3.0.0", "cliui": "3.2.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "decamelize": "1.2.0", "get-caller-file": "1.0.2", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "os-locale": "1.4.0", "read-pkg-up": "1.0.1", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "string-width": "1.0.2", "which-module": "1.0.0", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "y18n": "3.2.1", "yargs-parser": "4.2.1" }, "dependencies": { @@ -30134,8 +30393,8 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", "wrap-ansi": "2.1.0" } }, diff --git a/package.json b/package.json index 25fe3852..283983df 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "escape-string-regexp": "^1.0.5", "eslint-loader": "^1.3.0", "express": "^4.13.4", + "express-basic-auth": "^1.1.5", "express-session": "^1.13.0", "htmlhint": "^0.9.13", "is-url": "^1.2.2", diff --git a/server/server.js b/server/server.js index 95cb6fca..d98f851d 100644 --- a/server/server.js +++ b/server/server.js @@ -8,6 +8,7 @@ import connectMongo from 'connect-mongo'; import passport from 'passport'; import path from 'path'; import { URL } from 'url'; +import basicAuth from 'express-basic-auth'; // Webpack Requirements import webpack from 'webpack'; @@ -32,6 +33,16 @@ import { get404Sketch } from './views/404Page'; const app = new Express(); const MongoStore = connectMongo(session); +// For basic auth, in setting up beta editor +if (process.env.BASIC_USERNAME && process.env.BASIC_PASSWORD) { + app.use(basicAuth({ + users: { + [process.env.BASIC_USERNAME]: process.env.BASIC_PASSWORD + }, + challenge: true + })); +} + const corsOriginsWhitelist = [ /p5js\.org$/, ]; diff --git a/webpack.config.dev.js b/webpack.config.dev.js index b3cacbed..a387523b 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -1,4 +1,6 @@ const webpack = require('webpack'); +const path = require('path'); + if (process.env.NODE_ENV === 'development') { require('dotenv').config(); } From a8a008dd82af456878a1633a403b889366cd47cc Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 21 Aug 2018 16:17:36 -0400 Subject: [PATCH 51/75] fix docker-compose config --- docker-compose.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e00a0ef5..fcbfb7e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,20 +29,20 @@ services: links: - app app: - # build: - # context: . - # dockerfile: Dockerfile - # target: production - # args: - # - API_URL - # - NODE_ENV - # - S3_BUCKET - # - AWS_REGION - # - S3_BUCKET_URL_BASE - # - FORCE_TO_HTTPS - image: index.docker.io/catarak/p5.js-web-editor:latest - env_file: - - "$PWD/.env" + build: + context: . + dockerfile: Dockerfile + target: production + args: + - API_URL + - NODE_ENV + - S3_BUCKET + - AWS_REGION + - S3_BUCKET_URL_BASE + - FORCE_TO_HTTPS + # image: index.docker.io/catarak/p5.js-web-editor:latest + # env_file: + # - "$PWD/.env" environment: - API_URL - MONGO_URL From 02456eaa6075d90fa54720b39418d3e8529dc28f Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 21 Aug 2018 17:39:34 -0400 Subject: [PATCH 52/75] try creating health check --- kubernetes/app.yml | 4 ++++ server/server.js | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/kubernetes/app.yml b/kubernetes/app.yml index 3919aada..9962a52d 100644 --- a/kubernetes/app.yml +++ b/kubernetes/app.yml @@ -57,4 +57,8 @@ spec: memory: 100Mi ports: - containerPort: 8000 + readinessProbe: + httpGet: + path: /health + port: 8000 diff --git a/server/server.js b/server/server.js index d98f851d..b55b922b 100644 --- a/server/server.js +++ b/server/server.js @@ -33,6 +33,10 @@ import { get404Sketch } from './views/404Page'; const app = new Express(); const MongoStore = connectMongo(session); +app.get('/health', (req, res) => { + return res.json({success: true}); +}); + // For basic auth, in setting up beta editor if (process.env.BASIC_USERNAME && process.env.BASIC_PASSWORD) { app.use(basicAuth({ From 4dc0ee1d25473532179c0896e7efbd988b96c8c7 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 21 Aug 2018 17:52:42 -0400 Subject: [PATCH 53/75] fix linting errors --- server/server.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/server/server.js b/server/server.js index b55b922b..fb811b71 100644 --- a/server/server.js +++ b/server/server.js @@ -33,9 +33,7 @@ import { get404Sketch } from './views/404Page'; const app = new Express(); const MongoStore = connectMongo(session); -app.get('/health', (req, res) => { - return res.json({success: true}); -}); +app.get('/health', (req, res) => res.json({ success: true })); // For basic auth, in setting up beta editor if (process.env.BASIC_USERNAME && process.env.BASIC_PASSWORD) { From 6705e4c3f8be46e0eb197bc3c2fcc2ed8dfe5305 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 24 Aug 2018 17:41:23 -0400 Subject: [PATCH 54/75] load client-side environment variables at runtime --- client/modules/App/App.jsx | 4 +- client/modules/IDE/actions/assets.js | 3 +- client/modules/IDE/actions/files.js | 3 +- client/modules/IDE/actions/preferences.js | 3 +- client/modules/IDE/actions/project.js | 3 +- client/modules/IDE/actions/projects.js | 3 +- client/modules/IDE/actions/uploader.js | 7 ++-- .../modules/IDE/components/FileUploader.jsx | 5 ++- client/modules/User/actions.js | 4 +- client/routes.jsx | 4 +- client/store.js | 4 +- docker-compose.yml | 7 ---- kubernetes/app.yml | 2 +- server/server.js | 2 +- server/views/index.js | 37 +++++++++++++------ webpack.config.dev.js | 10 +---- webpack.config.prod.js | 9 +---- 17 files changed, 58 insertions(+), 52 deletions(-) diff --git a/client/modules/App/App.jsx b/client/modules/App/App.jsx index 6b11c262..e47e6454 100644 --- a/client/modules/App/App.jsx +++ b/client/modules/App/App.jsx @@ -4,6 +4,8 @@ import { connect } from 'react-redux'; import DevTools from './components/DevTools'; import { setPreviousPath } from '../IDE/actions/ide'; +const __process = (typeof global !== 'undefined' ? global : window).process; + class App extends React.Component { constructor(props, context) { super(props, context); @@ -23,7 +25,7 @@ class App extends React.Component { render() { return (
- {this.state.isMounted && !window.devToolsExtension && process.env.NODE_ENV === 'development' && } + {this.state.isMounted && !window.devToolsExtension && __process.env.NODE_ENV === 'development' && } {this.props.children}
); diff --git a/client/modules/IDE/actions/assets.js b/client/modules/IDE/actions/assets.js index 04de03bb..5b72791e 100644 --- a/client/modules/IDE/actions/assets.js +++ b/client/modules/IDE/actions/assets.js @@ -2,7 +2,8 @@ import axios from 'axios'; import * as ActionTypes from '../../../constants'; -const ROOT_URL = process.env.API_URL; +const __process = (typeof global !== 'undefined' ? global : window).process; +const ROOT_URL = __process.env.API_URL; function setAssets(assets) { return { diff --git a/client/modules/IDE/actions/files.js b/client/modules/IDE/actions/files.js index 2667c718..18762dd1 100644 --- a/client/modules/IDE/actions/files.js +++ b/client/modules/IDE/actions/files.js @@ -5,7 +5,8 @@ import { reset } from 'redux-form'; import * as ActionTypes from '../../../constants'; import { setUnsavedChanges } from './ide'; -const ROOT_URL = process.env.API_URL; +const __process = (typeof global !== 'undefined' ? global : window).process; +const ROOT_URL = __process.env.API_URL; function appendToFilename(filename, string) { const dotIndex = filename.lastIndexOf('.'); diff --git a/client/modules/IDE/actions/preferences.js b/client/modules/IDE/actions/preferences.js index 46182fa5..3e26e45a 100644 --- a/client/modules/IDE/actions/preferences.js +++ b/client/modules/IDE/actions/preferences.js @@ -1,7 +1,8 @@ import axios from 'axios'; import * as ActionTypes from '../../../constants'; -const ROOT_URL = process.env.API_URL; +const __process = (typeof global !== 'undefined' ? global : window).process; +const ROOT_URL = __process.env.API_URL; function updatePreferences(formParams, dispatch) { axios.put(`${ROOT_URL}/preferences`, formParams, { withCredentials: true }) diff --git a/client/modules/IDE/actions/project.js b/client/modules/IDE/actions/project.js index eeb146dc..d2ff94b1 100644 --- a/client/modules/IDE/actions/project.js +++ b/client/modules/IDE/actions/project.js @@ -12,7 +12,8 @@ import { setUnsavedChanges, import { clearState, saveState } from '../../../persistState'; import { redirectToProtocol, protocols } from '../../../components/forceProtocol'; -const ROOT_URL = process.env.API_URL; +const __process = (typeof global !== 'undefined' ? global : window).process; +const ROOT_URL = __process.env.API_URL; export function setProject(project) { const targetProtocol = project.serveSecure === true ? diff --git a/client/modules/IDE/actions/projects.js b/client/modules/IDE/actions/projects.js index ee00e40b..5419f0fb 100644 --- a/client/modules/IDE/actions/projects.js +++ b/client/modules/IDE/actions/projects.js @@ -3,7 +3,8 @@ import * as ActionTypes from '../../../constants'; import { showErrorModal, setPreviousPath } from './ide'; import { resetProject } from './project'; -const ROOT_URL = process.env.API_URL; +const __process = (typeof global !== 'undefined' ? global : window).process; +const ROOT_URL = __process.env.API_URL; export function getProjects(username) { return (dispatch) => { diff --git a/client/modules/IDE/actions/uploader.js b/client/modules/IDE/actions/uploader.js index 8a5a3c23..913f3aa9 100644 --- a/client/modules/IDE/actions/uploader.js +++ b/client/modules/IDE/actions/uploader.js @@ -2,9 +2,10 @@ import axios from 'axios'; import { createFile } from './files'; import { TEXT_FILE_REGEX } from '../../../../server/utils/fileUtils'; -const s3BucketHttps = process.env.S3_BUCKET_URL_BASE || - `https://s3-${process.env.AWS_REGION}.amazonaws.com/${process.env.S3_BUCKET}/`; -const ROOT_URL = process.env.API_URL; +const __process = (typeof global !== 'undefined' ? global : window).process; +const s3BucketHttps = __process.env.S3_BUCKET_URL_BASE || + `https://s3-${__process.env.AWS_REGION}.amazonaws.com/${__process.env.S3_BUCKET}/`; +const ROOT_URL = __process.env.API_URL; const MAX_LOCAL_FILE_SIZE = 80000; // bytes, aka 80 KB function localIntercept(file, options = {}) { diff --git a/client/modules/IDE/components/FileUploader.jsx b/client/modules/IDE/components/FileUploader.jsx index e229d191..50fe6062 100644 --- a/client/modules/IDE/components/FileUploader.jsx +++ b/client/modules/IDE/components/FileUploader.jsx @@ -6,8 +6,9 @@ import { connect } from 'react-redux'; import * as UploaderActions from '../actions/uploader'; import { fileExtensionsAndMimeTypes } from '../../../../server/utils/fileUtils'; -const s3Bucket = process.env.S3_BUCKET_URL_BASE || - `https://s3-${process.env.AWS_REGION}.amazonaws.com/${process.env.S3_BUCKET}/`; +const __process = (typeof global !== 'undefined' ? global : window).process; +const s3Bucket = __process.env.S3_BUCKET_URL_BASE || + `https://s3-${__process.env.AWS_REGION}.amazonaws.com/${__process.env.S3_BUCKET}/`; class FileUploader extends React.Component { componentDidMount() { diff --git a/client/modules/User/actions.js b/client/modules/User/actions.js index 68602968..ec825cd2 100644 --- a/client/modules/User/actions.js +++ b/client/modules/User/actions.js @@ -3,8 +3,8 @@ import axios from 'axios'; import * as ActionTypes from '../../constants'; import { showErrorModal, justOpenedProject } from '../IDE/actions/ide'; - -const ROOT_URL = process.env.API_URL; +const __process = (typeof global !== 'undefined' ? global : window).process; +const ROOT_URL = __process.env.API_URL; export function authError(error) { return { diff --git a/client/routes.jsx b/client/routes.jsx index f7d379a6..b255be3f 100644 --- a/client/routes.jsx +++ b/client/routes.jsx @@ -14,6 +14,8 @@ import AccountView from './modules/User/pages/AccountView'; import { getUser } from './modules/User/actions'; import { stopSketch } from './modules/IDE/actions/ide'; +const __process = (typeof global !== 'undefined' ? global : window).process; + const checkAuth = (store) => { store.dispatch(getUser()); }; @@ -30,7 +32,7 @@ const routes = (store) => { targetProtocol: protocols.https, sourceProtocol, // prints debugging but does not reload page - disable: process.env.FORCE_TO_HTTPS === false, + disable: __process.env.FORCE_TO_HTTPS === false, }); return ( diff --git a/client/store.js b/client/store.js index 1fe11cc3..dbb3685e 100644 --- a/client/store.js +++ b/client/store.js @@ -4,12 +4,14 @@ import DevTools from './modules/App/components/DevTools'; import rootReducer from './reducers'; import { clearState, loadState } from './persistState'; +const __process = (typeof global !== 'undefined' ? global : window).process; + export default function configureStore(initialState) { const enhancers = [ applyMiddleware(thunk), ]; - if (process.env.CLIENT && process.env.NODE_ENV === 'development') { + if (__process.env.CLIENT && __process.env.NODE_ENV === 'development') { // Enable DevTools only when rendering on client and during development. enhancers.push(window.devToolsExtension ? window.devToolsExtension() : DevTools.instrument()); } diff --git a/docker-compose.yml b/docker-compose.yml index fcbfb7e2..e9e50f5a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,13 +33,6 @@ services: context: . dockerfile: Dockerfile target: production - args: - - API_URL - - NODE_ENV - - S3_BUCKET - - AWS_REGION - - S3_BUCKET_URL_BASE - - FORCE_TO_HTTPS # image: index.docker.io/catarak/p5.js-web-editor:latest # env_file: # - "$PWD/.env" diff --git a/kubernetes/app.yml b/kubernetes/app.yml index 9962a52d..3444e2fc 100644 --- a/kubernetes/app.yml +++ b/kubernetes/app.yml @@ -3,7 +3,7 @@ kind: Ingress metadata: name: editor-ingress annotations: - kubernetes.io/ingress.global-static-ip-name: "test-web-editor" + kubernetes.io/ingress.global-static-ip-name: "web-editor-ip" spec: backend: serviceName: web-editor-node diff --git a/server/server.js b/server/server.js index fb811b71..3462353e 100644 --- a/server/server.js +++ b/server/server.js @@ -59,7 +59,7 @@ if (process.env.NODE_ENV === 'development') { } let mongoConnectionString; -if (process.env.NODE_ENV === 'production') { +if (process.env.NODE_ENV === 'production' && process.env.MONGO_RW_USERNAME && process.env.MONGO_RW_PASSWORD) { const { MONGO_RW_USERNAME, MONGO_RW_PASSWORD, diff --git a/server/views/index.js b/server/views/index.js index ace1df5a..213778f5 100644 --- a/server/views/index.js +++ b/server/views/index.js @@ -15,6 +15,21 @@ export function renderIndex() { +
@@ -24,19 +39,19 @@ export function renderIndex() { `//` : ''} - - - - + + + + `; diff --git a/webpack.config.dev.js b/webpack.config.dev.js index a387523b..146d2823 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -39,15 +39,7 @@ module.exports = [{ }), new webpack.DefinePlugin({ 'process.env': { - API_URL: process.env.API_URL ? `"${process.env.API_URL}"` : undefined, - CLIENT: JSON.stringify(true), - FORCE_TO_HTTPS: process.env.FORCE_TO_HTTPS === 'true' ? - JSON.stringify(true) : - JSON.stringify(false), - NODE_ENV: JSON.stringify('development'), - S3_BUCKET: process.env.S3_BUCKET ? `"${process.env.S3_BUCKET}"` : undefined, - S3_BUCKET_URL_BASE: process.env.S3_BUCKET_URL_BASE ? `"${process.env.S3_BUCKET_URL_BASE}"` : undefined, - AWS_REGION: process.env.AWS_REGION ? `"${process.env.AWS_REGION}"` : undefined + NODE_ENV: JSON.stringify('development') } }) ], diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 2361769a..ff653b2a 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -88,14 +88,7 @@ module.exports = [{ plugins: [ new webpack.DefinePlugin({ 'process.env': { - API_URL: process.env.API_URL ? `"${process.env.API_URL}"` : undefined, - NODE_ENV: JSON.stringify('production'), - S3_BUCKET: process.env.S3_BUCKET ? `"${process.env.S3_BUCKET}"` : undefined, - S3_BUCKET_URL_BASE: process.env.S3_BUCKET_URL_BASE ? `"${process.env.S3_BUCKET_URL_BASE}"` : undefined, - AWS_REGION: process.env.AWS_REGION ? `"${process.env.AWS_REGION}"` : undefined, - FORCE_TO_HTTPS: process.env.FORCE_TO_HTTPS === 'false' ? - JSON.stringify(false) : - undefined + NODE_ENV: JSON.stringify('production') } }), new webpack.optimize.CommonsChunkPlugin({ From b4ca66e1fbb6d0e308dde5bc0a6393b58f9db46d Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 24 Aug 2018 18:22:26 -0400 Subject: [PATCH 55/75] update travis config to only build docker image on certain branches --- .travis.yml | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/.travis.yml b/.travis.yml index a442f80c..62988d46 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,15 +2,11 @@ sudo: required language: node_js node_js: - "8.11.1" -python: -- "3.4" -- "pypy-5.3.1" services: - docker before_install: - # eventually set up AWS stuff here - docker-compose -f docker-compose-development.yml up -d - docker ps -a @@ -21,30 +17,14 @@ script: - docker-compose exec -T app npm run test --verbose after_success: -# only run this if on the master branch eventually, not while testing tho -# - sudo apt-get install -y python3.4 -# - sudo apt-get install --upgrade -y python-pip -# - sudo apt-get install jq -# - sudo pip install --user virtualenv -# # Create a virtual environment for AWS CLI -# - virtualenv my_py3 --python=/usr/bin/python3.4 -# - source my_py3/bin/activate -# - pip install --upgrade awscli -# - pip install --upgrade awsebcli -# # Set AWS information -# - aws configure set aws_access_key_id $AWS_ACCESS_KEY -# - aws configure set aws_secret_access_key $AWS_SECRET_KEY -# - aws configure set default.region $AWS_REGION -# - aws configure set metadata_service_timeout 1200 -# - aws configure set metadata_service_num_attempts 3 -# - aws configure list # build images -- docker-compose stop -- docker-compose build --no-cache -- docker image ls -- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" -- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest -- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest + if: branch = master OR branch = production-docker + - docker-compose stop + - docker-compose build --no-cache + - docker image ls + - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" + - docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest + - docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest env: global: From 472bc0b42526ddd9a21c59dae6b3f73aa3f3bfcf Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 24 Aug 2018 18:40:22 -0400 Subject: [PATCH 56/75] delete docker cloud file, is my travis yml fixed? --- .travis.yml | 14 +++++----- docker-cloud.yml | 66 ------------------------------------------------ 2 files changed, 7 insertions(+), 73 deletions(-) delete mode 100644 docker-cloud.yml diff --git a/.travis.yml b/.travis.yml index 62988d46..37a1138f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,13 +18,13 @@ script: after_success: # build images - if: branch = master OR branch = production-docker - - docker-compose stop - - docker-compose build --no-cache - - docker image ls - - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" - - docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest - - docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest +if: branch = master OR branch = production-docker +- docker-compose stop +- docker-compose build --no-cache +- docker image ls +- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" +- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest +- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest env: global: diff --git a/docker-cloud.yml b/docker-cloud.yml deleted file mode 100644 index 14cacb6b..00000000 --- a/docker-cloud.yml +++ /dev/null @@ -1,66 +0,0 @@ -version: '3.4' -services: - mongo: - image: mongo:3.4 - volumes: - - dbdata:/data/db - - "$PWD/mongo/:/docker-entrypoint-initdb.d/" - ports: - - '27017:27017' - environment: - - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME} - - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD} - - MONGO_INITDB_DATABASE=${MONGO_INITDB_DATABASE} - - MONGO_RW_USERNAME=${MONGO_RW_USERNAME} - - MONGO_RW_PASSWORD=${MONGO_RW_PASSWORD} - nginx: - image: nginx:1.13 - volumes: - - "$PWD/nginx/alpha.editor.p5js.org.conf:/etc/nginx/conf.d/default.conf" - ports: - - '80:80' - links: - - app - app: - image: catarak/p5.js-web-editor - # this is so infuriating that i have to map EVERY ENV VARIABLE - environment: - - MONGO_URL=mongodb://mongo:27017/p5js-web-editor - - MONGO_HOSTNAME=mongo - - MONGO_PORT=${MONGO_PORT} - - MONGO_NAME=${MONGO_NAME} - - PORT=${PORT} - - SESSION_SECRET=${SESSION_SECRET} - - AWS_ACCESS_KEY=${AWS_ACCESS_KEY} - - AWS_SECRET_KEY=${AWS_SECRET_KEY} - - S3_BUCKET=${S3_BUCKET} - - AWS_REGION=${AWS_REGION} - - GITHUB_ID=${GITHUB_ID} - - GITHUB_SECRET=${GITHUB_SECRET} - - MAILGUN_DOMAIN=${MAILGUN_DOMAIN} - - MAILGUN_KEY=${MAILGUN_KEY} - - EMAIL_SENDER=${EMAIL_SENDER} - - EMAIL_VERIFY_SECRET_TOKEN=${EMAIL_VERIFY_SECRET_TOKEN} - - S3_BUCKET_URL_BASE=${S3_BUCKET_URL_BASE} - - GG_EXAMPLES_USERNAME=${GG_EXAMPLES_USERNAME} - - GG_EXAMPLES_PASS=${GG_EXAMPLES_PASS} - - GG_EXAMPLES_EMAIL=${GG_EXAMPLES_EMAIL} - - GOOGLE_ID=${GOOGLE_ID} - - GOOGLE_SECRET=${GOOGLE_SECRET} - - EXAMPLE_USER_EMAIL=${EXAMPLE_USER_EMAIL} - - EXAMPLE_USER_PASSWORD=${EXAMPLE_USER_PASSWORD} - - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME} - - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD} - - MONGO_INITDB_DATABASE=${MONGO_INITDB_DATABASE} - - MONGO_RW_USERNAME=${MONGO_RW_USERNAME} - - MONGO_RW_PASSWORD=${MONGO_RW_PASSWORD} - volumes: - - .:/opt/node/app - - /opt/node/app/node_modules - ports: - - '8000:8000' - # - '443:443' - links: - - mongo -volumes: - dbdata: From 1493d3e5ae490e2f11b38ec69c23f7c57cac955f Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 24 Aug 2018 19:05:33 -0400 Subject: [PATCH 57/75] try updating travis yaml again --- .travis.yml | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/.travis.yml b/.travis.yml index 37a1138f..aff27194 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,26 +6,28 @@ node_js: services: - docker -before_install: - - docker-compose -f docker-compose-development.yml up -d - - docker ps -a +stages: + - test + - build -install: true - -script: -# Run unit tests in the app container -- docker-compose exec -T app npm run test --verbose - -after_success: -# build images -if: branch = master OR branch = production-docker -- docker-compose stop -- docker-compose build --no-cache -- docker image ls -- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" -- docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest -- docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest - -env: - global: - - APP_IMAGE_NAME=p5jswebeditor_app +jobs: + include: + - stage: test + before_install: + - docker-compose -f docker-compose-development.yml up -d + - docker ps -a + install: true + script: + # Run unit tests in the app container + - docker-compose exec -T app npm run test --verbose + - stage: build + if: branch = master OR branch = production-docker + env: + - APP_IMAGE_NAME=p5jswebeditor_app + script: + - docker-compose stop + - docker-compose build --no-cache + - docker image ls + - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" + - docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest + - docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest From d44027c58e5988181436922d17f15374e142db0f Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 27 Aug 2018 14:34:24 -0400 Subject: [PATCH 58/75] for simplicity and security, remove redirect to HTTP and keep everything on HTTPS --- .gitignore | 1 + client/constants.js | 1 - client/modules/IDE/actions/project.js | 23 -------- client/modules/IDE/components/Preferences.jsx | 31 ---------- client/modules/IDE/pages/IDEView.jsx | 4 -- client/modules/IDE/reducers/project.js | 5 -- client/routes.jsx | 57 +++++++------------ 7 files changed, 23 insertions(+), 99 deletions(-) diff --git a/.gitignore b/.gitignore index ebb519cf..30e479a2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .DS_Store .env +.env.production .vscode/ node_modules/ npm-debug.log diff --git a/client/constants.js b/client/constants.js index 7ef4983c..147c2ba9 100644 --- a/client/constants.js +++ b/client/constants.js @@ -28,7 +28,6 @@ export const AUTH_ERROR = 'AUTH_ERROR'; export const SETTINGS_UPDATED = 'SETTINGS_UPDATED'; export const SET_PROJECT_NAME = 'SET_PROJECT_NAME'; -export const SET_SERVE_SECURE = 'SET_SERVE_SECURE'; export const PROJECT_SAVE_SUCCESS = 'PROJECT_SAVE_SUCCESS'; export const PROJECT_SAVE_FAIL = 'PROJECT_SAVE_FAIL'; diff --git a/client/modules/IDE/actions/project.js b/client/modules/IDE/actions/project.js index d2ff94b1..148d0085 100644 --- a/client/modules/IDE/actions/project.js +++ b/client/modules/IDE/actions/project.js @@ -16,13 +16,6 @@ const __process = (typeof global !== 'undefined' ? global : window).process; const ROOT_URL = __process.env.API_URL; export function setProject(project) { - const targetProtocol = project.serveSecure === true ? - protocols.https : - protocols.http; - - // This will not reload if on same protocol - redirectToProtocol(targetProtocol); - return { type: ActionTypes.SET_PROJECT, project, @@ -265,22 +258,6 @@ export function cloneProject() { }; } -export function setServeSecure(serveSecure, { redirect = true } = {}) { - return (dispatch, getState) => { - dispatch({ - type: ActionTypes.SET_SERVE_SECURE, - serveSecure - }); - - if (redirect === true) { - dispatch(saveProject(false /* autosave */)) - .then(() => redirectToProtocol(serveSecure === true ? protocols.https : protocols.http)); - } - - return null; - }; -} - export function showEditProjectName() { return { type: ActionTypes.SHOW_EDIT_PROJECT_NAME diff --git a/client/modules/IDE/components/Preferences.jsx b/client/modules/IDE/components/Preferences.jsx index 2f7b2b0b..223fdb8c 100644 --- a/client/modules/IDE/components/Preferences.jsx +++ b/client/modules/IDE/components/Preferences.jsx @@ -59,7 +59,6 @@ class Preferences extends React.Component {

General Settings

-

Sketch Settings

Accessibility

@@ -217,34 +216,6 @@ class Preferences extends React.Component {
- - {/*
-

Add a p5.js or an external library

-
*/} -
-

Security Protocol

-
- { - this.props.setServeSecure(event.target.checked); - }} - /> - - - - -
-
-

Lint warning sound

@@ -349,8 +320,6 @@ Preferences.propTypes = { lintWarning: PropTypes.bool.isRequired, setLintWarning: PropTypes.func.isRequired, theme: PropTypes.string.isRequired, - serveSecure: PropTypes.bool.isRequired, - setServeSecure: PropTypes.func.isRequired, setTheme: PropTypes.func.isRequired, }; diff --git a/client/modules/IDE/pages/IDEView.jsx b/client/modules/IDE/pages/IDEView.jsx index 028147bb..73a1e22d 100644 --- a/client/modules/IDE/pages/IDEView.jsx +++ b/client/modules/IDE/pages/IDEView.jsx @@ -277,8 +277,6 @@ class IDEView extends React.Component { setSoundOutput={this.props.setSoundOutput} theme={this.props.preferences.theme} setTheme={this.props.setTheme} - serveSecure={this.props.project.serveSecure} - setServeSecure={this.props.setServeSecure} /> } @@ -560,7 +558,6 @@ IDEView.propTypes = { project: PropTypes.shape({ id: PropTypes.string, name: PropTypes.string.isRequired, - serveSecure: PropTypes.bool, owner: PropTypes.shape({ username: PropTypes.string, id: PropTypes.string @@ -568,7 +565,6 @@ IDEView.propTypes = { updatedAt: PropTypes.string }).isRequired, setProjectName: PropTypes.func.isRequired, - setServeSecure: PropTypes.func.isRequired, openPreferences: PropTypes.func.isRequired, editorAccessibility: PropTypes.shape({ lintMessages: PropTypes.array.isRequired, diff --git a/client/modules/IDE/reducers/project.js b/client/modules/IDE/reducers/project.js index c3572381..737defc2 100644 --- a/client/modules/IDE/reducers/project.js +++ b/client/modules/IDE/reducers/project.js @@ -7,7 +7,6 @@ const initialState = () => { const generatedName = generatedString.charAt(0).toUpperCase() + generatedString.slice(1); return { name: generatedName, - serveSecure: isSecurePage(), updatedAt: '' }; }; @@ -17,8 +16,6 @@ const project = (state, action) => { state = initialState(); // eslint-disable-line } switch (action.type) { - case ActionTypes.SET_SERVE_SECURE: - return Object.assign({}, { ...state }, { serveSecure: action.serveSecure }); case ActionTypes.SET_PROJECT_NAME: return Object.assign({}, { ...state }, { name: action.name }); case ActionTypes.NEW_PROJECT: @@ -26,7 +23,6 @@ const project = (state, action) => { id: action.project.id, name: action.project.name, updatedAt: action.project.updatedAt, - serveSecure: action.project.serveSecure, owner: action.owner }; case ActionTypes.SET_PROJECT: @@ -34,7 +30,6 @@ const project = (state, action) => { id: action.project.id, name: action.project.name, updatedAt: action.project.updatedAt, - serveSecure: action.project.serveSecure, owner: action.owner }; case ActionTypes.RESET_PROJECT: diff --git a/client/routes.jsx b/client/routes.jsx index b255be3f..ce38fe7b 100644 --- a/client/routes.jsx +++ b/client/routes.jsx @@ -1,6 +1,5 @@ import { Route, IndexRoute } from 'react-router'; import React from 'react'; -import forceProtocol, { protocols, findSourceProtocol } from './components/forceProtocol'; import App from './modules/App/App'; import IDEView from './modules/IDE/pages/IDEView'; import FullView from './modules/IDE/pages/FullView'; @@ -24,39 +23,27 @@ const onRouteChange = (store) => { store.dispatch(stopSketch()); }; -const routes = (store) => { - const sourceProtocol = findSourceProtocol(store.getState()); - - // If the flag is false, we stay on HTTP - const forceToHttps = forceProtocol({ - targetProtocol: protocols.https, - sourceProtocol, - // prints debugging but does not reload page - disable: __process.env.FORCE_TO_HTTPS === false, - }); - - return ( - { onRouteChange(store); }}> - - - - - - - - - - - - - - - - - ); -}; +const routes = store => ( + { onRouteChange(store); }}> + + + + + + + + + + + + + + + + +); export default routes; From 16b54b89ca2446fd4343cae502e9d83fd7d7745a Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 27 Aug 2018 17:30:34 -0400 Subject: [PATCH 59/75] try updating travis to have deploy script --- .travis.yml | 57 ++++++++++++++++------------- deploy.sh | 28 +++++++++++++++ docker-compose.yml | 11 ------ nginx/alpha.editor.p5js.org.conf | 61 -------------------------------- 4 files changed, 61 insertions(+), 96 deletions(-) create mode 100644 deploy.sh delete mode 100644 nginx/alpha.editor.p5js.org.conf diff --git a/.travis.yml b/.travis.yml index aff27194..3efb63ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,31 +3,40 @@ language: node_js node_js: - "8.11.1" +cache: + directories: + - "$HOME/google-cloud-sdk/" + services: - docker -stages: - - test - - build +before_install: + - docker-compose -f docker-compose-development.yml up -d + - docker ps -a -jobs: - include: - - stage: test - before_install: - - docker-compose -f docker-compose-development.yml up -d - - docker ps -a - install: true - script: - # Run unit tests in the app container - - docker-compose exec -T app npm run test --verbose - - stage: build - if: branch = master OR branch = production-docker - env: - - APP_IMAGE_NAME=p5jswebeditor_app - script: - - docker-compose stop - - docker-compose build --no-cache - - docker image ls - - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" - - docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest - - docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest +install: true + +script: + - docker-compose exec -T app npm run test --verbose + +after_success: + - docker-compose stop + +before_deploy: + - if [ ! -d "$HOME/google-cloud-sdk/bin" ]; then rm -rf $HOME/google-cloud-sdk; export CLOUDSDK_CORE_DISABLE_PROMPTS=1; curl https://sdk.cloud.google.com | bash; fi + - source /home/travis/google-cloud-sdk/path.bash.inc + - gcloud --quiet version + - gcloud --quiet components update + - gcloud --quiet components beta update + - gcloud --quiet components update kubectl + +deploy: + - provider: script + script: bash deploy.sh + skip_cleanup: true + on: + branch: master OR production-docker + +env: + global: + - APP_IMAGE_NAME=p5jswebeditor_app diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 00000000..e15651c0 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +set -e + +docker-compose build --no-cache +docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" +docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_COMMIT +docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_COMMIT + +# echo $GCLOUD_SERVICE_KEY_PRD | base64 --decode -i > ${HOME}/gcloud-service-key.json +# gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json + +# gcloud --quiet config set project $PROJECT_NAME_PRD +# gcloud --quiet config set container/cluster $CLUSTER_NAME_PRD +# gcloud --quiet config set compute/zone ${CLOUDSDK_COMPUTE_ZONE} +# gcloud --quiet container clusters get-credentials $CLUSTER_NAME_PRD + +# gcloud docker push gcr.io/${PROJECT_NAME_PRD}/${DOCKER_IMAGE_NAME} + +# yes | gcloud beta container images add-tag gcr.io/${PROJECT_NAME_PRD}/${DOCKER_IMAGE_NAME}:$TRAVIS_COMMIT gcr.io/${PROJECT_NAME_PRD}/${DOCKER_IMAGE_NAME}:latest + +# kubectl config view +# kubectl config current-context + +# kubectl set image deployment/${KUBE_DEPLOYMENT_NAME} ${KUBE_DEPLOYMENT_CONTAINER_NAME}=gcr.io/${PROJECT_NAME_PRD}/${DOCKER_IMAGE_NAME}:$TRAVIS_COMMIT + +# sleep 30 +# npm run e2e_test \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index e9e50f5a..cb1762a8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,16 +18,6 @@ services: - MONGO_INITDB_DATABASE - MONGO_RW_USERNAME - MONGO_RW_PASSWORD - nginx: - image: nginx:1.13 - volumes: - - "$PWD/nginx/alpha.editor.p5js.org.conf:/etc/nginx/conf.d/default.conf" - ports: - - '80:80' - depends_on: - - app - links: - - app app: build: context: . @@ -73,7 +63,6 @@ services: - /opt/node/app/node_modules ports: - '8000:8000' - # - '443:443' depends_on: - mongo volumes: diff --git a/nginx/alpha.editor.p5js.org.conf b/nginx/alpha.editor.p5js.org.conf deleted file mode 100644 index 884d68bb..00000000 --- a/nginx/alpha.editor.p5js.org.conf +++ /dev/null @@ -1,61 +0,0 @@ - # HTTP - redirect all requests to HTTPS: - server { - listen 80; - #server_name alpha.editor.p5js.org; - location / { - proxy_pass http://app:8000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } - # location ~* \/login(\/)* { - # return 301 https://$host$request_uri; - # } - # location ~* \/signup(\/)* { - # return 301 https://$host$request_uri; - # } - # location ~* \/reset-password(\/)* { - # return 301 https://$host$request_uri; - # } - # location ~* "\/[a-zA-Z0-9._-]{1,20}\/account(\/)*" { - # return 301 https://$host$request_uri; - # } - -} - -# server { -# listen 443; -# ssl on; -# ssl_certificate /etc/letsencrypt/live/alpha.editor.p5js.org/fullchain.pem; -# ssl_certificate_key /etc/letsencrypt/live/alpha.editor.p5js.org/privkey.pem; -# server_name alpha.editor.p5js.org; -# location / { -# proxy_pass http://127.0.0.1:8000; -# proxy_http_version 1.1; -# proxy_set_header Upgrade $http_upgrade; -# proxy_set_header Connection 'upgrade'; -# proxy_set_header Host $host; -# proxy_cache_bypass $http_upgrade; -# } -# } - -# server { -# listen 80; -# server_name editor.p5js.org; -# location ~ ^/(.*) { -# return 302 http://alpha.editor.p5js.org/$1; -# } -# } - -# server { -# listen 443; -# ssl on; -# ssl_certificate /etc/letsencrypt/live/editor.p5js.org/fullchain.pem; -# ssl_certificate_key /etc/letsencrypt/live/editor.p5js.org/privkey.pem; -# server_name editor.p5js.org; -# location ~ ^/(.*) { -# return 302 https://alpha.editor.p5js.org/$1; -# } -# } \ No newline at end of file From 363b9cc8d07563e2c50dd566ba2994a7caadeed3 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 27 Aug 2018 17:38:59 -0400 Subject: [PATCH 60/75] ummm now does deploy work --- .travis.yml | 7 ++++++- deploy.sh | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3efb63ec..7b74e677 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,12 @@ deploy: script: bash deploy.sh skip_cleanup: true on: - branch: master OR production-docker + branch: production-docker + - provider: script + script: bash deploy.sh + skip_cleanup: true + on: + branch: master env: global: diff --git a/deploy.sh b/deploy.sh index e15651c0..193d0cdd 100644 --- a/deploy.sh +++ b/deploy.sh @@ -5,7 +5,9 @@ set -e docker-compose build --no-cache docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_COMMIT +docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_COMMIT +docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest # echo $GCLOUD_SERVICE_KEY_PRD | base64 --decode -i > ${HOME}/gcloud-service-key.json # gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json From e332a29530821d5749a6413416c55f12f97a74a9 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 27 Aug 2018 17:42:07 -0400 Subject: [PATCH 61/75] does this fix the travis deployment???? --- deploy.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 deploy.sh diff --git a/deploy.sh b/deploy.sh old mode 100644 new mode 100755 From 0930cf96f73ff4bcebd4e92980aa3677300b3754 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 27 Aug 2018 17:59:09 -0400 Subject: [PATCH 62/75] i have no idea why travis isn't running my deploy script --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7b74e677..92eb5a3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,12 +32,12 @@ before_deploy: deploy: - provider: script - script: bash deploy.sh + script: ./deploy.sh skip_cleanup: true on: branch: production-docker - provider: script - script: bash deploy.sh + script: ./deploy.sh skip_cleanup: true on: branch: master From 49ab573eff3d92c99a731c2401cf0ded534a8943 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 27 Aug 2018 18:01:30 -0400 Subject: [PATCH 63/75] do i need to take out after_success??? --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 92eb5a3b..ac915b43 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,10 +19,8 @@ install: true script: - docker-compose exec -T app npm run test --verbose -after_success: - - docker-compose stop - before_deploy: + - docker-compose stop - if [ ! -d "$HOME/google-cloud-sdk/bin" ]; then rm -rf $HOME/google-cloud-sdk; export CLOUDSDK_CORE_DISABLE_PROMPTS=1; curl https://sdk.cloud.google.com | bash; fi - source /home/travis/google-cloud-sdk/path.bash.inc - gcloud --quiet version From cab9aa528d4ac3651e929c3cb53db020f4f17a90 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 27 Aug 2018 18:41:36 -0400 Subject: [PATCH 64/75] try to fix google cloud sdk install in travis config --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ac915b43..3a22d3c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ script: before_deploy: - docker-compose stop - - if [ ! -d "$HOME/google-cloud-sdk/bin" ]; then rm -rf $HOME/google-cloud-sdk; export CLOUDSDK_CORE_DISABLE_PROMPTS=1; curl https://sdk.cloud.google.com | bash; fi + - if [ ! -d "$HOME/google-cloud-sdk/bin" ]; then rm -rf $HOME/google-cloud-sdk; export CLOUDSDK_CORE_DISABLE_PROMPTS=1; curl https://sdk.cloud.google.com | bash >/dev/null; fi - source /home/travis/google-cloud-sdk/path.bash.inc - gcloud --quiet version - gcloud --quiet components update From 89560fdae7aec51fcab572dfc6e3fc02ce688c5f Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 27 Aug 2018 18:54:18 -0400 Subject: [PATCH 65/75] update before_deploy to remove 'beta' update which didn't work --- .travis.yml | 1 - deploy.sh | 23 ++++++++--------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3a22d3c2..d7f06105 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,6 @@ before_deploy: - source /home/travis/google-cloud-sdk/path.bash.inc - gcloud --quiet version - gcloud --quiet components update - - gcloud --quiet components beta update - gcloud --quiet components update kubectl deploy: diff --git a/deploy.sh b/deploy.sh index 193d0cdd..f79de6bd 100755 --- a/deploy.sh +++ b/deploy.sh @@ -9,22 +9,15 @@ docker tag $APP_IMAGE_NAME $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_COMMIT docker push $DOCKER_USERNAME/$DOCKER_REPOSITORY:latest -# echo $GCLOUD_SERVICE_KEY_PRD | base64 --decode -i > ${HOME}/gcloud-service-key.json -# gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json +echo $GCLOUD_SERVICE_KEY_PRD | base64 --decode -i > ${HOME}/gcloud-service-key.json +gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json -# gcloud --quiet config set project $PROJECT_NAME_PRD -# gcloud --quiet config set container/cluster $CLUSTER_NAME_PRD -# gcloud --quiet config set compute/zone ${CLOUDSDK_COMPUTE_ZONE} -# gcloud --quiet container clusters get-credentials $CLUSTER_NAME_PRD +gcloud --quiet config set project $PROJECT_NAME_PRD +gcloud --quiet config set container/cluster $CLUSTER_NAME_PRD +gcloud --quiet config set compute/zone ${CLOUDSDK_COMPUTE_ZONE} +gcloud --quiet container clusters get-credentials $CLUSTER_NAME_PRD -# gcloud docker push gcr.io/${PROJECT_NAME_PRD}/${DOCKER_IMAGE_NAME} - -# yes | gcloud beta container images add-tag gcr.io/${PROJECT_NAME_PRD}/${DOCKER_IMAGE_NAME}:$TRAVIS_COMMIT gcr.io/${PROJECT_NAME_PRD}/${DOCKER_IMAGE_NAME}:latest - -# kubectl config view -# kubectl config current-context +kubectl config view +kubectl config current-context # kubectl set image deployment/${KUBE_DEPLOYMENT_NAME} ${KUBE_DEPLOYMENT_CONTAINER_NAME}=gcr.io/${PROJECT_NAME_PRD}/${DOCKER_IMAGE_NAME}:$TRAVIS_COMMIT - -# sleep 30 -# npm run e2e_test \ No newline at end of file From c3537b32d069b8861b62973e40dcd89fc47a0d23 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Mon, 27 Aug 2018 19:08:19 -0400 Subject: [PATCH 66/75] add step to deploy to push latest image to kubernetes cluster --- Dockerfile | 13 ------------- deploy.sh | 2 +- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/Dockerfile b/Dockerfile index 73d09545..9460983d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,19 +4,6 @@ ENV APP_HOME=/usr/src/app \ RUN mkdir -p $APP_HOME WORKDIR $APP_HOME EXPOSE 8000 -# EXPOSE 80 -# EXPOSE 443 -ARG API_URL -ARG S3_BUCKET -ARG AWS_REGION -ARG S3_BUCKET_URL_BASE -ARG FORCE_TO_HTTPS - -ENV API_URL=$API_URL -ENV S3_BUCKET=$S3_BUCKET -ENV AWS_REGION=$AWS_REGION -ENV S3_BUCKET_URL_BASE=$S3_BUCKET_URL_BASE -ENV FORCE_TO_HTTPS=$FORCE_TO_HTTPS FROM base as development ENV NODE_ENV development diff --git a/deploy.sh b/deploy.sh index f79de6bd..9ef39a8b 100755 --- a/deploy.sh +++ b/deploy.sh @@ -20,4 +20,4 @@ gcloud --quiet container clusters get-credentials $CLUSTER_NAME_PRD kubectl config view kubectl config current-context -# kubectl set image deployment/${KUBE_DEPLOYMENT_NAME} ${KUBE_DEPLOYMENT_CONTAINER_NAME}=gcr.io/${PROJECT_NAME_PRD}/${DOCKER_IMAGE_NAME}:$TRAVIS_COMMIT +kubectl set image deployment/${KUBE_DEPLOYMENT_NAME} ${KUBE_DEPLOYMENT_CONTAINER_NAME}=index.docker.io/$DOCKER_USERNAME/$DOCKER_REPOSITORY:$TRAVIS_COMMIT From b5a32d79fae7595bd991221181de300b45ee677f Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Tue, 28 Aug 2018 14:47:05 -0400 Subject: [PATCH 67/75] update kubernetes config to include cronjobs to fetch examples --- Dockerfile | 10 +--------- kubernetes/app.yml | 50 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9460983d..9ac483dc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,13 +24,5 @@ ENV NODE_ENV=production COPY package.json package-lock.json index.js ./ RUN npm install --production RUN npm rebuild node-sass -# RUN npm install pm2 -g -# RUN npm install local-ssl-proxy -# COPY index.js ecosystem.json ./ -COPY --from=build /usr/src/app/dist ./dist -# for reg production +COPY --from=build $APP_HOME/dist ./dist CMD ["npm", "run", "start:prod"] -# for production with pm2 -# CMD ["pm2-runtime", "ecosystem.json"] -# for testing ssl locally -# CMD npm run ssl-proxy && pm2-runtime ecosystem.json diff --git a/kubernetes/app.yml b/kubernetes/app.yml index 3444e2fc..7e523f6c 100644 --- a/kubernetes/app.yml +++ b/kubernetes/app.yml @@ -61,4 +61,52 @@ spec: httpGet: path: /health port: 8000 - +--- +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + annotations: + name: web-editor-node + namespace: default +spec: + maxReplicas: 6 + minReplicas: 1 + scaleTargetRef: + apiVersion: extensions/v1beta1 + kind: Deployment + name: web-editor-node + targetCPUUtilizationPercentage: 80 +--- +# cronjob for p5.js examples +apiVersion: batch/v1beta1 +kind: CronJob +metadata: + name: fetch-examples-job +spec: + schedule: "0 0 * * 0" + jobTemplate: + spec: + template: + spec: + containers: + - name: fetch-examples + image: index.docker.io/catarak/p5.js-web-editor:latest + command: ["npm", "run", "fetch-examples:prod"] + restartPolicy: OnFailure +--- +# cronjob for generative gestaltung p5.js examples +apiVersion: batch/v1beta1 +kind: CronJob +metadata: + name: fetch-examples-gg-job +spec: + schedule: "30 0 * * 0" + jobTemplate: + spec: + template: + spec: + containers: + - name: fetch-examples-gg + image: index.docker.io/catarak/p5.js-web-editor:latest + command: ["npm", "run", "fetch-examples-gg:prod"] + restartPolicy: OnFailure From 7cb2847b944f6d1b1530b9bdf83df4ccca63a158 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 30 Aug 2018 19:35:03 -0400 Subject: [PATCH 68/75] fix error with undefined env S3_URL_BUCKER_BASE --- client/modules/IDE/actions/uploader.js | 8 ++++---- server/views/index.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/modules/IDE/actions/uploader.js b/client/modules/IDE/actions/uploader.js index 913f3aa9..a15d32d7 100644 --- a/client/modules/IDE/actions/uploader.js +++ b/client/modules/IDE/actions/uploader.js @@ -59,10 +59,10 @@ export function dropzoneAcceptCallback(userId, file, done) { } ) .then((response) => { - file.custom_status = 'ready'; // eslint-disable-line - file.postData = response.data; // eslint-disable-line - file.s3 = response.data.key; // eslint-disable-line - file.previewTemplate.className += ' uploading'; // eslint-disable-line + file.custom_status = 'ready'; // eslint-disable-line + file.postData = response.data; // eslint-disable-line + file.s3 = response.data.key; // eslint-disable-line + file.previewTemplate.className += ' uploading'; // eslint-disable-line done(); }) .catch((response) => { diff --git a/server/views/index.js b/server/views/index.js index 213778f5..7e9a0e2c 100644 --- a/server/views/index.js +++ b/server/views/index.js @@ -25,7 +25,7 @@ export function renderIndex() { window.process.env.API_URL = '${process.env.API_URL}'; window.process.env.NODE_ENV = '${process.env.NODE_ENV}'; window.process.env.S3_BUCKET = '${process.env.S3_BUCKET}'; - window.process.env.S3_BUCKET_URL_BASE = '${process.env.S3_BUCKET_URL_BASE}'; + window.process.env.S3_BUCKET_URL_BASE = ${process.env.S3_BUCKET_URL_BASE ? `'${process.env.S3_BUCKET_URL_BASE}'` : undefined}; window.process.env.AWS_REGION = '${process.env.AWS_REGION}'; window.process.env.FORCE_TO_HTTPS = ${process.env.FORCE_TO_HTTPS === 'false' ? false : undefined}; window.process.env.CLIENT = true; From 0f0be1f95689338e93023498c91cf2e87d959508 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Thu, 30 Aug 2018 21:00:29 -0400 Subject: [PATCH 69/75] fix file uploads by updating mongoose --- package-lock.json | 323 +++++++++++++++++++-------------------- package.json | 2 +- server/models/project.js | 4 +- 3 files changed, 156 insertions(+), 173 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5bd4a73..27506023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10908,6 +10908,11 @@ "electron-to-chromium": "1.3.45" } }, + "bson": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", + "integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg==" + }, "bson-objectid": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/bson-objectid/-/bson-objectid-1.2.2.tgz", @@ -10929,6 +10934,11 @@ "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", "dev": true }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -16472,6 +16482,11 @@ "os-tmpdir": "1.0.1" } }, + "hooks-fixed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", + "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", @@ -18033,6 +18048,11 @@ "array-includes": "3.0.3" } }, + "kareem": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", + "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -18277,6 +18297,11 @@ "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "lodash.mergewith": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", @@ -21763,187 +21788,104 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" }, - "mongoose": { - "version": "4.4.16", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.4.16.tgz", - "integrity": "sha1-lgYn8neqa8tUDDbQaBgGLXD4iwY=", + "mongodb": { + "version": "2.2.34", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.34.tgz", + "integrity": "sha1-o09Zu+thdUrsQy3nLD/iFSakTBo=", "requires": { - "async": "1.5.2", - "bson": "0.4.23", - "hooks-fixed": "1.1.0", - "kareem": "1.0.1", - "mongodb": "2.1.18", - "mpath": "0.2.1", - "mpromise": "0.5.5", - "mquery": "1.10.0", - "ms": "0.7.1", - "muri": "1.1.0", - "regexp-clone": "0.0.1", - "sliced": "1.0.1" + "es6-promise": "3.2.1", + "mongodb-core": "2.1.18", + "readable-stream": "2.2.7" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" }, - "bson": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/bson/-/bson-0.4.23.tgz", - "integrity": "sha1-5louPHUH/63kEJvHV1p25Q+NqRU=" - }, - "hooks-fixed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-1.1.0.tgz", - "integrity": "sha1-DowVM2cI5mERhf45C0RofdUjDbs=" - }, - "kareem": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.0.1.tgz", - "integrity": "sha1-eAXSFbtTIU7Dr5aaHQsfF+PnuVw=" - }, - "mongodb": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.1.18.tgz", - "integrity": "sha1-KNQLUVsr5NWmn/3UxTXw30MuQJc=", + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", "requires": { - "es6-promise": "3.0.2", - "mongodb-core": "1.3.18", - "readable-stream": "1.0.31" - }, - "dependencies": { - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=" - }, - "mongodb-core": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-1.3.18.tgz", - "integrity": "sha1-kGhLO3xzVtZa41Y5HTCw8kiATHo=", - "requires": { - "bson": "0.4.23", - "require_optional": "1.0.0" - }, - "dependencies": { - "require_optional": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.0.tgz", - "integrity": "sha1-UqhhN6hJco62ClVTNhf4+RT1mr8=", - "requires": { - "resolve-from": "2.0.0", - "semver": "5.1.0" - }, - "dependencies": { - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, - "semver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", - "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" - } - } - } - } - }, - "readable-stream": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz", - "integrity": "sha1-jyUC4LyeOw2huUUgqrtOJgPsr64=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - } + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, - "mpath": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.2.1.tgz", - "integrity": "sha1-Ok6Ck1mAHeljCcJ6ay4QLon56W4=" - }, - "mpromise": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", - "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" - }, - "mquery": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-1.10.0.tgz", - "integrity": "sha1-hgPwKwtSTResBTmoWZYSTuF7fLM=", + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "bluebird": "2.10.2", - "debug": "2.2.0", - "regexp-clone": "0.0.1", - "sliced": "0.0.5" - }, - "dependencies": { - "bluebird": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", - "integrity": "sha1-AkpVFylTCIV/FPkfEQb8O1VfRGs=" - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "sliced": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", - "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" - } + "safe-buffer": "5.1.2" } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - }, - "muri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/muri/-/muri-1.1.0.tgz", - "integrity": "sha1-o6bXTmiogPQzokmnSWnLtmXMCt0=" - }, - "regexp-clone": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", - "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + } + } + }, + "mongodb-core": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.18.tgz", + "integrity": "sha1-TEYTm986HwMt7ZHbSfOO7AFlkFA=", + "requires": { + "bson": "1.0.9", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "4.13.17", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.13.17.tgz", + "integrity": "sha512-VGeSP5O3k9HUXsNm9AocdAlVbfaHV/RHgHc8Jfvwr0D0ZyzgJ3JJ+MKSmz+omicNOhBsmpBEL1zVHM2uIj8tDQ==", + "requires": { + "async": "2.6.0", + "bson": "1.0.9", + "hooks-fixed": "2.0.2", + "kareem": "1.5.0", + "lodash.get": "4.4.2", + "mongodb": "2.2.34", + "mpath": "0.5.1", + "mpromise": "0.5.5", + "mquery": "2.3.3", + "ms": "2.0.0", + "muri": "1.3.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + } + }, + "mpath": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.5.1.tgz", + "integrity": "sha512-H8OVQ+QEz82sch4wbODFOz+3YQ61FYz/z3eJ5pIdbMEaUzDqA268Wd+Vt4Paw9TJfvDgVKaayC0gBzMIw2jhsg==" + }, + "mpromise": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", + "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" + }, + "mquery": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.3.tgz", + "integrity": "sha512-NC8L14kn+qxJbbJ1gbcEMDxF0sC3sv+1cbRReXXwVvowcwY1y9KoVZFq0ebwARibsadu8lx8nWGvm3V0Pf0ZWQ==", + "requires": { + "bluebird": "3.5.0", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" }, "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" } } }, @@ -21952,6 +21894,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "muri": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", + "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -26830,6 +26777,11 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, "progress": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", @@ -28076,6 +28028,11 @@ "safe-regex": "1.1.0" } }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -28549,6 +28506,27 @@ "resolve-from": "1.0.1" } }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.5.1" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + } + } + }, "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", @@ -29038,6 +29016,11 @@ } } }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, "slugify": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.2.9.tgz", diff --git a/package.json b/package.json index 283983df..14ae46a5 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "loop-protect": "github:catarak/loop-protect", "mjml": "^3.3.2", "moment": "^2.14.1", - "mongoose": "^4.4.16", + "mongoose": "^4.6.8", "node-uuid": "^1.4.7", "nodemailer": "^2.6.4", "nodemailer-mailgun-transport": "^1.2.2", diff --git a/server/models/project.js b/server/models/project.js index ac70fc5b..c1a255d8 100644 --- a/server/models/project.js +++ b/server/models/project.js @@ -11,7 +11,7 @@ const fileSchema = new Schema({ children: { type: [String], default: [] }, fileType: { type: String, default: 'file' }, isSelectedFile: { type: Boolean } -}, { timestamps: true, _id: true }); +}, { timestamps: true, _id: true, usePushEach: true }); fileSchema.virtual('id').get(function getFileId() { return this._id.toHexString(); @@ -28,7 +28,7 @@ const projectSchema = new Schema({ files: { type: [fileSchema] }, _id: { type: String, default: shortid.generate }, slug: { type: String } -}, { timestamps: true }); +}, { timestamps: true, usePushEach: true }); projectSchema.virtual('id').get(function getProjectId() { return this._id; From 02c7c2f26d4aff998b18d7ff1b31e989c90c1352 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 5 Sep 2018 15:34:53 -0400 Subject: [PATCH 70/75] fix mongo connection so that deprecation warning doesn't appear --- server/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server.js b/server/server.js index 3462353e..d6f4ff85 100644 --- a/server/server.js +++ b/server/server.js @@ -137,7 +137,7 @@ require('./config/passport'); // const passportConfig = require('./config/passport'); // Connect to MongoDB -mongoose.connect(mongoConnectionString); +mongoose.connect(mongoConnectionString, { useMongoClient: true }); mongoose.connection.on('error', () => { console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); process.exit(1); From 545d4aec5f97a3365186f1fc733ea6a3ca115807 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 5 Sep 2018 18:09:18 -0400 Subject: [PATCH 71/75] fix mongo connection URL for example fetch scripts --- server/scripts/examples-gg-latest.js | 2 +- server/scripts/examples.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/scripts/examples-gg-latest.js b/server/scripts/examples-gg-latest.js index 251c5315..f06a4000 100644 --- a/server/scripts/examples-gg-latest.js +++ b/server/scripts/examples-gg-latest.js @@ -67,7 +67,7 @@ canvas { const headers = { 'User-Agent': 'p5js-web-editor/0.0.1' }; let mongoConnectionString; -if (process.env.NODE_ENV === 'production') { +if (process.env.NODE_ENV === 'production' && process.env.MONGO_RW_USERNAME && process.env.MONGO_RW_PASSWORD) { const { MONGO_RW_USERNAME, MONGO_RW_PASSWORD, diff --git a/server/scripts/examples.js b/server/scripts/examples.js index 2bdf37ce..cce7cd43 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -37,7 +37,7 @@ const clientSecret = process.env.GITHUB_SECRET; const headers = { 'User-Agent': 'p5js-web-editor/0.0.1' }; let mongoConnectionString; -if (process.env.NODE_ENV === 'production') { +if (process.env.NODE_ENV === 'production' && process.env.MONGO_RW_USERNAME && process.env.MONGO_RW_PASSWORD) { const { MONGO_RW_USERNAME, MONGO_RW_PASSWORD, From 8be04ac81713aa8b7ae5de66a046d94dfb26959d Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 7 Sep 2018 15:29:47 -0400 Subject: [PATCH 72/75] update fetch example scripts connection to mongodb, add pulling env variables from secret to kubernetes config --- kubernetes/app.yml | 12 ++++++++++-- server/scripts/examples-gg-latest.js | 2 +- server/scripts/examples.js | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/kubernetes/app.yml b/kubernetes/app.yml index 7e523f6c..3054d6a7 100644 --- a/kubernetes/app.yml +++ b/kubernetes/app.yml @@ -92,7 +92,11 @@ spec: - name: fetch-examples image: index.docker.io/catarak/p5.js-web-editor:latest command: ["npm", "run", "fetch-examples:prod"] - restartPolicy: OnFailure + imagePullPolicy: Always + envFrom: + - secretRef: + name: web-editor-credentials + restartPolicy: Never --- # cronjob for generative gestaltung p5.js examples apiVersion: batch/v1beta1 @@ -109,4 +113,8 @@ spec: - name: fetch-examples-gg image: index.docker.io/catarak/p5.js-web-editor:latest command: ["npm", "run", "fetch-examples-gg:prod"] - restartPolicy: OnFailure + imagePullPolicy: Always + envFrom: + - secretRef: + name: web-editor-credentials + restartPolicy: Never diff --git a/server/scripts/examples-gg-latest.js b/server/scripts/examples-gg-latest.js index f06a4000..909d7ceb 100644 --- a/server/scripts/examples-gg-latest.js +++ b/server/scripts/examples-gg-latest.js @@ -82,7 +82,7 @@ if (process.env.NODE_ENV === 'production' && process.env.MONGO_RW_USERNAME && pr } else { mongoConnectionString = process.env.MONGO_URL; } -mongoose.connect(mongoConnectionString); +mongoose.connect(mongoConnectionString, { useMongoClient: true }); mongoose.connection.on('error', () => { console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); process.exit(1); diff --git a/server/scripts/examples.js b/server/scripts/examples.js index cce7cd43..2017e7da 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -53,7 +53,7 @@ if (process.env.NODE_ENV === 'production' && process.env.MONGO_RW_USERNAME && pr mongoConnectionString = process.env.MONGO_URL; } -mongoose.connect(mongoConnectionString); +mongoose.connect(mongoConnectionString, { useMongoClient: true }); mongoose.connection.on('error', () => { console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); process.exit(1); From a7e3c316a1ec769e209ba4757fee1ce226f88ae7 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Sun, 9 Sep 2018 14:06:23 -0400 Subject: [PATCH 73/75] remove example cronjobs for now since they don't work --- kubernetes/app.yml | 84 +++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/kubernetes/app.yml b/kubernetes/app.yml index 3054d6a7..c27d42a4 100644 --- a/kubernetes/app.yml +++ b/kubernetes/app.yml @@ -76,45 +76,45 @@ spec: kind: Deployment name: web-editor-node targetCPUUtilizationPercentage: 80 ---- -# cronjob for p5.js examples -apiVersion: batch/v1beta1 -kind: CronJob -metadata: - name: fetch-examples-job -spec: - schedule: "0 0 * * 0" - jobTemplate: - spec: - template: - spec: - containers: - - name: fetch-examples - image: index.docker.io/catarak/p5.js-web-editor:latest - command: ["npm", "run", "fetch-examples:prod"] - imagePullPolicy: Always - envFrom: - - secretRef: - name: web-editor-credentials - restartPolicy: Never ---- -# cronjob for generative gestaltung p5.js examples -apiVersion: batch/v1beta1 -kind: CronJob -metadata: - name: fetch-examples-gg-job -spec: - schedule: "30 0 * * 0" - jobTemplate: - spec: - template: - spec: - containers: - - name: fetch-examples-gg - image: index.docker.io/catarak/p5.js-web-editor:latest - command: ["npm", "run", "fetch-examples-gg:prod"] - imagePullPolicy: Always - envFrom: - - secretRef: - name: web-editor-credentials - restartPolicy: Never +# --- +# # cronjob for p5.js examples +# apiVersion: batch/v1beta1 +# kind: CronJob +# metadata: +# name: fetch-examples-job +# spec: +# schedule: "0 0 * * 0" +# jobTemplate: +# spec: +# template: +# spec: +# containers: +# - name: fetch-examples +# image: index.docker.io/catarak/p5.js-web-editor:latest +# command: ["npm", "run", "fetch-examples:prod"] +# imagePullPolicy: Always +# envFrom: +# - secretRef: +# name: web-editor-credentials +# restartPolicy: Never +# --- +# # cronjob for generative gestaltung p5.js examples +# apiVersion: batch/v1beta1 +# kind: CronJob +# metadata: +# name: fetch-examples-gg-job +# spec: +# schedule: "30 0 * * 0" +# jobTemplate: +# spec: +# template: +# spec: +# containers: +# - name: fetch-examples-gg +# image: index.docker.io/catarak/p5.js-web-editor:latest +# command: ["npm", "run", "fetch-examples-gg:prod"] +# imagePullPolicy: Always +# envFrom: +# - secretRef: +# name: web-editor-credentials +# restartPolicy: Never From 8495a59e36f83b09ce44722bc0c4b9ce41be027a Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Wed, 26 Sep 2018 16:14:06 -0400 Subject: [PATCH 74/75] Development documentation (#705) * delete unused files, move webpack configs to their own directory * start of improved developer documentation, moving everything to developer_docs/ directory * documentation updates --- .env.example | 5 - .eslintignore | 2 +- .github/CONTRIBUTING.md | 33 +---- Dockerfile | 3 +- Dockerfile-development | 20 --- README.md | 130 ++---------------- backup.sh | 57 -------- developer_docs/README.md | 12 ++ developer_docs/accessibility.md | 20 +++ developer_docs/deployment.md | 22 +++ developer_docs/development.md | 25 ++++ developer_docs/installation.md | 78 +++++++++++ developer_docs/preparing_a_pull_request.md | 47 +++++++ docker-compose-development.yml | 2 +- docker-compose.yml | 30 +--- ecosystem.json | 9 -- index.js | 2 +- kubernetes/app.yml => kubernetes_app.yml | 0 mongo/init.sh | 1 - package.json | 9 +- server/scripts/examples-gg-latest.js | 18 +-- server/scripts/examples.js | 17 +-- server/server.js | 19 +-- .../config.babel.js | 0 .../config.dev.js | 6 +- .../config.examples.js | 12 +- .../config.prod.js | 9 +- .../config.server.js | 6 +- 28 files changed, 257 insertions(+), 337 deletions(-) delete mode 100644 Dockerfile-development delete mode 100755 backup.sh create mode 100644 developer_docs/README.md create mode 100644 developer_docs/accessibility.md create mode 100644 developer_docs/deployment.md create mode 100644 developer_docs/development.md create mode 100644 developer_docs/installation.md create mode 100644 developer_docs/preparing_a_pull_request.md delete mode 100644 ecosystem.json rename kubernetes/app.yml => kubernetes_app.yml (100%) delete mode 100644 mongo/init.sh rename webpack.config.babel.js => webpack/config.babel.js (100%) rename webpack.config.dev.js => webpack/config.dev.js (93%) rename webpack.config.examples.js => webpack/config.examples.js (78%) rename webpack.config.prod.js => webpack/config.prod.js (93%) rename webpack.config.server.js => webpack/config.server.js (83%) diff --git a/.env.example b/.env.example index 0c80d768..3bfd7e50 100644 --- a/.env.example +++ b/.env.example @@ -1,10 +1,5 @@ API_URL=/api MONGO_URL=mongodb://localhost:27017/p5js-web-editor -MONGO_HOSTNAME=localhost -MONGO_PORT=27017 -MONGO_NAME=p5js-web-editor -MONGO_ROOT_USERNAME=processing_user -MONGO_ROOT_PASSWORD= PORT=8000 SESSION_SECRET=whatever_you_want_this_to_be_it_only_matters_for_production AWS_ACCESS_KEY= diff --git a/.eslintignore b/.eslintignore index 8d1287fa..017248a5 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,2 @@ -webpack.config.js +webpack/* index.js \ No newline at end of file diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0d74b0fb..870f11fc 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,17 +1,12 @@ -# Contributing to the p5.js web editor +# Contributing to the p5.js Web Editor -Hello! We welcome community contributions to the p5.js web editor. Contributing takes many forms and doesn't have to be **writing code**, it can be **documenting bugs**, **proposing new features**, and **updating documentation**. We would also like to Thank you for choosing to contribute p5.js web editor, any way possible. You are awesome! :blush: - -This **web editor** for **p5.js**, a JavaScript library with the goal of making coding accessible to **artists**, **designers**, **educators**, and **beginners**, is an environment to make p5.js sketches without needing to download any software or do any configuration, which makes it a great place to start learning how to code and start learning p5.js. +Hello! We welcome community contributions to the p5.js Web Editor. Contributing takes many forms and doesn't have to be **writing code**, it can be **report bugs**, **proposing new features**, **creating UI/UX designs**, and **updating documentation**. Here are links to all the sections in this document: - [Code of Conduct](#code-of-conduct) -- [Technologies Used](#technologies-used) -- [Development Installation](#development-installation) -- [New Design](#new-design) - [How Can I Contribute ?](#how-can-i-contribute?) - [First Timers](#first-timers) - [Want something more challenging](#want-something-more-challenging) @@ -23,30 +18,6 @@ Here are links to all the sections in this document: Please follow the guidelines mentioned at [CODE OF CONDUCT.md](https://github.com/processing/p5.js-web-editor/blob/master/CODE_OF_CONDUCT.md#p5js-code-of-conduct). -# Technologies Used - - > **MERN stack - MongoDB, Express, React/Redux, and Node**. - - - For a reference to the **file structure format** I am using, please look at the [Mern Starter](https://github.com/Hashnode/mern-starter). - - - This project **does not use CSS Modules, but uses Sass**. [BEM guidelines and naming conventions](http://getbem.com/) are followed. - - - For repeatitive and common styles, write OOSCSS (Object-Oriented SCSS) with placeholders and mixins. For organizing styles, follow the 7-1 Pattern for Sass. - - - We're using [ES6](http://es6-features.org/) and transpiling to ES5 using [Babel](https://babeljs.io/). - - - For reference to the JavaScript style guide, see the [Airbnb Style Guide](https://github.com/airbnb/javascript), [React ESLint Plugin](https://github.com/yannickcr/eslint-plugin-react). - - - The ESLint configuration is based on a few popular React/Redux boilerplates. Open to suggestions on this. If in development, **you're getting annoyed with ESLint**, you can **remove** it from `webpack.config.dev.js` in the JavaScript loader, or disable any line from eslint by commenting at the end of the line `// eslint-disable-line`. - -# Development Installation - -To get started on a patch, first read the instruction from [README.md](https://github.com/processing/p5.js-web-editor#development-installation). - -# New Design - -Design proposed and theme changes are present at: [Zeplin](https://scene.zeplin.io/project/55f746c54a02e1e50e0632c3). - # How Can I Contribute? ### First Timers diff --git a/Dockerfile b/Dockerfile index 9ac483dc..51864673 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,8 @@ ENV NODE_ENV development COPY package.json package-lock.json ./ RUN npm install RUN npm rebuild node-sass -COPY .babelrc index.js nodemon.json webpack.config.babel.js webpack.config.dev.js webpack.config.prod.js webpack.config.server.js webpack.config.examples.js ./ +COPY .babelrc index.js nodemon.json ./ +COPY ./webpack ./webpack COPY client ./client COPY server ./server CMD ["npm", "start"] diff --git a/Dockerfile-development b/Dockerfile-development deleted file mode 100644 index a1330f5c..00000000 --- a/Dockerfile-development +++ /dev/null @@ -1,20 +0,0 @@ -FROM node:8.11.1 - -ENV APP_HOME=/opt/node/app \ - TERM=xterm - -# Copy in the project files and set as working directory -ADD . $APP_HOME -WORKDIR $APP_HOME - -# Install node modules -RUN npm install - -# Rebuild node-sass just to be safe -RUN npm rebuild node-sass - -# For development, mark the directory as a mount override point -VOLUME $APP_HOME - -# Expose default server port -EXPOSE 8000 diff --git a/README.md b/README.md index 667e5988..d4ee0ebf 100644 --- a/README.md +++ b/README.md @@ -1,127 +1,23 @@ -# p5.js Web Editor +# [p5.js Web Editor](https://editor.p5js.org) -This project is currently in development! It will be announced when there is a (public) beta release. +The p5.js Web Editor is an in-browser code editor for creating [p5.js](https://p5js.org/) sketches. p5.js, which is a separate project, is a JavaScript library with the goal of making coding accessible for artists, designers, educators, and beginners, and the web editor shares this same spirit. It is designed with the benginner in mind—when using the web editor, you don't need to download or configure anything, you can simply open the website, and start writing code. You can also host their work online and share it with others. -## Development Installation +The p5.js Web Editor is currently in active development, and looking for contributions of any type! Please check out the [contribution guide](https://github.com/processing/p5.js-web-editor/blob/master/.github/CONTRIBUTING.md) for more details. -1. Fork this repository. -2. Clone the forked repository and cd into it -3. `$ npm install` -4. Install MongoDB and make sure it is running - * For Mac OSX with [homebrew](http://brew.sh/): `brew install mongodb` then `brew services start mongodb` - * For Windows and Linux: [MongoDB Installation](https://docs.mongodb.com/manual/installation/) -5. `$ cp .env.example .env` -6. (Optional) Update `.env` with necessary keys to enable certain app behavoirs, i.e. add Github ID and Github Secret if you want to be able to log in with Github. -7. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' -8. `$ npm start` -9. Navigate to [http://localhost:8000](http://localhost:8000) in your browser -10. Install the [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en) -11. Open and close the Redux DevTools using `ctrl+h`, and move them with `ctrl+w` +If you have found a bug in the p5.js Web Editor, you can file it under the ["issues" tab](https://github.com/processing/p5.js-web-editor/issues). -### Testing SSL on your local machine -Please refer to [this gist](https://gist.github.com/andrewn/953ffd5cb17ac2634dc969fc7bdaff3f). This allows you to access the editor using both HTTP and HTTPS. Don't worry about this unless you need to make changes or test HTTPS behavior. +## Issues -The automatic redirection to HTTPS is turned off by default in development. If you need to test this behavior, put `FORCE_TO_HTTPS=true` in your `.env` file. +Please post bugs and feature requests in the correct repository: -## Development Installation using Docker +* p5.js general and p5.dom: [https://github.com/processing/p5.js/issues](https://github.com/processing/p5.js/issues) +* p5.accessibility: [https://github.com/processing/p5.accessibility/issues](https://github.com/processing/p5.accessibility/issues) +* p5.sound: [https://github.com/processing/p5.js-sound/issues](https://github.com/processing/p5.js-sound/issues) +* p5.js website: [https://github.com/processing/p5.js-website/issues](https://github.com/processing/p5.js-website/issues) -Using Docker, you can have a complete, consistent development environment without having to manually install dependencies such as Node, Mongo, etc. It also helps isolate these dependencies and their data from other projects that you may have on the same computer that use different/conflicting versions, etc. +## Get Involved -Note that this takes up a significant amount of space on your machine. Make sure you have at least 5GB free. +The p5.js Web Editor is a collaborative project created by many individuals, and you are invited to help. All types of involvement are welcome. You can start with the [p5.js community section](https://p5js.org/community), which also applies to this project. -1. Install Docker for your operating system - * Mac: https://www.docker.com/docker-mac - * Windows: https://www.docker.com/docker-windows -2. Clone this repository and cd into it -3. `$ docker-compose -f docker-compose-development.yml build` -4. `$ docker-compose -f docker-compose-development.yml run --rm app npm run fetch-examples` +Developers, check the [developer docs](https://github.com/processing/p5.js-web-editor/blob/master/developer_docs/) details about contributing code, bug fixes, and documentation. -Now, anytime you wish to start the server with its dependencies, you can run: - -5. `$ docker-compose -f docker-compose-development.yml up` -6. Navigate to [http://localhost:8000](http://localhost:8000) in your browser - -To open a terminal/shell in the running Docker server (i.e. after `docker-compose up` has been run): - -7. `$ docker-compose -f docker-compose-development.yml exec app bash -l` - -If you don't have the full server environment running, you can launch a one-off container instance (and have it automatically deleted after you're done using it): - -8. `$ docker-compose -f docker-compose-development.yml run app --rm bash -l` - -## Production Installation -1. Clone this repository and `cd` into it -2. `$ npm install` -3. Install MongoDB and make sure it is running -4. `$ cp .env.example .env` -5. (NOT Optional) edit `.env` and fill in all necessart values. -6. `$ npm run fetch-examples` - this downloads the example sketches into a user called 'p5' -7. `$ npm run build` -8. `$ npm run start:prod` - -### For Production Setup with PM2 -1. `$ npm install -g pm2` -2. `$ pm2 start ecosystem.json` - -## S3 Bucket Configuration - -Please refer to the folllowing [gist](https://gist.github.com/catarak/70c9301f0fd1ac2d6b58de03f61997e3) to set up an S3 bucket to be used with this project. - - -If your S3 bucket is in the US East (N Virginia) region (us-east-1), you'll -need to set a custom URL base for it, because it does not follow the standard -naming pattern as the rest of the regions. Instead, add the following to your -environment/.env file: - -`S3_BUCKET_URL_BASE=https://s3.amazonaws.com` - -If you've configured your S3 bucket and DNS records to use a custom domain -name, you can also set it using this variable. I.e.: - -`S3_BUCKET_URL_BASE=https://files.mydomain.com` - -For more information on using a custom domain, see this documentation link: - -http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html#VirtualHostingCustomURLs - -## Accessibility Guidelines - -Here is guide on [how to use the accessible editor](https://gist.github.com/MathuraMG/e86666b7b41fbc8c078bad9aff3f666d) and here is an overview of the [p5-accessibility.js](https://github.com/processing/p5.accessibility) library that makes p5.js sketches accessible to screen readers. - -The code for the p5.js web editor adheres to web accessibility standards. The following guidelines will help to ensure that accessibility continues to be a priority as development continues. - -**Code Structure** - -* Screen Readers are an assistive technology for vision loss which helps users to navigate a web page. They are able to prioritize content based on the semantic meaning of HTML tags. Therefore, it is important to use specific tags, such as `nav`, `ul`, `li`, `section`, and so on. `div` is the least screen reader friendly tag. For example, [here is the semantic meaning of the `body` tag](http://html5doctor.com/element-index/#body) -* All buttons/links/windows need to be accessible by the keyboard ( By tabbing, pressing space etc.) -* In cases where tags are not screen reader friendly, we can take advantage of [tabIndex](http://webaim.org/techniques/keyboard/tabindex). Using tabIndex ensures that all elements are accessible via keyboard. [code example](https://github.com/processing/p5.js-web-editor/blob/master/client/modules/IDE/components/Editor.jsx#L249) -* When opening a new window or pop up window, ensure the keyboard focus also moves to the new window. [code example](https://github.com/processing/p5.js-web-editor/blob/master/client/modules/IDE/components/NewFileForm.jsx#L16) - -**Labeling** - -* When creating button icons, images, or something without text (this does not include an HTML5 `