This commit is contained in:
ibesoft
2019-09-09 14:01:23 +01:00
34 changed files with 6368 additions and 850 deletions

View File

@@ -7,190 +7,194 @@
# Define stages
stages:
- BuildAndTest
- E2E
# - BuildAndTest
# - E2E
- DeployStaging
- DeployProduction
- SmokeTest
- Rollback
##BACKEND
lint_n_audit_backend:
stage: BuildAndTest
script:
- cd backend
- npm install --dev
- npm run lint
# - npm run audit
- cd ..
# lint_n_audit_backend:
# stage: BuildAndTest
# script:
# - cd backend
# - npm install --dev
# - npm run lint
# # - npm run audit
# - cd ..
build_n_test_backend:
stage: BuildAndTest
script:
- sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
- sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
- sudo docker run --name fyipe --network container:mongo fyipe-project/backend:3.0.$CI_PIPELINE_IID npm test
# build_n_test_backend:
# stage: BuildAndTest
# script:
# - sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
# - sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
# - sudo docker run --name fyipe --network container:mongo fyipe-project/backend:3.0.$CI_PIPELINE_IID npm test
##DASHBOARD
lint_n_audit_dashboard:
stage: BuildAndTest
script:
- cd dashboard
- npm install --dev
- npm run lint
# - npm run audit
- cd ..
# ##DASHBOARD
# lint_n_audit_dashboard:
# stage: BuildAndTest
# script:
# - cd dashboard
# - npm install --dev
# - npm run lint
# # - npm run audit
# - cd ..
build_n_test_dashboard:
stage: BuildAndTest
script:
- echo "Setup machine for running puppeteer tests"
- sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
- sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
- sudo docker run --env-file ./backend/.env.development --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/accounts:3.0.$CI_PIPELINE_IID ./accounts
- sudo docker run -p 3003:3003 -d fyipe-project/accounts:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/dashboard:3.0.$CI_PIPELINE_IID ./dashboard
- sudo docker run -p 3000:3000 -d fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
- sudo docker ps
- cd dashboard
- npm install
- npm run jest
# build_n_test_dashboard:
# stage: BuildAndTest
# script:
# - echo "Setup machine for running puppeteer tests"
# - sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
# - sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
# - sudo docker run --env-file ./backend/.env.development --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/accounts:3.0.$CI_PIPELINE_IID ./accounts
# - sudo docker run -p 3003:3003 -d fyipe-project/accounts:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/dashboard:3.0.$CI_PIPELINE_IID ./dashboard
# - sudo docker run -p 3000:3000 -d fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
# - sudo docker ps
# - cd dashboard
# - npm install
# - npm run jest
##ZAPIER
lint_n_audit_zapier:
stage: BuildAndTest
script:
- cd zapier
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# ##ZAPIER
# lint_n_audit_zapier:
# stage: BuildAndTest
# script:
# - cd zapier
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
build_n_test_zapier:
stage: BuildAndTest
script:
- echo "No test implemented"
# build_n_test_zapier:
# stage: BuildAndTest
# script:
# - echo "No test implemented"
## STATUS PAGE
lint_n_audit_statuspage:
stage: BuildAndTest
script:
- cd status-page
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# ## STATUS PAGE
# lint_n_audit_statuspage:
# stage: BuildAndTest
# script:
# - cd status-page
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
build_n_test_statuspage:
stage: BuildAndTest
script:
- echo "Setup machine for running puppeteer tests"
- sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
- sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
- sudo docker run --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/status-page:3.0.$CI_PIPELINE_IID ./status-page
- sudo docker run -p 3006:3006 -d fyipe-project/status-page:3.0.$CI_PIPELINE_IID
- sudo docker ps
- cd backend
- npm install
- cd ..
- cd status-page
- npm install
- curl localhost:3006
- npm run jest
# build_n_test_statuspage:
# stage: BuildAndTest
# script:
# - echo "Setup machine for running puppeteer tests"
# - sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
# - sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
# - sudo docker run --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/status-page:3.0.$CI_PIPELINE_IID ./status-page
# - sudo docker run -p 3006:3006 -d fyipe-project/status-page:3.0.$CI_PIPELINE_IID
# - sudo docker ps
# - cd backend
# - npm install
# - cd ..
# - cd status-page
# - npm install
# - curl localhost:3006
# - npm run jest
## ACCOUNTS
lint_n_audit_accounts:
stage: BuildAndTest
script:
- cd accounts
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# ## ACCOUNTS
# lint_n_audit_accounts:
# stage: BuildAndTest
# script:
# - cd accounts
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
build_n_test_accounts:
stage: BuildAndTest
script:
- echo "Setup machine for running puppeteer tests"
- sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
- sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
- sudo docker run --env-file ./backend/.env.development --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/accounts:3.0.$CI_PIPELINE_IID ./accounts
- sudo docker run -p 3003:3003 -d fyipe-project/accounts:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/dashboard:3.0.$CI_PIPELINE_IID ./dashboard
- sudo docker run -p 3000:3000 -d fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
- sudo docker ps
- cd accounts
- npm install
- npm run jest
# build_n_test_accounts:
# stage: BuildAndTest
# script:
# - echo "Setup machine for running puppeteer tests"
# - sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
# - sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
# - sudo docker run --env-file ./backend/.env.development --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/accounts:3.0.$CI_PIPELINE_IID ./accounts
# - sudo docker run -p 3003:3003 -d fyipe-project/accounts:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/dashboard:3.0.$CI_PIPELINE_IID ./dashboard
# - sudo docker run -p 3000:3000 -d fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
# - sudo docker ps
# - cd accounts
# - npm install
# - npm run jest
## HOME
lint_n_audit_home:
stage: BuildAndTest
script:
- cd home
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# ## HOME
# lint_n_audit_home:
# stage: BuildAndTest
# script:
# - cd home
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
build_n_test_home:
stage: BuildAndTest
script:
- echo "No test implemented"
# build_n_test_home:
# stage: BuildAndTest
# script:
# - echo "No test implemented"
## PROBE
lint_n_audit_probe:
stage: BuildAndTest
script:
- cd probe
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# ## PROBE
# lint_n_audit_probe:
# stage: BuildAndTest
# script:
# - cd probe
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
build_n_test_probe:
stage: BuildAndTest
script:
- echo "No test implemented"
# build_n_test_probe:
# stage: BuildAndTest
# script:
# - echo "No test implemented"
##E2E Stage.
e2e_test:
stage: E2E
script:
- chmod +x ./kubernetes/ci/setup-machine.sh
- ./kubernetes/ci/setup-machine.sh
- chmod +x ./kubernetes/ci/setup.sh
- ./kubernetes/ci/setup.sh
- export ACCOUNTS_URL=`sudo kubectl describe svc accounts | grep Endpoints | cut -d ":" -f 2`
- export BACKEND_URL=`sudo kubectl describe svc backend | grep Endpoints | cut -d ":" -f 2`
- export DASHBOARD_URL=`sudo kubectl describe svc dashboard | grep Endpoints | cut -d ":" -f 2`
- export HOME_URL=`sudo kubectl describe svc home | grep Endpoints | cut -d ":" -f 2`
- export STATUSPAGE_URL=`sudo kubectl describe svc status-page | grep Endpoints | cut -d ":" -f 2`
- echo ACCOUNTS_URL=$ACCOUNTS_URL
- echo BACKEND_URL=$BACKEND_URL
- echo DASHBOARD_URL=$DASHBOARD_URL
- echo HOME_URL=$HOME_URL
- echo STATUSPAGE_URL=$STATUSPAGE_URL
- chmod +x ./kubernetes/ci/hosts-setup.sh
- ./kubernetes/ci/hosts-setup.sh
# ##E2E Stage.
# e2e_test:
# stage: E2E
# script:
# - chmod +x ./kubernetes/ci/setup-machine.sh
# - ./kubernetes/ci/setup-machine.sh
# - chmod +x ./kubernetes/ci/setup.sh
# - ./kubernetes/ci/setup.sh
# - export ACCOUNTS_URL=`sudo kubectl describe svc accounts | grep Endpoints | cut -d ":" -f 2`
# - export BACKEND_URL=`sudo kubectl describe svc backend | grep Endpoints | cut -d ":" -f 2`
# - export DASHBOARD_URL=`sudo kubectl describe svc dashboard | grep Endpoints | cut -d ":" -f 2`
# - export HOME_URL=`sudo kubectl describe svc home | grep Endpoints | cut -d ":" -f 2`
# - export STATUSPAGE_URL=`sudo kubectl describe svc status-page | grep Endpoints | cut -d ":" -f 2`
# - export APIDOCS_URL=`sudo kubectl describe svc api-docs | grep Endpoints | cut -d ":" -f 2`
# - echo ACCOUNTS_URL=$ACCOUNTS_URL
# - echo BACKEND_URL=$BACKEND_URL
# - echo DASHBOARD_URL=$DASHBOARD_URL
# - echo HOME_URL=$HOME_URL
# - echo STATUSPAGE_URL=$STATUSPAGE_URL
# - chmod +x ./kubernetes/ci/hosts-setup.sh
# - ./kubernetes/ci/hosts-setup.sh
# - cd smoke-test
# - npm i
# - npm run test
only:
refs:
- release
- master
# only:
# refs:
# - release
# - master
# DEPLOYMENT STAGE - BACKEND
deploy_staging_backend:
@@ -249,7 +253,7 @@ deploy_staging_api-docs:
- chmod +x ./kubernetes/ci/deployment-staging-setup.sh
- ./kubernetes/ci/deployment-staging-setup.sh
# Build and deploy api-docs.
- sudo docker build -t fyipe-project/dashobard:master ./api-docs
- sudo docker build -t fyipe-project/api-docs:master ./api-docs
- sudo docker tag fyipe-project/api-docs:master registry.gitlab.com/fyipe-project/api-docs:3.0.$CI_PIPELINE_IID
- sudo docker tag fyipe-project/api-docs:master registry.gitlab.com/fyipe-project/api-docs:master
- sudo docker push registry.gitlab.com/fyipe-project/api-docs:3.0.$CI_PIPELINE_IID
@@ -295,7 +299,7 @@ deploy_staging_home:
- chmod +x ./kubernetes/ci/deployment-staging-setup.sh
- ./kubernetes/ci/deployment-staging-setup.sh
# Build and deploy home.
- sudo docker build -t fyipe-project/dashobard:master ./home
- sudo docker build -t fyipe-project/home:master ./home
- sudo docker tag fyipe-project/home:master registry.gitlab.com/fyipe-project/home:3.0.$CI_PIPELINE_IID
- sudo docker tag fyipe-project/home:master registry.gitlab.com/fyipe-project/home:master
- sudo docker push registry.gitlab.com/fyipe-project/home:3.0.$CI_PIPELINE_IID
@@ -341,7 +345,7 @@ deploy_staging_probe:
- chmod +x ./kubernetes/ci/deployment-staging-setup.sh
- ./kubernetes/ci/deployment-staging-setup.sh
# Build and deploy probe.
- sudo docker build -t fyipe-project/dashobard:master ./probe
- sudo docker build -t fyipe-project/probe:master ./probe
- sudo docker tag fyipe-project/probe:master registry.gitlab.com/fyipe-project/probe:3.0.$CI_PIPELINE_IID
- sudo docker tag fyipe-project/probe:master registry.gitlab.com/fyipe-project/probe:master
- sudo docker push registry.gitlab.com/fyipe-project/probe:3.0.$CI_PIPELINE_IID
@@ -387,7 +391,7 @@ deploy_staging_status-page:
- chmod +x ./kubernetes/ci/deployment-staging-setup.sh
- ./kubernetes/ci/deployment-staging-setup.sh
# Build and deploy status-page.
- sudo docker build -t fyipe-project/dashobard:master ./status-page
- sudo docker build -t fyipe-project/status-page:master ./status-page
- sudo docker tag fyipe-project/status-page:master registry.gitlab.com/fyipe-project/status-page:3.0.$CI_PIPELINE_IID
- sudo docker tag fyipe-project/status-page:master registry.gitlab.com/fyipe-project/status-page:master
- sudo docker push registry.gitlab.com/fyipe-project/status-page:3.0.$CI_PIPELINE_IID
@@ -433,7 +437,7 @@ deploy_staging_admin-dashboard:
- chmod +x ./kubernetes/ci/deployment-staging-setup.sh
- ./kubernetes/ci/deployment-staging-setup.sh
# Build and deploy admin-dashboard.
- sudo docker build -t fyipe-project/dashobard:master ./admin-dashboard
- sudo docker build -t fyipe-project/admin-dashboard:master ./admin-dashboard
- sudo docker tag fyipe-project/admin-dashboard:master registry.gitlab.com/fyipe-project/admin-dashboard:3.0.$CI_PIPELINE_IID
- sudo docker tag fyipe-project/admin-dashboard:master registry.gitlab.com/fyipe-project/admin-dashboard:master
- sudo docker push registry.gitlab.com/fyipe-project/admin-dashboard:3.0.$CI_PIPELINE_IID
@@ -480,7 +484,7 @@ deploy_staging_accounts:
- chmod +x ./kubernetes/ci/deployment-staging-setup.sh
- ./kubernetes/ci/deployment-staging-setup.sh
# Build and deploy accounts.
- sudo docker build -t fyipe-project/dashobard:master ./accounts
- sudo docker build -t fyipe-project/accounts:master ./accounts
- sudo docker tag fyipe-project/accounts:master registry.gitlab.com/fyipe-project/accounts:3.0.$CI_PIPELINE_IID
- sudo docker tag fyipe-project/accounts:master registry.gitlab.com/fyipe-project/accounts:master
- sudo docker push registry.gitlab.com/fyipe-project/accounts:3.0.$CI_PIPELINE_IID
@@ -526,7 +530,7 @@ deploy_staging_dashboard:
- chmod +x ./kubernetes/ci/deployment-staging-setup.sh
- ./kubernetes/ci/deployment-staging-setup.sh
# Build and deploy dashboard.
- sudo docker build -t fyipe-project/dashobard:master ./dashboard
- sudo docker build -t fyipe-project/dashboard:master ./dashboard
- sudo docker tag fyipe-project/dashboard:master registry.gitlab.com/fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
- sudo docker tag fyipe-project/dashboard:master registry.gitlab.com/fyipe-project/dashboard:master
- sudo docker push registry.gitlab.com/fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
@@ -578,7 +582,15 @@ smoke_test_production:
smoke_test_staging:
stage: SmokeTest
script:
- echo "No test implemented"
- export HOME_URL=https://staging.fyipe.com
- export ACCOUNTS_URL=https://staging-accounts.fyipe.com
- export DASHBOARD_URL=https://staging-dashboard.fyipe.com
- export BACKEND_URL=https://staging-api.fyipe.com
- export STATUSPAGE_URL=https://staging-statuspage.fyipe.com
- export APIDOCS_URL=https://staging-api-docs.fyipe.com
- cd smoke-test
- npm install
- npm run test
only:
refs:
- master

View File

@@ -1,10 +1,26 @@
const express = require('express');
const path = require('path');
const app = express();
const envfile = require('envfile');
const fs = require('fs');
var child_process = require('child_process');
var env = {
REACT_APP_FYIPE_HOSTED: process.env.FYIPE_HOSTED,
REACT_APP_HOST: process.env.HOST,
REACT_APP_DASHBOARD_HOST: process.env.DASHBOARD_HOST,
REACT_APP_BACKEND_HOST: process.env.BACKEND_HOST
}
fs.writeFileSync('.env', envfile.stringifySync(env));
child_process.execSync('react-env', {
stdio: [0, 1, 2]
});
app.use(express.static(path.join(__dirname, 'build')));
app.get('/*', function(req, res) {
app.get('/*', function (req, res) {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

View File

@@ -928,6 +928,29 @@
"to-fast-properties": "^2.0.0"
}
},
"@beam-australia/react-env": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@beam-australia/react-env/-/react-env-2.1.2.tgz",
"integrity": "sha512-gXcCGGGb2oRM/oeqT861JXsSTJjOxGTBMkj7J5ujEBb6Vmv5I108NcALPYYdGdzFCV6ebdVP+E5k0W1xAbzA7w==",
"requires": {
"cross-spawn": "^6.0.5",
"dotenv": "^8.0.0",
"dotenv-expand": "^5.1.0",
"minimist": "^1.2.0"
},
"dependencies": {
"dotenv": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz",
"integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA=="
},
"dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
}
}
},
"@cnakazawa/watch": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz",
@@ -1782,6 +1805,15 @@
"resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
"integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
},
"ambi": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ambi/-/ambi-5.0.0.tgz",
"integrity": "sha512-NYJzHMsZU7clGY2lH11U+2PEllFDW66qnUukXYbyF8ZJ0B0CXVNfKHUvkUp+gsaNPBW8FqEFX5l64LTlUvI2pw==",
"requires": {
"editions": "^2.1.0",
"typechecker": "^4.3.0"
}
},
"ansi-colors": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
@@ -4834,6 +4866,22 @@
"stream-shift": "^1.0.0"
}
},
"eachr": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/eachr/-/eachr-3.2.0.tgz",
"integrity": "sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ=",
"requires": {
"editions": "^1.1.1",
"typechecker": "^4.3.0"
},
"dependencies": {
"editions": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
"integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg=="
}
}
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -4843,6 +4891,15 @@
"safer-buffer": "^2.1.0"
}
},
"editions": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz",
"integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==",
"requires": {
"errlop": "^1.1.1",
"semver": "^5.6.0"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -4922,6 +4979,25 @@
"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
"integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
},
"envfile": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/envfile/-/envfile-3.0.0.tgz",
"integrity": "sha512-LdL/WLZutuZedarG3Knu4v4RC7kZpC+dSdv9tVj0B8q11K0T0pLczRYxhmyVpApRRXWQnz5Fldrtnu/RzbCHPA==",
"requires": {
"ambi": "^5.0.0",
"eachr": "^3.1.0",
"editions": "^2.1.3",
"typechecker": "^4.0.1"
}
},
"errlop": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz",
"integrity": "sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw==",
"requires": {
"editions": "^2.1.2"
}
},
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@@ -13464,6 +13540,14 @@
"mime-types": "~2.1.24"
}
},
"typechecker": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.7.0.tgz",
"integrity": "sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ==",
"requires": {
"editions": "^2.1.0"
}
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",

View File

@@ -2,7 +2,9 @@
"name": "fyipe-accounts",
"version": "0.1.0",
"private": true,
"homepage": ".",
"dependencies": {
"@beam-australia/react-env": "^2.1.2",
"@trendmicro/react-dropdown": "^1.3.0",
"axios": "^0.18.0",
"browserslist": "^4.6.1",
@@ -12,6 +14,7 @@
"components": "^0.1.0",
"connected-react-router": "^4.5.0",
"creditcard-generator": "0.0.7",
"envfile": "^3.0.0",
"express": "^4.16.4",
"faker": "^4.1.0",
"file-saver": "^2.0.1",

View File

@@ -29,6 +29,7 @@
<link rel="preload" href="/assets/fonts/camphor/font3.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="preload" href="/assets/fonts/camphor/font4.woff2" as="font" type="font/woff2" crossorigin="">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>
<script src="%PUBLIC_URL%/env.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.3/jquery.tipsy.min.js" type="text/javascript"></script>
<style type="text/css">
/* Camphor */

View File

@@ -11,25 +11,26 @@ let dashboardUrl = null;
let domain = null;
let adminDashboardUrl = null;
function env(value) {
var { _env } = window;
return _env[`REACT_APP_${value}`];
}
if (!isServer) {
if (window.location.href.indexOf('localhost') > -1) {
apiUrl = 'http://localhost:3002';
dashboardUrl = 'http://localhost:3000';
domain = 'localhost';
adminDashboardUrl = 'http://localhost:3100';
} else if (window.location.href.indexOf('staging') > -1) {
apiUrl = 'https://staging-api.fyipe.com';
dashboardUrl = 'http://staging-dashboard.fyipe.com';
domain = 'fyipe.com';
} else {
apiUrl = 'https://api.fyipe.com';
dashboardUrl = 'https://dashboard.fyipe.com';
domain = 'fyipe.com';
} else if (env('BACKEND_HOST')) {
apiUrl = env('BACKEND_HOST');
dashboardUrl = env('DASHBOARD_HOST');
domain = 'host';
}
}
export const API_URL = apiUrl;
export const DASHBOARD_URL = dashboardUrl;
@@ -197,7 +198,7 @@ export const PricingPlan = {
getPlans() {
if (window.location.href.indexOf('localhost') > -1 || window.location.href.indexOf('staging') > -1) {
if (window.location.href.indexOf('localhost') > -1 || window.location.href.indexOf('staging') > -1 || window.location.href.indexOf('accounts:3003') > -1) {
return [
{
category: 'Basic',

View File

@@ -0,0 +1,30 @@
#
# Fyipe-admin-dashboard Dockerfile
#
# Pull base image nodejs image.
FROM node:10
#SET ENV Variables
ENV PRODUCTION=true
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install app dependencies
COPY package*.json /usr/src/app/
RUN npm install
# Copy app source
COPY . /usr/src/app
# Bundle app source
RUN npm run build
# Expose ports.
# - 3100: Fyipe-admin-dashboard
EXPOSE 3100
#Run the app
CMD [ "npm", "start" ]

View File

@@ -2381,15 +2381,23 @@
}
},
"babel-loader": {
"version": "8.0.5",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz",
"integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==",
"version": "8.0.6",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz",
"integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==",
"dev": true,
"requires": {
"find-cache-dir": "^2.0.0",
"loader-utils": "^1.0.2",
"mkdirp": "^0.5.1",
"util.promisify": "^1.0.0"
"pify": "^4.0.1"
},
"dependencies": {
"pify": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true
}
}
},
"babel-messages": {
@@ -5350,61 +5358,50 @@
}
},
"eslint": {
"version": "5.16.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
"integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-6.1.0.tgz",
"integrity": "sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"ajv": "^6.9.1",
"ajv": "^6.10.0",
"chalk": "^2.1.0",
"cross-spawn": "^6.0.5",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"eslint-scope": "^4.0.3",
"eslint-scope": "^5.0.0",
"eslint-utils": "^1.3.1",
"eslint-visitor-keys": "^1.0.0",
"espree": "^5.0.1",
"espree": "^6.0.0",
"esquery": "^1.0.1",
"esutils": "^2.0.2",
"file-entry-cache": "^5.0.1",
"functional-red-black-tree": "^1.0.1",
"glob": "^7.1.2",
"glob-parent": "^5.0.0",
"globals": "^11.7.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"inquirer": "^6.2.2",
"js-yaml": "^3.13.0",
"inquirer": "^6.4.1",
"is-glob": "^4.0.0",
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.3.0",
"lodash": "^4.17.11",
"lodash": "^4.17.14",
"minimatch": "^3.0.4",
"mkdirp": "^0.5.1",
"natural-compare": "^1.4.0",
"optionator": "^0.8.2",
"path-is-inside": "^1.0.2",
"progress": "^2.0.0",
"regexpp": "^2.0.1",
"semver": "^5.5.1",
"strip-ansi": "^4.0.0",
"strip-json-comments": "^2.0.1",
"semver": "^6.1.2",
"strip-ansi": "^5.2.0",
"strip-json-comments": "^3.0.1",
"table": "^5.2.3",
"text-table": "^0.2.0"
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
"acorn": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz",
"integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==",
"dev": true
},
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -5414,15 +5411,14 @@
"ms": "^2.1.1"
}
},
"espree": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
"integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
"eslint-scope": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
"integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
"dev": true,
"requires": {
"acorn": "^6.0.7",
"acorn-jsx": "^5.0.0",
"eslint-visitor-keys": "^1.0.0"
"esrecurse": "^4.1.0",
"estraverse": "^4.1.1"
}
},
"import-fresh": {
@@ -5447,19 +5443,16 @@
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
"ansi-regex": "^3.0.0"
}
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
"integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
"dev": true
}
}
@@ -15309,4 +15302,4 @@
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
}
}
}
}

View File

@@ -78,12 +78,12 @@
"devDependencies": {
"axios-mock-adapter": "^1.15.0",
"babel-core": "^6.26.3",
"babel-loader": "8.0.5",
"babel-loader": "^8.0.6",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
"babel-runtime": "^6.26.0",
"cross-env": "^5.2.0",
"eslint": "5.16.0",
"eslint": "^6.1.0",
"jest-localstorage-mock": "^2.2.0",
"npm-audit-ci-wrapper": "^2.2.1",
"react-test-renderer": "^16.5.2",

View File

@@ -1,10 +1,26 @@
const express = require('express');
const path = require('path');
const app = express();
const envfile = require('envfile');
const fs = require('fs');
var child_process = require('child_process');
var env = {
REACT_APP_FYIPE_HOSTED: process.env.FYIPE_HOSTED,
REACT_APP_HOST: process.env.HOST,
REACT_APP_ACCOUNTS_HOST: process.env.ACCOUNTS_HOST,
REACT_APP_BACKEND_HOST: process.env.BACKEND_HOST
}
fs.writeFileSync('.env', envfile.stringifySync(env));
child_process.execSync('react-env', {
stdio: [0, 1, 2]
});
app.use(express.static(path.join(__dirname, 'build')));
app.get('/*', function(req, res) {
app.get('/*', function (req, res) {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

View File

@@ -928,6 +928,34 @@
"to-fast-properties": "^2.0.0"
}
},
"@beam-australia/react-env": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@beam-australia/react-env/-/react-env-2.1.2.tgz",
"integrity": "sha512-gXcCGGGb2oRM/oeqT861JXsSTJjOxGTBMkj7J5ujEBb6Vmv5I108NcALPYYdGdzFCV6ebdVP+E5k0W1xAbzA7w==",
"requires": {
"cross-spawn": "^6.0.5",
"dotenv": "^8.0.0",
"dotenv-expand": "^5.1.0",
"minimist": "^1.2.0"
},
"dependencies": {
"dotenv": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz",
"integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA=="
},
"dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
},
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
}
}
},
"@cnakazawa/watch": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz",
@@ -1829,6 +1857,15 @@
"resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
"integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
},
"ambi": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ambi/-/ambi-5.0.0.tgz",
"integrity": "sha512-NYJzHMsZU7clGY2lH11U+2PEllFDW66qnUukXYbyF8ZJ0B0CXVNfKHUvkUp+gsaNPBW8FqEFX5l64LTlUvI2pw==",
"requires": {
"editions": "^2.1.0",
"typechecker": "^4.3.0"
}
},
"ansi-colors": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
@@ -5571,6 +5608,22 @@
}
}
},
"eachr": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/eachr/-/eachr-3.2.0.tgz",
"integrity": "sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ=",
"requires": {
"editions": "^1.1.1",
"typechecker": "^4.3.0"
},
"dependencies": {
"editions": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
"integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg=="
}
}
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -5580,6 +5633,15 @@
"safer-buffer": "^2.1.0"
}
},
"editions": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz",
"integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==",
"requires": {
"errlop": "^1.1.1",
"semver": "^5.6.0"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -5706,6 +5768,25 @@
"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
"integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
},
"envfile": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/envfile/-/envfile-3.0.0.tgz",
"integrity": "sha512-LdL/WLZutuZedarG3Knu4v4RC7kZpC+dSdv9tVj0B8q11K0T0pLczRYxhmyVpApRRXWQnz5Fldrtnu/RzbCHPA==",
"requires": {
"ambi": "^5.0.0",
"eachr": "^3.1.0",
"editions": "^2.1.3",
"typechecker": "^4.0.1"
}
},
"errlop": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz",
"integrity": "sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw==",
"requires": {
"editions": "^2.1.2"
}
},
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@@ -8486,8 +8567,7 @@
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"optional": true
"bundled": true
},
"aproba": {
"version": "1.2.0",
@@ -8524,8 +8604,7 @@
},
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"optional": true
"bundled": true
},
"concat-map": {
"version": "0.0.1",
@@ -8534,8 +8613,7 @@
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"optional": true
"bundled": true
},
"core-util-is": {
"version": "1.0.2",
@@ -8638,8 +8716,7 @@
},
"inherits": {
"version": "2.0.3",
"bundled": true,
"optional": true
"bundled": true
},
"ini": {
"version": "1.3.5",
@@ -8649,7 +8726,6 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -8675,7 +8751,6 @@
"minipass": {
"version": "2.3.5",
"bundled": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -8692,7 +8767,6 @@
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -8765,8 +8839,7 @@
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"optional": true
"bundled": true
},
"object-assign": {
"version": "4.1.1",
@@ -8776,7 +8849,6 @@
"once": {
"version": "1.4.0",
"bundled": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@@ -8852,8 +8924,7 @@
},
"safe-buffer": {
"version": "5.1.2",
"bundled": true,
"optional": true
"bundled": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -8883,7 +8954,6 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -8901,7 +8971,6 @@
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -8940,13 +9009,11 @@
},
"wrappy": {
"version": "1.0.2",
"bundled": true,
"optional": true
"bundled": true
},
"yallist": {
"version": "3.0.3",
"bundled": true,
"optional": true
"bundled": true
}
}
}
@@ -15006,6 +15073,14 @@
"mime-types": "~2.1.24"
}
},
"typechecker": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.7.0.tgz",
"integrity": "sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ==",
"requires": {
"editions": "^2.1.0"
}
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",

View File

@@ -3,6 +3,7 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@beam-australia/react-env": "^2.1.2",
"@trendmicro/react-dropdown": "^1.3.0",
"axios": "^0.18.0",
"browserslist": "^4.6.1",
@@ -12,6 +13,7 @@
"cloudboost": "^6.6.6",
"components": "^0.1.0",
"connected-react-router": "^4.5.0",
"envfile": "^3.0.0",
"express": "^4.16.4",
"faker": "^4.1.0",
"file-saver": "^2.0.1",

View File

@@ -29,6 +29,7 @@
<link rel="preload" href="/assets/fonts/camphor/font3.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="preload" href="/assets/fonts/camphor/font4.woff2" as="font" type="font/woff2" crossorigin="">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>
<script src="%PUBLIC_URL%/env.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.3/jquery.tipsy.min.js" type="text/javascript"></script>
<script src="https://js.stripe.com/v3/"></script>
<style type="text/css">

View File

@@ -3,32 +3,50 @@ import isEmail from 'sane-email-validation';
import validUrl from 'valid-url';
import valid from 'card-validator';
import { isServer } from './store';
import FileSaver from 'file-saver'
import FileSaver from 'file-saver';
let apiUrl = 'http://localhost:3002';
let dashboardUrl = null;
let accountsUrl = null;
let domain = null;
// if (!isServer) {
// if (window.location.href.indexOf('localhost') > -1) {
// apiUrl = 'http://localhost:3002';
// dashboardUrl = 'http://localhost:3000';
// accountsUrl = 'http://localhost:3003';
// domain = 'localhost';
// } else if (window.location.href.indexOf('staging') > -1) {
// apiUrl = 'https://staging-api.fyipe.com';
// dashboardUrl = 'http://staging-dashboard.fyipe.com';
// accountsUrl = 'http://staging-accounts.fyipe.com';
// domain = 'fyipe.com';
// } else {
// apiUrl = 'https://api.fyipe.com';
// dashboardUrl = 'https://fyipe.com';
// accountsUrl = 'https://accounts.fyipe.com';
// domain = 'fyipe.com';
// }
// }
function env(value) {
var { _env } = window;
return _env[`REACT_APP_${value}`];
}
if (!isServer) {
if (window.location.href.indexOf('localhost') > -1) {
apiUrl = 'http://localhost:3002';
dashboardUrl = 'http://localhost:3000';
accountsUrl = 'http://localhost:3003';
domain = 'localhost';
} else if (window.location.href.indexOf('staging') > -1) {
apiUrl = 'https://staging-api.fyipe.com';
dashboardUrl = 'http://staging-dashboard.fyipe.com';
accountsUrl = 'http://staging-accounts.fyipe.com';
domain = 'fyipe.com';
} else {
apiUrl = 'https://api.fyipe.com';
dashboardUrl = 'https://fyipe.com';
accountsUrl = 'https://accounts.fyipe.com';
domain = 'fyipe.com';
} else if (env('BACKEND_HOST')) {
apiUrl = env('BACKEND_HOST');
dashboardUrl = env('HOST');
accountsUrl = env('ACCOUNTS_HOST');
domain = 'host';
}
}
export const API_URL = apiUrl;
@@ -215,7 +233,7 @@ export const PricingPlan = {
getPlans() {
if (window.location.href.indexOf('localhost') > -1 || window.location.href.indexOf('staging') > -1) {
if (window.location.href.indexOf('localhost') > -1 || window.location.href.indexOf('staging') > -1 || window.location.href.indexOf('dashboard:3003') > -1) {
return [
{
category: 'Basic',

View File

@@ -26,6 +26,12 @@ spec:
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "http://dashboard:3000"
- name: ACCOUNTS_HOST
value: "http://accounts:3003"
- name: BACKEND_HOST
value: "http://backend:3002"
ports:
- containerPort: 3000
hostPort: 3000
@@ -75,6 +81,12 @@ spec:
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "http://accounts:3003"
- name: BACKEND_HOST
value: "http://backend:3002"
- name: DASHBOARD_HOST
value: "http://dashboard:3000"
ports:
- containerPort: 3003
hostPort: 3003
@@ -100,6 +112,61 @@ spec:
type: LoadBalancer
---
# Fyipe API docs Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-docs
labels:
app: api-docs
spec:
selector:
matchLabels:
app: api-docs
replicas: 1
template:
metadata:
labels:
app: api-docs
spec:
containers:
- image: localhost:32000/api-docs:master
name: api-docs
imagePullPolicy: Always
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "accounts"
- name: BACKEND_HOST
value: "backend"
- name: DASHBOARD_HOST
value: "dashboard"
ports:
- containerPort: 1445
hostPort: 1445
name: api-docs
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
# Fyipe API docs Service
apiVersion: v1
kind: Service
metadata:
labels:
app: api-docs
name: api-docs
spec:
ports:
- port: 80
protocol: TCP
targetPort: 1445
selector:
app: api-docs
type: LoadBalancer
---
# Fyipe Backend Deployment
apiVersion: apps/v1
kind: Deployment
@@ -133,7 +200,7 @@ spec:
- name: STRIPE_PRIVATE_KEY
value: "sk_test_YxwnzywggtAd8jDaHecNmHiN"
- name: PORT
value: "3001"
value: "3002"
- name: MAIL_USER
value: "testmail@fyipe.com"
- name: MAIL_PASSWORD
@@ -150,9 +217,11 @@ spec:
value: "testmail@fyipe.com"
- name: EMAIL_VERIFY_TIME
value: "3600"
- name: MAIL_SECURE
value: "false"
ports:
- containerPort: 3001
hostPort: 3001
- containerPort: 3002
hostPort: 3002
name: backend
restartPolicy: Always
imagePullSecrets:
@@ -169,7 +238,7 @@ spec:
ports:
- port: 80
protocol: TCP
targetPort: 3001
targetPort: 3002
selector:
app: backend
type: LoadBalancer
@@ -198,6 +267,14 @@ spec:
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "home"
- name: BACKEND_HOST
value: "backend"
- name: ACCOUNTS_HOST
value: "accounts"
- name: DASHBOARD_HOST
value: "dashboard"
ports:
- containerPort: 1444
hostPort: 1444
@@ -244,6 +321,14 @@ spec:
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "statuspage"
- name: BACKEND_HOST
value: "backend"
- name: ACCOUNTS_HOST
value: "accounts"
- name: DASHBOARD_HOST
value: "dashboard"
ports:
- containerPort: 3006
hostPort: 3006

View File

@@ -1,8 +1,9 @@
cd credentials
cd ./kubernetes/credentials
openssl enc -in encrypted-credentials.enc -out encrypted-credentials.tar -d -aes256 -pbkdf2 -k $KUBE_ENC
tar -xvf encrypted-credentials.tar
cd ..
cd ..
curl -sSL https://sdk.cloud.google.com | bash > /dev/null;
source $HOME/google-cloud-sdk/path.bash.inc
$HOME/google-cloud-sdk/bin/gcloud components update kubectl
sudo docker login --username $DOCKERUSERNAME --password $DOCKERPASSWORD registry.gitlab.com
sudo docker login -u $DOCKERUSERNAME -p $PERSONAL_ACCESS_TOKEN registry.gitlab.com

View File

@@ -1,3 +1,3 @@
sudo $HOME/google-cloud-sdk/bin/gcloud auth activate-service-account --key-file credentials/encrypted-credentials/staging/fyipe-staging.json
sudo $HOME/google-cloud-sdk/bin/gcloud auth activate-service-account --key-file ./kubernetes/credentials/encrypted-credentials/staging/fyipe-staging.json
sudo $HOME/google-cloud-sdk/bin/gcloud container clusters get-credentials fyipe-staging --zone us-central1-a --project fyipe-staging
sudo $HOME/google-cloud-sdk/bin/kubectl config use-context gke_fyipe-staging_us-central1-a_fyipe-staging

View File

@@ -6,5 +6,7 @@ sudo sed -i '/backend/c\' /etc/hosts
echo $BACKEND_URL' backend' | sudo tee -a /etc/hosts
sudo sed -i '/home/c\' /etc/hosts
echo $HOME_URL' home' | sudo tee -a /etc/hosts
sudo sed -i '/statuspage/c\' /etc/hosts
echo $STATUSPAGE_URL' statuspage' | sudo tee -a /etc/hosts
sudo sed -i '/status-page/c\' /etc/hosts
echo $STATUSPAGE_URL' status-page' | sudo tee -a /etc/hosts
sudo sed -i '/api-docs/c\' /etc/hosts
echo $APIDOCS_URL' api-docs' | sudo tee -a /etc/hosts

View File

@@ -134,10 +134,10 @@ spec:
- name: STRIPE_PRIVATE_KEY
value: "sk_live_ADLzzMrOCz0kyYTsxWatAqxh"
- name: PORT
value: "3001"
value: "3002"
ports:
- containerPort: 3001
hostPort: 3001
- containerPort: 3002
hostPort: 3002
name: backend
restartPolicy: Always
imagePullSecrets:
@@ -154,7 +154,7 @@ spec:
ports:
- port: 80
protocol: TCP
targetPort: 3001
targetPort: 3002
selector:
app: backend
type: LoadBalancer
@@ -252,6 +252,151 @@ spec:
app: status-page
type: LoadBalancer
---
# Probe service and deployement
apiVersion: apps/v1
kind: Deployment
metadata:
name: probe
labels:
app: probe
spec:
selector:
matchLabels:
app: probe
replicas: 1
template:
metadata:
labels:
app: probe
spec:
containers:
- image: registry.gitlab.com/fyipe-project/probe:master
name: probe
imagePullPolicy: IfNotPresent
env:
- name: FYIPE_HOSTED
value: "true"
- name: SERVER_URL
value: "http://backend"
- name: PORT
value: "3008"
ports:
- containerPort: 3008
hostPort: 3008
name: probe
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
apiVersion: v1
kind: Service
metadata:
labels:
app: probe
name: probe
spec:
ports:
- port: 80
protocol: TCP
targetPort: 3008
selector:
app: probe
type: LoadBalancer
# API docs deployment and service
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-docs
labels:
app: api-docs
spec:
selector:
matchLabels:
app: api-docs
replicas: 1
template:
metadata:
labels:
app: api-docs
spec:
containers:
- image: registry.gitlab.com/fyipe-project/api-docs:master
name: api-docs
imagePullPolicy: Always
env:
- name: FYIPE_HOSTED
value: "true"
ports:
- containerPort: 1445
hostPort: 1445
name: api-docs
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
apiVersion: v1
kind: Service
metadata:
labels:
app: api-docs
name: api-docs
spec:
ports:
- port: 80
protocol: TCP
targetPort: 1445
selector:
app: api-docs
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: admin-dashboard
labels:
app: admin-dashboard
spec:
selector:
matchLabels:
app: admin-dashboard
replicas: 1
template:
metadata:
labels:
app: admin-dashboard
spec:
containers:
- image: registry.gitlab.com/fyipe-project/admin-dashboard:master
name: admin-dashboard
imagePullPolicy: Always
env:
- name: FYIPE_HOSTED
value: "true"
ports:
- containerPort: 3100
hostPort: 3100
name: admin-dashboard
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
apiVersion: v1
kind: Service
metadata:
labels:
app: admin-dashboard
name: admin-dashboard
spec:
ports:
- port: 80
protocol: TCP
targetPort: 3100
selector:
app: admin-dashboard
type: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:

View File

@@ -0,0 +1,476 @@
# This is the staging Kubectl config which is used to run the staging cluster in Kubernetes.
#
# IMPORTANT: ANY CHANGE TO THIS FILE SHOULD BE ACCOMPANIED WITH CHANGES TO test-server.yaml
#
apiVersion: apps/v1
kind: Deployment
metadata:
name: dashboard
labels:
app: dashboard
spec:
selector:
matchLabels:
app: dashboard
replicas: 1
template:
metadata:
labels:
app: dashboard
spec:
containers:
- image: registry.gitlab.com/fyipe-project/dashboard:master
name: dashboard
imagePullPolicy: IfNotPresent
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "https://staging-dashboard.fyipe.com"
- name: ACCOUNTS_HOST
value: "https://staging-accounts.fyipe.com"
- name: BACKEND_HOST
value: "https://staging-api.fyipe.com"
ports:
- containerPort: 3000
hostPort: 3000
name: dashboard
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
# Fyipe Dashoard Service
apiVersion: v1
kind: Service
metadata:
labels:
app: dashboard
name: dashboard
spec:
ports:
- port: 80
protocol: TCP
targetPort: 3000
selector:
app: dashboard
type: LoadBalancer
---
# Fyipe App Accounts Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: accounts
labels:
app: accounts
spec:
selector:
matchLabels:
app: accounts
replicas: 1
template:
metadata:
labels:
app: accounts
spec:
containers:
- image: registry.gitlab.com/fyipe-project/accounts:master
name: accounts
imagePullPolicy: IfNotPresent
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "https://staging-accounts.fyipe.com"
- name: ACCOUNTS_HOST
value: "https://staging-dashboard.fyipe.com"
- name: BACKEND_HOST
value: "https://staging-api.fyipe.com"
ports:
- containerPort: 3003
hostPort: 3003
name: accounts
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
# Fyipe Accounts Service
apiVersion: v1
kind: Service
metadata:
labels:
app: accounts
name: accounts
spec:
ports:
- port: 80
protocol: TCP
targetPort: 3003
selector:
app: accounts
type: LoadBalancer
---
# Fyipe Backend Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
labels:
app: backend
spec:
selector:
matchLabels:
app: backend
replicas: 1
template:
metadata:
labels:
app: backend
spec:
containers:
- image: registry.gitlab.com/fyipe-project/backend:master
name: backend
imagePullPolicy: IfNotPresent
env:
- name: FYIPE_HOSTED
value: "true"
- name: JWT_SECRET
value: "idfn3873458973457453"
- name: MONGO_URL
value: "mongodb://admin:372b60f4-704c-4205-8e5c-45cdbf44b1fc@mongo-0.mongo-headless.default.svc.cluster.local:27017,mongo-1.mongo-headless.default.svc.cluster.local:27017,mongo-2.mongo-headless.default.svc.cluster.local:27017/fyipedb?replicaSet=fyipe"
- name: STRIPE_PUBLIC_KEY
value: "pk_test_4I2S0sD0TYJxEWQTYlC2Rk6E"
- name: STRIPE_PRIVATE_KEY
value: "sk_test_YxwnzywggtAd8jDaHecNmHiN"
- name: PORT
value: "3002"
- name: MAIL_USER
value: "testmail@fyipe.com"
- name: MAIL_PASSWORD
value: "66WEPsk4FJCqUnbCFeZrFYCRWg"
- name: MAIL_SERVER_SMTP
value: "mail.hackerbay.io"
- name: MAIL_PORT_SMTP
value: "587"
- name: MAIL_SERVER_IMAP
value: "mail.hackerbay.io"
- name: MAIL_PORT_IMAP
value: "993"
- name: MAIL_FROM
value: "testmail@fyipe.com"
- name: EMAIL_VERIFY_TIME
value: "3600"
- name: MAIL_SECURE
value: "false"
ports:
- containerPort: 3002
hostPort: 3002
name: backend
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
# Fyipe Backend Deployment
apiVersion: v1
kind: Service
metadata:
labels:
app: backend
name: backend
spec:
ports:
- port: 80
protocol: TCP
targetPort: 3002
selector:
app: backend
type: LoadBalancer
---
# Fyipe Home
apiVersion: apps/v1
kind: Deployment
metadata:
name: home
labels:
app: home
spec:
selector:
matchLabels:
app: home
replicas: 1
template:
metadata:
labels:
app: home
spec:
containers:
- image: registry.gitlab.com/fyipe-project/home:master
name: home
imagePullPolicy: IfNotPresent
env:
- name: FYIPE_HOSTED
value: "true"
ports:
- containerPort: 1444
hostPort: 1444
name: home
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
apiVersion: v1
kind: Service
metadata:
labels:
app: home
name: home
spec:
ports:
- port: 80
protocol: TCP
targetPort: 1444
selector:
app: home
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: status-page
labels:
app: status-page
spec:
selector:
matchLabels:
app: status-page
replicas: 1
template:
metadata:
labels:
app: status-page
spec:
containers:
- image: registry.gitlab.com/fyipe-project/status-page:master
name: status-page
imagePullPolicy: IfNotPresent
env:
- name: FYIPE_HOSTED
value: "true"
ports:
- containerPort: 3006
hostPort: 3006
name: status-page
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
apiVersion: v1
kind: Service
metadata:
labels:
app: status-page
name: status-page
spec:
ports:
- port: 80
protocol: TCP
targetPort: 3006
selector:
app: status-page
type: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:
name: mongo-headless
labels:
name: mongo-headless
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
role: mongo
---
# stateful set config for mongo
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: mongo
spec:
serviceName: "mongo-headless"
replicas: 3
template:
metadata:
labels:
role: mongo
environment: production
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongo
image: mongo
command: ["/bin/sh","-c"]
args: ["echo 2J2W5Jm7G38y169r8s5T1dW > mongo.key; chmod 600 mongo.key; mongod --replSet fyipe --keyFile mongo.key --smallfiles --noprealloc --bind_ip_all"]
ports:
- containerPort: 27017
volumeMounts:
- name: persistent-storage
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: persistent-storage
annotations:
volume.beta.kubernetes.io/storage-class: productiondata
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 900Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongo-backup-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 900Gi
storageClassName: primarybackup
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongo-secondary-backup-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 900Gi
storageClassName: secondbackup
---
apiVersion: v1
kind: ReplicationController
metadata:
labels:
name: mongo-backup-primary
name: mongo-backup-primary
spec:
replicas: 1
template:
metadata:
labels:
name: mongo-backup-primary
spec:
containers:
- image: tutum/mongodb-backup
name: mongodb-backup
ports:
- name: mongo
containerPort: 27017
hostPort: 27017
env:
- name: MAX_BACKUPS
value: "15"
- name: MONGODB_USER
value: "admin"
- name: MONGODB_PASS
value: "372b60f4-704c-4205-8e5c-45cdbf44b1fc"
- name: MONGODB_HOST
value: "mongo-0.mongo-headless.default.svc.cluster.local"
- name: MONGODB_PORT
value: "27017"
volumeMounts:
- name: mongo-backup
mountPath: /backup
volumes:
- name: mongo-backup
persistentVolumeClaim:
claimName: mongo-backup-pvc
---
apiVersion: v1
kind: ReplicationController
metadata:
labels:
name: mongo-backup-secondary
name: mongo-backup-secondary
spec:
replicas: 1
template:
metadata:
labels:
name: mongo-backup-secondary
spec:
containers:
- image: tutum/mongodb-backup
name: mongodb-backup
ports:
- name: mongo
containerPort: 27017
hostPort: 27017
env:
- name: MAX_BACKUPS
value: "15"
- name: MONGODB_USER
value: "admin"
- name: MONGODB_PASS
value: "372b60f4-704c-4205-8e5c-45cdbf44b1fc"
- name: MONGODB_HOST
value: "mongo-0.mongo-headless.default.svc.cluster.local"
- name: MONGODB_PORT
value: "27017"
volumeMounts:
- name: mongo-backup
mountPath: /backup
volumes:
- name: mongo-backup
persistentVolumeClaim:
claimName: mongo-secondary-backup-pvc
---
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: productiondata
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
reclaimPolicy: Retain
---
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: primarybackup
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
reclaimPolicy: Retain
---
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: secondbackup
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
reclaimPolicy: Retain
---

484
probe/package-lock.json generated Executable file → Normal file
View File

@@ -5,9 +5,9 @@
"requires": true,
"dependencies": {
"@babel/code-frame": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
"integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
"version": "7.5.5",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
"integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
"requires": {
"@babel/highlight": "^7.0.0"
}
@@ -32,19 +32,19 @@
}
},
"acorn": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz",
"integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw=="
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz",
"integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ=="
},
"acorn-jsx": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
"integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg=="
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz",
"integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw=="
},
"ajv": {
"version": "6.10.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz",
"integrity": "sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ==",
"version": "6.10.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
"integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
"requires": {
"fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -108,12 +108,9 @@
"integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
},
"async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
"integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
"requires": {
"lodash": "^4.17.11"
}
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
"integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
},
"asynckit": {
"version": "0.4.0",
@@ -233,14 +230,6 @@
"dev": true,
"requires": {
"colors": "1.0.3"
},
"dependencies": {
"colors": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
"integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
"dev": true
}
}
},
"cli-width": {
@@ -248,15 +237,6 @@
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
},
"color": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
"integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==",
"requires": {
"color-convert": "^1.9.1",
"color-string": "^1.5.2"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -270,33 +250,10 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"color-string": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
"integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
"requires": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"colornames": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz",
"integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y="
},
"colors": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
"integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg=="
},
"colorspace": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz",
"integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==",
"requires": {
"color": "3.0.x",
"text-hex": "1.0.x"
}
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
"integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
},
"combined-stream": {
"version": "1.0.8",
@@ -358,8 +315,20 @@
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
}
}
},
"cycle": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
"integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -396,16 +365,6 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"diagnostics": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz",
"integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==",
"requires": {
"colorspace": "1.1.x",
"enabled": "1.0.x",
"kuler": "1.0.x"
}
},
"doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -433,24 +392,11 @@
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
},
"enabled": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz",
"integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=",
"requires": {
"env-variable": "0.0.x"
}
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"env-variable": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz",
"integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA=="
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -462,9 +408,9 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"eslint": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-6.0.1.tgz",
"integrity": "sha512-DyQRaMmORQ+JsWShYsSg4OPTjY56u1nCjAmICrE8vLWqyLKxhFXOthwMj1SA8xwfrv0CofLNVnqbfyhwCkaO0w==",
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-6.3.0.tgz",
"integrity": "sha512-ZvZTKaqDue+N8Y9g0kp6UPZtS4FSY3qARxBs7p4f0H0iof381XHduqVerFWtK8DPtKmemqbqCFENWSQgPR/Gow==",
"requires": {
"@babel/code-frame": "^7.0.0",
"ajv": "^6.10.0",
@@ -472,36 +418,37 @@
"cross-spawn": "^6.0.5",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"eslint-scope": "^4.0.3",
"eslint-utils": "^1.3.1",
"eslint-visitor-keys": "^1.0.0",
"espree": "^6.0.0",
"eslint-scope": "^5.0.0",
"eslint-utils": "^1.4.2",
"eslint-visitor-keys": "^1.1.0",
"espree": "^6.1.1",
"esquery": "^1.0.1",
"esutils": "^2.0.2",
"file-entry-cache": "^5.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^3.1.0",
"glob-parent": "^5.0.0",
"globals": "^11.7.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"inquirer": "^6.2.2",
"inquirer": "^6.4.1",
"is-glob": "^4.0.0",
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.3.0",
"lodash": "^4.17.11",
"lodash": "^4.17.14",
"minimatch": "^3.0.4",
"mkdirp": "^0.5.1",
"natural-compare": "^1.4.0",
"optionator": "^0.8.2",
"progress": "^2.0.0",
"regexpp": "^2.0.1",
"semver": "^5.5.1",
"strip-ansi": "^4.0.0",
"strip-json-comments": "^2.0.1",
"semver": "^6.1.2",
"strip-ansi": "^5.2.0",
"strip-json-comments": "^3.0.1",
"table": "^5.2.3",
"text-table": "^0.2.0"
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
"debug": {
@@ -520,9 +467,9 @@
}
},
"eslint-scope": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
"integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
"integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
"requires": {
"esrecurse": "^4.1.0",
"estraverse": "^4.1.1"
@@ -537,18 +484,18 @@
}
},
"eslint-visitor-keys": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
"integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
"integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A=="
},
"espree": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-6.0.0.tgz",
"integrity": "sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q==",
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz",
"integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==",
"requires": {
"acorn": "^6.0.7",
"acorn-jsx": "^5.0.0",
"eslint-visitor-keys": "^1.0.0"
"acorn": "^7.0.0",
"acorn-jsx": "^5.0.2",
"eslint-visitor-keys": "^1.1.0"
}
},
"esprima": {
@@ -573,14 +520,14 @@
}
},
"estraverse": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
"integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
},
"esutils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
},
"etag": {
"version": "1.8.1",
@@ -654,6 +601,11 @@
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"eyes": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
"integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
},
"fast-deep-equal": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
@@ -669,16 +621,6 @@
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
},
"fast-safe-stringify": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz",
"integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg=="
},
"fecha": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
"integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg=="
},
"figures": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
@@ -799,22 +741,11 @@
}
},
"glob-parent": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
"integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz",
"integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==",
"requires": {
"is-glob": "^3.1.0",
"path-dirname": "^1.0.0"
},
"dependencies": {
"is-glob": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
"requires": {
"is-extglob": "^2.1.0"
}
}
"is-glob": "^4.0.1"
}
},
"globals": {
@@ -856,6 +787,13 @@
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
}
}
},
"http-signature": {
@@ -905,14 +843,14 @@
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"inquirer": {
"version": "6.4.1",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.4.1.tgz",
"integrity": "sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==",
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
"integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
"requires": {
"ansi-escapes": "^3.2.0",
"chalk": "^2.4.2",
@@ -920,28 +858,13 @@
"cli-width": "^2.0.0",
"external-editor": "^3.0.3",
"figures": "^2.0.0",
"lodash": "^4.17.11",
"lodash": "^4.17.12",
"mute-stream": "0.0.7",
"run-async": "^2.2.0",
"rxjs": "^6.4.0",
"string-width": "^2.1.0",
"strip-ansi": "^5.1.0",
"through": "^2.3.6"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
"ansi-regex": "^4.1.0"
}
}
}
},
"ipaddr.js": {
@@ -949,11 +872,6 @@
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
"integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
},
"is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
},
"is-buffer": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
@@ -982,21 +900,11 @@
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
},
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -1057,14 +965,6 @@
"verror": "1.10.0"
}
},
"kuler": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz",
"integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==",
"requires": {
"colornames": "^1.1.1"
}
},
"levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@@ -1079,25 +979,6 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"logform": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz",
"integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==",
"requires": {
"colors": "^1.2.1",
"fast-safe-stringify": "^2.0.4",
"fecha": "^2.3.3",
"ms": "^2.1.1",
"triple-beam": "^1.3.0"
},
"dependencies": {
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -1237,11 +1118,6 @@
"wrappy": "1"
}
},
"one-time": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
"integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4="
},
"onetime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
@@ -1286,11 +1162,6 @@
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"path-dirname": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
"integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -1316,11 +1187,6 @@
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
},
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -1336,9 +1202,9 @@
}
},
"psl": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz",
"integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA=="
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.3.1.tgz",
"integrity": "sha512-2KLd5fKOdAfShtY2d/8XDWVRnmp3zp40Qt6ge2zBPFARLXOGUf2fHD5eg+TV/5oxBtQKVhjUaKFsAaE4HnwfSA=="
},
"punycode": {
"version": "2.1.1",
@@ -1366,16 +1232,6 @@
"unpipe": "1.0.0"
}
},
"readable-stream": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
"integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
}
},
"regexpp": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
@@ -1446,9 +1302,9 @@
}
},
"rxjs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
"integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
"version": "6.5.3",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
"integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
"requires": {
"tslib": "^1.9.0"
}
@@ -1464,9 +1320,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"semver": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
},
"send": {
"version": "0.17.1",
@@ -1544,14 +1400,6 @@
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
"requires": {
"is-arrayish": "^0.3.1"
}
},
"slice-ansi": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
@@ -1600,28 +1448,37 @@
"requires": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
}
},
"string_decoder": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
"integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==",
"requires": {
"safe-buffer": "~5.1.0"
},
"dependencies": {
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
"ansi-regex": "^3.0.0"
}
}
}
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
"ansi-regex": "^3.0.0"
"ansi-regex": "^4.1.0"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
}
}
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
"integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw=="
},
"supports-color": {
"version": "5.5.0",
@@ -1632,21 +1489,16 @@
}
},
"table": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/table/-/table-5.4.1.tgz",
"integrity": "sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w==",
"version": "5.4.6",
"resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
"integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
"requires": {
"ajv": "^6.9.1",
"lodash": "^4.17.11",
"ajv": "^6.10.2",
"lodash": "^4.17.14",
"slice-ansi": "^2.1.0",
"string-width": "^3.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
@@ -1656,22 +1508,9 @@
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
"ansi-regex": "^4.1.0"
}
}
}
},
"text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
"integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -1711,11 +1550,6 @@
}
}
},
"triple-beam": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
"integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
},
"tslib": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
@@ -1769,20 +1603,20 @@
"punycode": "^2.1.0"
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
"integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ=="
},
"v8-compile-cache": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
"integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g=="
},
"vary": {
"version": "1.1.2",
@@ -1808,19 +1642,16 @@
}
},
"winston": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz",
"integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==",
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz",
"integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==",
"requires": {
"async": "^2.6.1",
"diagnostics": "^1.1.1",
"is-stream": "^1.1.0",
"logform": "^2.1.1",
"one-time": "0.0.4",
"readable-stream": "^3.1.1",
"stack-trace": "0.0.x",
"triple-beam": "^1.3.0",
"winston-transport": "^4.3.0"
"async": "~1.0.0",
"colors": "1.0.x",
"cycle": "1.0.x",
"eyes": "0.1.x",
"isstream": "0.1.x",
"stack-trace": "0.0.x"
}
},
"winston-slack-transport": {
@@ -1831,39 +1662,6 @@
"request": "^2.67.0"
}
},
"winston-transport": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz",
"integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==",
"requires": {
"readable-stream": "^2.3.6",
"triple-beam": "^1.2.0"
},
"dependencies": {
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
}
}
},
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",

View File

@@ -31,7 +31,7 @@
"moment": "^2.24.0",
"node-cron": "^2.0.3",
"node-fetch": "^2.6.0",
"winston": "^3.2.1",
"winston": "^2.4.0",
"winston-slack-transport": "^2.0.0"
},
"devDependencies": {

View File

@@ -9,11 +9,6 @@ if (process.env.PORT) {
handleExceptions: true
});
}
else {
winston.add(new winston.transports.Console({
format: winston.format.simple()
}));
}
module.exports = {
log: (functionName, error) => {

101
smoke-test/accounts.test.js Normal file
View File

@@ -0,0 +1,101 @@
const puppeteer = require('puppeteer');
var should = require('should');
var utils = require('./test-utils');
var browser, page, userCredentials;
describe('Login API', () => {
beforeAll(async () => {
jest.setTimeout(15000);
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
// intercept request and mock response for login
await page.setRequestInterception(true);
await page.on('request', async (request) => {
if ((await request.url()).match(/user\/login/)) {
request.respond({
status: 200,
contentType: 'application/json',
body: JSON.stringify(userCredentials)
});
} else {
request.continue();
}
});
await page.on('response', async (response) => {
try {
var res = await response.json();
if (res && res.tokens) {
userCredentials = res;
}
} catch (error) { }
});
});
afterAll(async () => {
await browser.close();
});
it('Should login valid User', async () => {
await page.goto(utils.ACCOUNTS_URL + '/register', { waitUntil: 'networkidle2' });
await page.waitForSelector('#email');
await page.click('input[name=email]');
await page.type('input[name=email]', utils.user.email);
await page.click('input[name=name]');
await page.type('input[name=name]', utils.user.name);
await page.click('input[name=companyName]');
await page.type('input[name=companyName]', utils.user.company.name);
await page.click('input[name=companyPhoneNumber]');
await page.type('input[name=companyPhoneNumber]', utils.user.phone);
await page.click('input[name=password]');
await page.type('input[name=password]', utils.user.password);
await page.click('input[name=confirmPassword]');
await page.type('input[name=confirmPassword]', utils.user.password);
await page.click('button[type=submit]');
await page.waitFor(10000);
await page.waitForSelector('#cardName');
await page.click('input[name=cardName]');
await page.type('input[name=cardName]', utils.user.name);
await page.click('input[name=cardNumber]');
await page.type('input[name=cardNumber]', utils.user.card);
await page.click('input[name=cvc]');
await page.type('input[name=cvc]', utils.user.cvv);
await page.click('input[name=expiry]');
await page.type('input[name=expiry]', utils.user.expiryDate);
await page.click('input[name=address1]');
await page.type('input[name=address1]', utils.user.address.streetA);
await page.click('input[name=address2]');
await page.type('input[name=address2]', utils.user.address.streetB);
await page.click('input[name=city]');
await page.type('input[name=city]', utils.user.address.city);
await page.click('input[name=state]');
await page.type('input[name=state]', utils.user.address.state);
await page.click('input[name=zipCode]');
await page.type('input[name=zipCode]', utils.user.address.zipcode);
await page.select('#country', 'India');
await page.click('button[type=submit]');
await page.waitFor(15000);
await page.goto(utils.ACCOUNTS_URL + '/login');
await page.waitForSelector('#login-button');
await page.click('input[name=email]');
await page.type('input[name=email]', utils.user.email);
await page.click('input[name=password]');
await page.type('input[name=password]', utils.user.password);
await page.click('button[type=submit]');
await page.waitFor(10000);
var localStorageData = await page.evaluate(() => {
var json = {};
for (var i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
json[key] = localStorage.getItem(key);
}
return json;
});
localStorageData.should.have.property('sessionID');
localStorageData.should.have.property('access_token');
localStorageData.should.have.property('email', utils.user.email);
page.url().should.containEql(utils.DASHBOARD_URL);
}, 160000);
})

View File

@@ -0,0 +1,25 @@
const utils= require('./test-utils');
const puppeteer = require('puppeteer');
var page, browser;
beforeAll(async () => {
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
})
afterAll(async () => {
await browser.close();
})
describe('Check api-docs up', () => {
test('should get title of api docs page', async () => {
await page.goto(utils.APIDOCS_URL, {
waitUntil: 'domcontentloaded'
});
const response = await page.$eval('head > title', (e) => {
return e.innerHTML;
});
expect(response).toBe('Fyipe API Documentation');
})
})

View File

@@ -0,0 +1,25 @@
const utils = require('./test-utils');
const puppeteer = require('puppeteer');
var page, browser;
beforeAll(async () => {
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
});
afterAll(async () => {
await browser.close();
});
describe('Check Backend', () => {
test('should get status ok from backend', async () => {
await page.goto(utils.BACKEND_URL, {
waitUntil: 'networkidle0'
});
const response = await page.$eval('body > pre', (e) => {
return e.innerHTML;
});
expect(response).toBe('{"status":200,"message":"Service Status - OK"}');
});
});

View File

@@ -0,0 +1,136 @@
const puppeteer = require('puppeteer');
var should = require('should');
var utils = require('./test-utils');
var browser, page, userCredentials;
describe('Monitor API', () => {
const operationTimeOut = 50000;
beforeAll(async () => {
jest.setTimeout(150000);
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
// intercept request and mock response for login
await page.setRequestInterception(true);
await page.on('request', async (request)=>{
if((await request.url()).match(/user\/login/)){
request.respond({
status: 200,
contentType: 'application/json',
body: JSON.stringify(userCredentials)
});
}else{
request.continue();
}
});
await page.on('response', async (response)=>{
try{
const res = await response.json();
if(res && res.tokens){
userCredentials = res;
}
}catch(error){}
});
});
afterAll(async () => {
await browser.close();
});
it('Should login valid User', async () => {
await page.goto(utils.ACCOUNTS_URL + '/register', { waitUntil: 'networkidle2' });
await page.waitForSelector('#email');
await page.click('input[name=email]');
await page.type('input[name=email]', utils.user.email);
await page.click('input[name=name]');
await page.type('input[name=name]', utils.user.name);
await page.click('input[name=companyName]');
await page.type('input[name=companyName]', utils.user.company.name);
await page.click('input[name=companyPhoneNumber]');
await page.type('input[name=companyPhoneNumber]', utils.user.phone);
await page.click('input[name=password]');
await page.type('input[name=password]', utils.user.password);
await page.click('input[name=confirmPassword]');
await page.type('input[name=confirmPassword]', utils.user.password);
await page.click('button[type=submit]');
await page.waitFor(10000);
await page.waitForSelector('#cardName');
await page.click('input[name=cardName]');
await page.type('input[name=cardName]', utils.user.name);
await page.click('input[name=cardNumber]');
await page.type('input[name=cardNumber]', utils.user.card);
await page.click('input[name=cvc]');
await page.type('input[name=cvc]', utils.user.cvv);
await page.click('input[name=expiry]');
await page.type('input[name=expiry]', utils.user.expiryDate);
await page.click('input[name=address1]');
await page.type('input[name=address1]', utils.user.address.streetA);
await page.click('input[name=address2]');
await page.type('input[name=address2]', utils.user.address.streetB);
await page.click('input[name=city]');
await page.type('input[name=city]', utils.user.address.city);
await page.click('input[name=state]');
await page.type('input[name=state]', utils.user.address.state);
await page.click('input[name=zipCode]');
await page.type('input[name=zipCode]', utils.user.address.zipcode);
await page.select('#country', 'India');
await page.click('button[type=submit]');
await page.waitFor(15000);
await page.goto(utils.ACCOUNTS_URL + '/login');
await page.waitForSelector('#login-button');
await page.click('input[name=email]');
await page.type('input[name=email]', utils.user.email);
await page.click('input[name=password]');
await page.type('input[name=password]', utils.user.password);
await page.click('button[type=submit]');
await page.waitFor(10000);
var localStorageData = await page.evaluate(() => {
var json = {};
for (var i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
json[key] = localStorage.getItem(key);
}
return json;
});
localStorageData.should.have.property('sessionID');
localStorageData.should.have.property('access_token');
localStorageData.should.have.property('email', utils.user.email);
page.url().should.containEql(utils.DASHBOARD_URL);
}, 160000);
it('Should create new monitor with correct details', async () => {
let monitorName = utils.generateRandomString();
await page.waitForSelector('#monitors');
await page.click('#monitors');
await page.waitForSelector('#frmNewMonitor');
await page.click('input[id=name]');
await page.type('input[id=name]', monitorName);
await page.select('select[name=type_1000]','url');
await page.waitForSelector('#url');
await page.click('#url');
await page.type('#url', 'https://google.com');
await page.click('button[type=submit]');
await page.waitFor(5000);
let spanElement;
spanElement = await page.$('span.ContentHeader-title.Text-color--dark.Text-display--inline.Text-fontSize--20.Text-fontWeight--regular.Text-lineHeight--28.Text-typeface--base.Text-wrap--wrap');
spanElement = await spanElement.getProperty('innerText');
spanElement = await spanElement.jsonValue();
spanElement.should.be.exactly(monitorName);
}, operationTimeOut);
it('Should delete monitor', async () => {
await page.waitForSelector('#name');
await page.evaluate(() => {
document.querySelector('div.Box-root div.db-Trends-header div.db-Trends-controls div button.bs-Button.bs-DeprecatedButton.db-Trends-editButton.bs-Button--icon.bs-Button--delete').click();
});
await page.evaluate(() => {
document.querySelector('button.bs-DeprecatedButton:nth-child(2)').click();
});
}, operationTimeOut);
});

129
smoke-test/home.test.js Executable file
View File

@@ -0,0 +1,129 @@
const puppeteer = require('puppeteer')
const util = require('./test-utils')
var page, browser;
beforeAll(async () => {
browser = await puppeteer.launch(util.puppeteerLaunchConfig)
page = await browser.newPage()
})
afterAll(async () => {
await browser.close()
})
describe('Request demo', () => {
test('user can submit request a demo form', async () => {
await page.goto(`${util.HOME_URL}/enterprise/demo`)
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.type('#message', util.user.message)
await page.click('#request-demo-btn')
await page.waitForSelector('#success')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
test('user can request for website monitoring resource', async () => {
await page.goto(`${util.HOME_URL}/enterprise/resources`)
await page.waitForSelector('#website-monitoring')
await Promise.all([
page.waitForNavigation(),
page.click('#website-monitoring'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
test('user can request for speed equals revenue resource', async () => {
await page.goto(`${util.HOME_URL}/enterprise/resources`)
await page.waitForSelector('#speed-revenue')
await Promise.all([
page.waitForNavigation(),
page.click('#speed-revenue'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
test('user can request for best practices resource', async () => {
await page.goto(`${util.HOME_URL}/enterprise/resources`)
await page.waitForSelector('#best-practices')
await Promise.all([
page.waitForNavigation(),
page.click('#best-practices'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
test('user can request for peak performance resource', async () => {
await page.goto(`${util.HOME_URL}/enterprise/resources`)
await page.waitForSelector('#peak-performance')
await Promise.all([
page.waitForNavigation(),
page.click('#peak-performance'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
})

View File

@@ -1,3 +0,0 @@
const smoketest = require('./smokeTest.test')
smoketest.smokeTest()

4475
smoke-test/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

18
smoke-test/package.json Normal file
View File

@@ -0,0 +1,18 @@
{
"name": "smoke-test",
"version": "1.0.0",
"description": "Smoke tests for fyipe",
"main": "index.test.js",
"scripts": {
"test": "jest --runInBand ."
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"faker": "^4.1.0",
"jest": "^24.7.1",
"puppeteer": "^1.17.0",
"should": "^13.2.3"
}
}

View File

@@ -1,215 +0,0 @@
module.exports = {
smokeTest: () => {
const faker = require('faker')
const puppeteer = require('puppeteer')
const user = {
name: faker.name.findName(),
email: faker.internet.email(),
website: 'www.testcompanyfyipe.com',
company: faker.company.companyName(),
companySize: 8,
message: faker.company.catchPhraseDescriptor(),
}
let page
let browser
const baseURL = 'http://localhost:1444'
// Enable for live viewing of tests.
/* beforeAll(async () => {
const width = 1200
const height = 720
browser = await puppeteer.launch(
{
headless: false,
slowMo: 60,
arg: [`--window-size=${width},${height}`],
},
)
page = await browser.newPage()
await page.setViewport({ width, height })
}) */
// Run this for headless testing with puppeteer.
beforeAll(async () => {
browser = await puppeteer.launch()
page = await browser.newPage()
})
afterAll(() => {
browser.close()
})
describe('Request demo', () => {
test('user can submit request a demo form', async () => {
await page.goto(`${baseURL}/enterprise/demo`)
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.type('#message', user.message)
await page.click('#request-demo-btn')
await page.waitForSelector('#success')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can request for website monitoring resource', async () => {
await page.goto(`${baseURL}/enterprise/resources`)
await page.waitForSelector('#website-monitoring')
await Promise.all([
page.waitForNavigation(),
page.click('#website-monitoring'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can request for speed equals revenue resource', async () => {
await page.goto(`${baseURL}/enterprise/resources`)
await page.waitForSelector('#speed-revenue')
await Promise.all([
page.waitForNavigation(),
page.click('#speed-revenue'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can request for best practices resource', async () => {
await page.goto(`${baseURL}/enterprise/resources`)
await page.waitForSelector('#best-practices')
await Promise.all([
page.waitForNavigation(),
page.click('#best-practices'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can request for peak performance resource', async () => {
await page.goto(`${baseURL}/enterprise/resources`)
await page.waitForSelector('#peak-performance')
await Promise.all([
page.waitForNavigation(),
page.click('#peak-performance'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can signup for a fyipe account and logout', async () => {
await page.goto(baseURL)
await page.waitForSelector('#create-account-top')
await Promise.all([
page.waitForNavigation(),
page.click('#create-account-top'),
])
await page.waitForSelector('#main-body')
await page.type('#email', user.email)
await page.type('#name', user.name)
await page.type('#password', user.password)
await page.type('#confirmPassword', user.password)
await page.click('#create-account-button')
await page.waitForSelector('#card-form')
await page.type('#cardName', user.name)
await page.type('#cardNumber', user.cardNumber)
await page.type('#cvv', user.cvv)
await page.type('#expiry', user.expiry)
await page.type('#address1', user.address1)
await page.type('#address2', user.address2)
await page.type('#city', user.city)
await page.type('#state', user.state)
await page.type('#zipCode', user.zipCode)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#create-account-button')
await page.waitForSelector('#companyName')
await page.type('#companyName', user.company)
await page.type('#companyRole', user.companyRole)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#companySize')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.type('#companyPhoneNumber', user.companyPhoneNumber)
await page.type('#reference', user.reference)
await page.click('#create-account-button')
await page.waitForNavigation()
await page.click('#profile-menu')
await page.click('#logout-button')
await page.waitForSelector('#login')
}, 60000)
test('user can login to and logout of fyipe', async () => {
await page.goto(baseURL)
await page.waitForSelector('#sign-in')
await Promise.all([
page.waitForNavigation(),
page.click('#sign-in'),
])
await page.waitFor(5000)
await page.waitForSelector('#login')
await page.type('#email', user.email)
await page.type('#password', user.password)
await page.click('#login-button')
await page.waitForNavigation()
await page.click('#profile-menu')
await page.click('#logout-button')
await page.waitForSelector('#login')
}, 30000)
})
},
}

View File

@@ -0,0 +1,26 @@
const utils= require('./test-utils');
const puppeteer = require('puppeteer');
var page, browser;
beforeAll(async () => {
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
})
afterAll(async () => {
await browser.close();
})
describe('Check status-page up', () => {
test('should load status page and show login screen', async () => {
await page.goto(utils.STATUSPAGE_URL, {
waitUntil: 'domcontentloaded'
});
await page.waitFor(2000);
const response = await page.$eval('#login-button > span', (e) => {
return e.innerHTML;
});
expect(response).toBe('Sign in to your account');
})
})

47
smoke-test/test-utils.js Normal file
View File

@@ -0,0 +1,47 @@
const faker = require('faker')
var user = faker.helpers.createCard();
user.email = generateRandomBusinessEmail();
user.password = generatePassword();
user.card = '4111111111111111';
user.cvv = '100';
user.expiryDate = '12/23';
user.message = 'Test message'
const puppeteerLaunchConfig = {
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
]
}
const HOME_URL = process.env.HOME_URL || 'http://localhost:1444';
const ACCOUNTS_URL = process.env.ACCOUNTS_URL || 'http://localhost:3003';
const DASHBOARD_URL = process.env.DASHBOARD_URL || 'http://localhost:3000';
const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:3002';
const STATUSPAGE_URL = process.env.STATUSPAGE_URL || 'http://localhost:3006';
const APIDOCS_URL = process.env.APIDOCS_URL || 'http://localhost:1445';
function generateRandomBusinessEmail() {
return Math.random().toString(36).substring(8) + '@' + Math.random().toString(24).substring(8) + '.com'
}
function generatePassword() {
return Math.random().toString(36).substring(7);
}
function generateRandomString() {
return faker.lorem.word();
}
module.exports = {
HOME_URL,
ACCOUNTS_URL,
DASHBOARD_URL,
BACKEND_URL,
STATUSPAGE_URL,
APIDOCS_URL,
user,
puppeteerLaunchConfig,
generateRandomString
}