diff --git a/.env.example b/.env.example index a750406..0e95b70 100644 --- a/.env.example +++ b/.env.example @@ -1,97 +1,22 @@ -## The overall settings for all servers, not all keys correspond one on one with the seperate servers, see the config.js file if you want to run a server independently +AUTH_FIRST_CLIENT_LOGIN_CODE=CREATEACODE -# MYSQL settings, host should be set to mysql not localhost (corresponding to name in compose file) -MYSQL_HOST=localhost -MYSQL_USER= -MYSQL_PASSWORD= -# depends on mysql version, see docs -MYSQL_ST_GEO_MODE=on -# this is probably unnecessary -#for dev turn off secure sessions, should be on in prod! -COOKIE_SECURE_OFF=yes +BASE_DOMAIN=openstad.local -#set unique -SESSION_SECRET=xyxyxyxy +DB_HOST=localhost +DB_USERNAME=USERNAME +DB_PASSWORD=PASSWORD +DB_BASE_NAME=openstad -#mail -MAIL_TRANSPORT_SMTP_HOST=smtp.gmail.com -MAIL_TRANSPORT_SMTP_HOST=true -MAIL_TRANSPORT_SMTP_AUTH_PASS=1234 -MAIL_TRANSPORT_SMTP_AUTH_USER=openstad@openstad.org -MAIL_TRANSPORT_SMTP_PORT=587 -MAIL_TRANSPORT_SMTP_REQUIRESSL=true +MONGO_HOST=database-server -#api -API_PORT=8111 -API_URL=http://localhost:8111 -API_HOSTNAME=localhost -API_DATABASE=api -API_EMAILADDRESS=admin@openstad.org -API_MAIL_FROM=`Openstad Dev` -API_NOTIFICATIONS_ADMIN_EMAILADDRESS=admin@openstad.org -API_SECURITY_SESSIONS_COOKIENAME=cookies -API_SECURITY_SESSIONS_ONLYSECURE=false -API_AUTHORIZATION_JWTSECRET=123456 -#this seem a bit weird. A user is created in the DB for the CMS to query the api. The token is necessary for identification -#token here has to correspond with FRONTEND_SITE_API_KEY -API_AUTHORIZATION_FIXEDAUTHTOKENS=[{"token": "xxxxxxx", "userId": "2"}] +BASIC_AUTH_USER=openstad +BASIC_AUTH_PASSWORD=openstad -#images -IMAGE_DB_NAME=image -IMAGE_APP_URL=http://localhost:3333 -IMAGE_API_ACCESS_TOKEN=xxxxxx -IMAGE_PORT_API=3333 -IMAGE_PORT_STEAM=7777 -FIRST_IMAGE_API_ACCESS_TOKEN=xxxx +FROM_EMAIL_ADDRESS=user@example.xx +SMTP_PORT=465 +SMTP_HOST=smtp.example.xx +SMTP_USERNAME=USERNAME +SMTP_PASSWORD=PASSWORD -#auth -AUTH_DB_NAME=auth -AUTH_PORT=4000 -AUTH_APP_URL=http://localhost:4000 -AUTH_MAIL_FROM_NAME=`Authenticatie Openstad` -AUTH_MAIL_FROM_MAIL=`auth@openstad.org` -AUTH_INTERNAL_SERVER_URL=http://localhost:4000 - -# this wont work for images if it's a localhost of course, -# when practically necessary I normally just take staging url -# would be better to embed images would render this unnecessary -AUTH_EMAIL_ASSETS_URL=http://localhost:4000 - -#frontend -FRONTED_PORT=4444 -#makes a database for the first site -FRONTED_DEFAULT_MONGO_DB=default_db - -#allows to connect to API as admin user -#FRONTEND_SITE_API_KEY=123456 -FRONTEND_URL=http://localhost:4444 -FRONTEND_APOS_WORKFLOW=ON -#this is for the /login route but not used anymore in new verions -FRONTEND_LOGIN_CSM_BASIC_AUTH_USER=me -FRONTEND_LOGIN_CSM_BASIC_AUTH_PASSWORD=password - -#the api calls are made over internal network, for docker or live systems this can be over the internal network to reduce network latency -FRONTEND_INTERNAL_API_URL=http://localhost:8111 -#redirects are done through browser that need to go over public network -FRONTEND_API_URL=http://localhost:8111 -FRONTEND_MONGO_SCHEME=mongodb://localhost -FRONTEND_MONGO_DB_HOST=localhost -FRONTEND_MONGO_PORT=27017 -FRONTEND_MINIFY_JS=OFF -FRONTEND_SITE_API_KEY=xxxxxxx - -#GENERATION VALUES, these are used for generating values in migration -#this will set these values to the first client if you run the auth seed, AUTH_FIRST_CLIENT_LOGIN_CODE will be the first login code -AUTH_FIRST_CLIENT_ID=cccccc -AUTH_FIRST_CLIENT_SECRET=xxxxxxxx -AUTH_FIRST_CLIENT_URL=xxxxxxxx -AUTH_FIRST_CLIENT_LOGIN_CODE=test_openstad - -AUTH_ADMIN_CLIENT_ID=bbbbb -AUTH_ADMIN_CLIENT_SECRET=xcxcxc -ADMIN_BASIC_AUTH_USER=user -ADMIN_BASIC_AUTH_PASSWORD=pass - -#admin -ADMIN_PORT=7777 -ADMIN_URL=http://localhost:7777 +FORCE_HTTP=true +SERVER_IP=IPNUMBER diff --git a/.gitignore b/.gitignore index 971e848..cf9def3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,6 @@ npm-debug.log node_modules .jshintrc .env -.idea/ store.json tmp +nginx.config.example diff --git a/.gitmodules b/.gitmodules index 84cc47a..b8c51fa 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,15 +1,20 @@ [submodule "frontend"] - path = frontend - url = https://github.com/Amsterdam/openstad-frontend + path = openstad-frontend + url = https://github.com/openstad/openstad-frontend + branch = master [submodule "api"] - path = api - url = https://github.com/Amsterdam/openstad-api + path = openstad-api + url = https://github.com/openstad/openstad-api + branch = master [submodule "auth"] - path = auth - url = https://github.com/Amsterdam/openstad-oauth2-server + path = openstad-oauth-server + url = https://github.com/openstad/openstad-oauth2-server + branch = master [submodule "image"] - path = image - url = https://github.com/Amsterdam/openstad-image-server + path = openstad-image-server + url = https://github.com/openstad/openstad-image-server + branch = master [submodule "admin"] - path = admin - url = https://github.com/Amsterdam/openstad-management-panel + path = openstad-management-panel + url = https://github.com/openstad/openstad-management-panel + branch = master diff --git a/.gitmodules.nieuw b/.gitmodules.nieuw new file mode 100644 index 0000000..b8c51fa --- /dev/null +++ b/.gitmodules.nieuw @@ -0,0 +1,20 @@ +[submodule "frontend"] + path = openstad-frontend + url = https://github.com/openstad/openstad-frontend + branch = master +[submodule "api"] + path = openstad-api + url = https://github.com/openstad/openstad-api + branch = master +[submodule "auth"] + path = openstad-oauth-server + url = https://github.com/openstad/openstad-oauth2-server + branch = master +[submodule "image"] + path = openstad-image-server + url = https://github.com/openstad/openstad-image-server + branch = master +[submodule "admin"] + path = openstad-management-panel + url = https://github.com/openstad/openstad-management-panel + branch = master diff --git a/README.md b/README.md index 7b48f99..99e0f27 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ +> [!WARNING] +> This project has been migrated to a new **monorepo** and is no longer maintained here. +> Please visit the new repository: [openstad/openstad-headless](https://github.com/openstad/openstad-headless) +> +> More information: [openstad.org](https://openstad.org/) + # Getting started -See Openstad docs for getting started instructions: https://docs.openstad.amsterdam/technical/getting-started.html +See Openstad docs for getting started instructions: https://docs.openstad.org/openstad/technical/getting-started diff --git a/admin b/admin deleted file mode 160000 index 9a4a4b2..0000000 --- a/admin +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9a4a4b2785b696dcf4a439de9bc957b5b1bcf855 diff --git a/api b/api deleted file mode 160000 index 852581b..0000000 --- a/api +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 852581bf6a143d108e48082d01fec158f949af10 diff --git a/app.js b/app.js index b36b157..32e8fb1 100644 --- a/app.js +++ b/app.js @@ -8,29 +8,28 @@ const { objectToAline } = require('./utils.js'); // commands list const commands = [ - { - name: 'Frontend', - command: `cd ./frontend && ${objectToAline(frontendConfig)} npm run dev` - }, - { - name: 'Api', - command: `cd ./api && ${objectToAline(apiConfig)} npm run dev` - }, - { - name: 'Admin', - command: `cd ./admin && ${objectToAline(adminConfig)} npm run dev` - }, - { - name: 'Image', - command: `cd ./image && ${objectToAline(imageConfig)} node server.js` - }, - { - name: 'Auth', - command: `cd ./auth && ${objectToAline(authConfig)} npm run dev` - }, +// { +// name: 'Frontend', +// command: `cd ./openstad-frontend && ${objectToAline(frontendConfig)} npm run dev` +// }, +// { +// name: 'Api', +// command: `cd ./openstad-api && ${objectToAline(apiConfig)} npm run dev` +// }, +// { +// name: 'Admin', +// command: `cd ./openstad-management-panel && ${objectToAline(adminConfig)} npm run dev` +// }, +// { +// name: 'Image', +// command: `cd ./image-server && ${objectToAline(imageConfig)} node server.js` +// }, + { + name: 'Auth', + command: `cd ./openstad-management-panel && ${objectToAline(adminConfig)} npm run dev` + }, ]; - // run command function runCommand(command, name, callback) { child_process.exec(command, function (error, stdout, stderr) { @@ -44,6 +43,7 @@ function runCommand(command, name, callback) { async function execWaitForOutput(command, execOptions = {}) { return new Promise((resolve, reject) => { + console.log('++++', adminConfig); const childProcess = exec(command, execOptions); // stream process output to console diff --git a/auth b/auth deleted file mode 160000 index b1efe84..0000000 --- a/auth +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b1efe8419f794b5513143e1b8ec961097ea60e04 diff --git a/config.js b/config.js index 1c8c07d..fc66447 100644 --- a/config.js +++ b/config.js @@ -5,13 +5,13 @@ require('dotenv').config(); exports.frontendConfig = { - PORT: process.env.FRONTED_PORT, + PORT: process.env.FRONTEND_PORT, DB_HOST: process.env.FRONTEND_MONGO_DB_HOST, DB_PORT: process.env.FRONTEND_MONGO_PORT, MONGO_DB_HOST: process.env.FRONTEND_MONGO_DB_HOST, APOS_ALWAYS_COPY_ASSETS: '1', APOS_WORKFLOW: process.env.FRONTEND_APOS_WORKFLOW, - DEFAULT_DB: process.env.FRONTED_DEFAULT_MONGO_DB, + DEFAULT_DB: process.env.FRONTEND_DEFAULT_MONGO_DB, IMAGE_API_URL: process.env.IMAGE_APP_URL, IMAGE_API_ACCESS_TOKEN: process.env.IMAGE_API_ACCESS_TOKEN, INTERNAL_API_URL: process.env.FRONTEND_INTERNAL_API_URL, @@ -81,7 +81,7 @@ exports.authConfig = { COOKIE_SECURE_OFF: process.env.COOKIE_SECURE_OFF, AUTH_FIRST_CLIENT_ID: process.env.AUTH_FIRST_CLIENT_ID, AUTH_FIRST_CLIENT_SECRET: process.env.AUTH_FIRST_CLIENT_SECRET, - AUTH_FIRST_CLIENT_URL: process.env.FRONTED_URL, + AUTH_FIRST_CLIENT_URL: process.env.FRONTEND_URL, AUTH_FIRST_CLIENT_LOGIN_CODE: process.env.AUTH_FIRST_CLIENT_LOGIN_CODE, MONGO_DB_HOST: process.env.FRONTEND_MONGO_DB_HOST, MONGO_DB_PORT: process.env.FRONTEND_MONGO_PORT, diff --git a/docker-compose.yml b/docker-compose.yml index 0b193a2..2607daf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -111,7 +111,7 @@ services: COOKIE_SECURE_OFF: "${COOKIE_SECURE_OFF}" AUTH_FIRST_CLIENT_ID: "${AUTH_FIRST_CLIENT_ID}" AUTH_FIRST_CLIENT_SECRET: "${AUTH_FIRST_CLIENT_SECRET}" - AUTH_FIRST_CLIENT_URL: "${FRONTED_URL}" + AUTH_FIRST_CLIENT_URL: "${FRONTEND_URL}" AUTH_FIRST_CLIENT_LOGIN_CODE: "${AUTH_FIRST_CLIENT_LOGIN_CODE}" MONGO_DB_HOST: "${FRONTEND_MONGO_DB_HOST}" MONGO_DB_PORT: "${FRONTEND_MONGO_PORT}" @@ -176,15 +176,15 @@ services: command: npm run dev build: frontend ports: - - ${FRONTED_PORT}:${FRONTED_PORT} + - ${FRONTEND_PORT}:${FRONTEND_PORT} environment: - PORT: "${FRONTED_PORT}" + PORT: "${FRONTEND_PORT}" DB_HOST: "${FRONTEND_MONGO_DB_HOST}" DB_PORT: "${FRONTEND_MONGO_PORT}" MONGO_DB_HOST: "${FRONTEND_MONGO_DB_HOST}" APOS_ALWAYS_COPY_ASSETS: '1' APOS_WORKFLOW: "${FRONTEND_APOS_WORKFLOW}" - DEFAULT_DB: "${FRONTED_DEFAULT_MONGO_DB}" + DEFAULT_DB: "${FRONTEND_DEFAULT_MONGO_DB}" IMAGE_API_URL: "${IMAGE_APP_URL}" IMAGE_API_ACCESS_TOKEN: "${IMAGE_API_ACCESS_TOKEN}" INTERNAL_API_URL: "${FRONTEND_INTERNAL_API_URL}" diff --git a/frontend b/frontend deleted file mode 160000 index 833e211..0000000 --- a/frontend +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 833e2115f630065cb38f307cba8497f2d91d4843 diff --git a/image b/image deleted file mode 160000 index 171bee5..0000000 --- a/image +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 171bee50395093db682a42737121016531198498 diff --git a/openstad-api b/openstad-api new file mode 160000 index 0000000..a457dbf --- /dev/null +++ b/openstad-api @@ -0,0 +1 @@ +Subproject commit a457dbf3d818388e718b512a5ea775d78d8f0d82 diff --git a/openstad-frontend b/openstad-frontend new file mode 160000 index 0000000..9fdab48 --- /dev/null +++ b/openstad-frontend @@ -0,0 +1 @@ +Subproject commit 9fdab48a8f0e6d9daff77fbaba51f1c0ce664ddc diff --git a/openstad-image-server b/openstad-image-server new file mode 160000 index 0000000..c43175b --- /dev/null +++ b/openstad-image-server @@ -0,0 +1 @@ +Subproject commit c43175b20d4003feb858a5ea7229e755c3d2fc5f diff --git a/openstad-management-panel b/openstad-management-panel new file mode 160000 index 0000000..9316bc4 --- /dev/null +++ b/openstad-management-panel @@ -0,0 +1 @@ +Subproject commit 9316bc4f3ec0452831a204cec292c88d5c9b9761 diff --git a/openstad-oauth-server b/openstad-oauth-server new file mode 160000 index 0000000..5ee398d --- /dev/null +++ b/openstad-oauth-server @@ -0,0 +1 @@ +Subproject commit 5ee398dd514952029e1e079a7dc61dd8a92a8d3a diff --git a/package-lock.json b/package-lock.json index be16ce2..5f9252d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1299 +1,523 @@ { "name": "openstad-app", "version": "0.9.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, + "packages": { + "": { + "name": "openstad-app", + "version": "0.9.0", + "license": "MIT", "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "dotenv": "^8.2.0", + "knex": "^0.95.11", + "openssl-nodejs": "^1.0.5", + "promise-mysql": "^5.2.0" } }, - "bcrypt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.0.tgz", - "integrity": "sha512-jB0yCBl4W/kVHM2whjfyqnxTmOHkCX4kHEa5nYKSoGeYe8YrjTYTc87/6bwt1g8cmV0QrbhKriETg9jWtcREhg==", - "requires": { - "node-addon-api": "^3.0.0", - "node-pre-gyp": "0.15.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "node_modules/@types/bluebird": { + "version": "3.5.36", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.36.tgz", + "integrity": "sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==" }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, + "node_modules/@types/mysql": { + "version": "2.15.21", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", + "integrity": "sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg==", "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "@types/node": "*" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "node_modules/@types/node": { + "version": "18.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz", + "integrity": "sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ==" }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "colorette": { + "node_modules/colorette": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" }, - "commander": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", - "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" } }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" - }, - "detect-libc": { + "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" - }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "ms": "2.1.2" }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "engines": { + "node": ">=6.0" }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "^1.0.1" + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getopts": { + "node_modules/getopts": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==" }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "has": { + "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { + "dependencies": { "function-bind": "^1.1.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "engines": { + "node": ">= 0.4.0" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "interpret": { + "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "engines": { + "node": ">= 0.10" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, + "node_modules/is-core-module": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "requires": { "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { + "node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, + "node_modules/knex": { + "version": "0.95.11", + "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.11.tgz", + "integrity": "sha512-grDetD91O8VoQVCFqeWTgkzdq5406W6rggF/lK1hHuwzmjDs/0m9KxyncGdZbklTi7aUgHvw3+Cfy4x7FvpdaQ==", "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } + "colorette": "1.2.1", + "commander": "^7.1.0", + "debug": "4.3.2", + "escalade": "^3.1.1", + "esm": "^3.2.25", + "getopts": "2.2.5", + "interpret": "^2.2.0", + "lodash": "^4.17.21", + "pg-connection-string": "2.5.0", + "rechoir": "0.7.0", + "resolve-from": "^5.0.0", + "tarn": "^3.0.1", + "tildify": "2.0.0" + }, + "bin": { + "knex": "bin/cli.js" + }, + "engines": { + "node": ">=10" + }, + "peerDependenciesMeta": { + "mysql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true } } }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "requires": { - "is-unc-path": "^1.0.0" - } + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "requires": { - "unc-path-regex": "^0.1.2" + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "node_modules/openssl-nodejs": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/openssl-nodejs/-/openssl-nodejs-1.0.5.tgz", + "integrity": "sha512-6+nxZBw96nK1WUk5yIjhv9NRjqtNTfklB508T64BG5TQ8fU1x1rJrc1I3iVW+31KjnYYYwInGTopYxFJa7wMqA==" }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" }, - "knex": { - "version": "0.21.13", - "resolved": "https://registry.npmjs.org/knex/-/knex-0.21.13.tgz", - "integrity": "sha512-O3Zfc7ZHWe32q5k1Z8TqzmiGYVQ9+Tiqb4wP9tPF/ho9DUrHuuy5fLVDdkwDN0gHIr+q5t+XJzNW40DkmeL7lw==", - "requires": { - "colorette": "1.2.1", - "commander": "^6.2.0", - "debug": "4.3.1", - "esm": "^3.2.25", - "getopts": "2.2.5", - "interpret": "^2.2.0", - "liftoff": "3.1.0", - "lodash": "^4.17.20", - "pg-connection-string": "2.4.0", - "tarn": "^3.0.1", - "tildify": "2.0.0", - "v8flags": "^3.2.0" - } + "node_modules/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==" }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "node_modules/promise-mysql": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/promise-mysql/-/promise-mysql-5.2.0.tgz", + "integrity": "sha512-IKkBe7OukgCpy5U5EZPlgH6BRvnngmP+HwD6PoMNzvGXBYVZkiJ5nx6SY7bo+sgwXsMOVE7zQf6CfS9qaFs2pw==", + "dependencies": { + "@types/bluebird": "^3.5.26", + "@types/mysql": "^2.15.2", + "bluebird": "^3.5.1", + "mysql": "^2.18.1" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "requires": { - "kind-of": "^6.0.2" + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "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" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" + "node_modules/rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" } }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" + "node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } + "node_modules/tarn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.1.tgz", + "integrity": "sha512-6usSlV9KyHsspvwu2duKH+FMUhqJnAh6J5J/4MITl8s94iSUQTLkJggdiewKv4RyARQccnigV48Z+khiuVZDJw==", + "engines": { + "node": ">=8.0.0" } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "engines": { + "node": ">=8" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + }, + "dependencies": { + "@types/bluebird": { + "version": "3.5.36", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.36.tgz", + "integrity": "sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==" }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "@types/mysql": { + "version": "2.15.21", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", + "integrity": "sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg==", "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "@types/node": "*" } }, - "needle": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", - "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } + "@types/node": { + "version": "18.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz", + "integrity": "sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ==" }, - "node-addon-api": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", - "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==" + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" }, - "node-pre-gyp": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", - "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.3", - "needle": "^2.5.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" + "ms": "2.1.2" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } + "getopts": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", + "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==" }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" + "function-bind": "^1.1.1" } }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "is-core-module": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", "requires": { - "wrappy": "1" + "has": "^1.0.3" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "knex": { + "version": "0.95.11", + "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.11.tgz", + "integrity": "sha512-grDetD91O8VoQVCFqeWTgkzdq5406W6rggF/lK1hHuwzmjDs/0m9KxyncGdZbklTi7aUgHvw3+Cfy4x7FvpdaQ==", "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "colorette": "1.2.1", + "commander": "^7.1.0", + "debug": "4.3.2", + "escalade": "^3.1.1", + "esm": "^3.2.25", + "getopts": "2.2.5", + "interpret": "^2.2.0", + "lodash": "^4.17.21", + "pg-connection-string": "2.5.0", + "rechoir": "0.7.0", + "resolve-from": "^5.0.0", + "tarn": "^3.0.1", + "tildify": "2.0.0" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", "requires": { - "path-root-regex": "^0.1.0" + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" } }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + "openssl-nodejs": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/openssl-nodejs/-/openssl-nodejs-1.0.5.tgz", + "integrity": "sha512-6+nxZBw96nK1WUk5yIjhv9NRjqtNTfklB508T64BG5TQ8fU1x1rJrc1I3iVW+31KjnYYYwInGTopYxFJa7wMqA==" }, - "pg-connection-string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.4.0.tgz", - "integrity": "sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ==" + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" }, "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==" }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "promise-mysql": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/promise-mysql/-/promise-mysql-5.2.0.tgz", + "integrity": "sha512-IKkBe7OukgCpy5U5EZPlgH6BRvnngmP+HwD6PoMNzvGXBYVZkiJ5nx6SY7bo+sgwXsMOVE7zQf6CfS9qaFs2pw==", "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "@types/bluebird": "^3.5.26", + "@types/mysql": "^2.15.2", + "bluebird": "^3.5.1", + "mysql": "^2.18.1" } }, "readable-stream": { @@ -1311,295 +535,36 @@ } }, "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "resolve": "^1.9.0" } }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { - "is-core-module": "^2.1.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==" }, "string_decoder": { "version": "1.1.1", @@ -1609,33 +574,6 @@ "safe-buffer": "~5.1.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "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=" - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, "tarn": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.1.tgz", @@ -1646,144 +584,10 @@ "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } } diff --git a/package.json b/package.json index 7d03afc..bc376c8 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "description": "Bundled version of all openstad apps", "main": "app.js", "scripts": { + "setup": "node ./scripts/setup-all.js", + "start": "node ./scripts/start-all.js", "test": "npm run test" }, "repository": { @@ -17,8 +19,9 @@ }, "homepage": "https://github.com/Amsterdam/openstad-app#readme", "dependencies": { - "bcrypt": "^5.0.0", "dotenv": "^8.2.0", - "knex": "^0.21.13" + "knex": "^0.95.11", + "openssl-nodejs": "^1.0.5", + "promise-mysql": "^5.2.0" } } diff --git a/scripts/config.js b/scripts/config.js new file mode 100755 index 0000000..7c9a446 --- /dev/null +++ b/scripts/config.js @@ -0,0 +1,209 @@ +// herbruikbare waarden +let BASIC_AUTH_USER = process.env.BASIC_AUTH_USER || 'openstad'; +let BASIC_AUTH_PASSWORD = process.env.BASIC_AUTH_PASSWORD || 'openstad'; + +let COOKIE_SECURE_OFF = process.env.FORCE_HTTP ? 'yes' : ''; + +let API_DOMAIN = process.env.API_DOMAIN || 'openstad-api.' + process.env.BASE_DOMAIN; +let API_URL = process.env.API_URL || 'http://' + API_DOMAIN; +let API_PORT = process.env.API_PORT || '31402'; +let API_FIXED_AUTH_KEY = process.env.API_FIXED_AUTH_KEY || generateRandomToken({ length: 2048 }); +let API_FIXED_AUTH_TOKENS = process.env.API_FIXED_AUTH_TOKENS || [ { "token": API_FIXED_AUTH_KEY, "userId": "2" } ]; + +let OAUTH_DOMAIN = process.env.OAUTH_DOMAIN || 'openstad-oauth.' + process.env.BASE_DOMAIN; +let OAUTH_URL = process.env.OAUTH_URL || 'http://' + OAUTH_DOMAIN; +let OAUTH_PORT = process.env.OAUTH_PORT || '31403'; +let OAUTH_JWT_SECRET = generateRandomToken({ length: 64 }); +let OAUTH_FIRST_CLIENT_ID = process.env.OAUTH_FIRST_CLIENT_ID || 'default-client'; +let OAUTH_FIRST_CLIENT_SECRET = process.env.OAUTH_FIRST_CLIENT_SECRET || generateRandomToken({ length: 64 }); +let OAUTH_ADMIN_CLIENT_ID = process.env.OAUTH_ADMIN_CLIENT_ID || 'admin-client'; +let OAUTH_ADMIN_CLIENT_SECRET = process.env.OAUTH_ADMIN_CLIENT_SECRET || generateRandomToken({ length: 64 }); + +let IMAGE_DOMAIN = process.env.IMAGE_DOMAIN || 'openstad-image.' + process.env.BASE_DOMAIN; +let IMAGE_APP_URL = process.env.IMAGE_APP_URL || 'http://' + IMAGE_DOMAIN; +let IMAGE_PORT_API = process.env.IMAGE_PORT_API || 31405; +let IMAGE_PORT_IMAGE_SERVER = process.env.IMAGE_PORT_IMAGE_SERVER || 31406; +let IMAGE_CLIENT_TOKEN = process.env.IMAGE_CLIENT_TOKEN || generateRandomToken({ length: 255 }); + +let DEFAULT_HOST = 'openstad-cms.' + process.env.BASE_DOMAIN; +let FRONTEND_DOMAIN = process.env.FRONTEND_DOMAIN || 'openstad-cms.' + process.env.BASE_DOMAIN; +let FRONTEND_APP_URL = process.env.FRONTEND_APP_URL || 'http://' + FRONTEND_DOMAIN; +let FRONTEND_PORT = process.env.FRONTEND_PORT || '31401'; +let FRONTEND_PORT2 = process.env.FRONTEND_PORT2 || '31407'; + +let ADMIN_DOMAIN = process.env.ADMIN_DOMAIN || 'openstad-admin.' + process.env.BASE_DOMAIN; +let ADMIN_APP_URL = process.env.ADMIN_APP_URL || 'http://' + ADMIN_DOMAIN; +let ADMIN_PORT = process.env.ADMIN_PORT || '31404'; + +// export config +module.exports = { + + // API + API_DB_HOST: process.env.API_DB_HOST || process.env.DB_HOST, + API_DB_USERNAME: process.env.API_DB_USERNAME || process.env.DB_USERNAME, + API_DB_PASSWORD: process.env.API_DB_PASSWORD || process.env.DB_PASSWORD, + API_DB_NAME: process.env.API_DB_NAME || ( process.env.DB_BASE_NAME ? process.env.DB_BASE_NAME + '-api' : 'openstad-api' ), + API_DB_DIALECT: process.env.API_DB_DIALECT || process.env.DB_DIALECT || 'mariadb', + + API_URL: API_URL, + API_DOMAIN: API_DOMAIN, + API_PORT: API_PORT, + + API_FROM_EMAIL_ADDRESS: process.env.API_FROM_EMAIL_ADDRESS || process.env.FROM_EMAIL_ADDRESS, + API_SMTP_PORT: process.env.API_SMTP_PORT || process.env.SMTP_PORT, + API_SMTP_HOST: process.env.API_SMTP_HOST || process.env.SMTP_HOST, + API_SMTP_USERNAME: process.env.API_SMTP_USERNAME || process.env.SMTP_USERNAME, + API_SMTP_PASSWORD: process.env.API_SMTP_PASSWORD || process.env.SMTP_PASSWORD, + + API_COOKIE_SECRET: process.env.API_COOKIE_SECRET || generateRandomToken({ length: 32 }), + API_COOKIE_ONLY_SECURE: process.env.API_COOKIE_ONLY_SECURE || process.env.API_COOKIE_ONLY_SECURE != 'false' ? true : false, + + API_OAUTH_URL: process.env.API_OAUTH_URL || OAUTH_URL, + API_OAUTH_JWT_SECRET: process.env.API_OAUTH_JWT_SECRET || OAUTH_JWT_SECRET, + API_OAUTH_DEFAULT_CLIENT_ID: process.env.API_OAUTH_DEFAULT_CLIENT_ID || OAUTH_FIRST_CLIENT_ID, + API_OAUTH_CLIENT_PASSWORD: process.env.API_OAUTH_CLIENT_PASSWORD || OAUTH_FIRST_CLIENT_SECRET, + API_FIXED_AUTH_TOKENS: API_FIXED_AUTH_TOKENS, + + // oauth server + OAUTH_DOMAIN: OAUTH_DOMAIN, + OAUTH_DB_HOST: process.env.OAUTH_DB_HOST || process.env.DB_HOST, + OAUTH_DB_USERNAME: process.env.OAUTH_DB_USERNAME || process.env.DB_USERNAME, + OAUTH_DB_PASSWORD: process.env.OAUTH_DB_PASSWORD || process.env.DB_PASSWORD, + OAUTH_DB_NAME: process.env.OAUTH_DB_NAME || ( process.env.DB_BASE_NAME ? process.env.DB_BASE_NAME + '-oauth-server' : 'openstad-oauth-server' ), + + OAUTH_MONGO_HOST: process.env.OAUTH_MONGO_HOST || process.env.MONGO_HOST || 'localhost', + OAUTH_MONGO_PORT: process.env.OAUTH_MONGO_PORT || process.env.MONGO_PORT || 27017, + OAUTH_MONGO_USER: process.env.OAUTH_MONGO_USER || process.env.MONGO_USER || '', + OAUTH_MONGO_PASSWORD: process.env.OAUTH_MONGO_PASSWORD || process.env.MONGO_PASSWORD || '', + + OAUTH_APP_URL: process.env.OAUTH_APP_URL || OAUTH_URL, + OAUTH_PORT: OAUTH_PORT, + + OAUTH_ADMIN_REDIRECT_URL: process.env.OAUTH_ADMIN_REDIRECT_URL || '/admin/clients', + OAUTH_ADMIN_CLIENT_ID: process.env.OAUTH_ADMIN_CLIENT_ID || 2, + + OAUTH_EMAIL_ASSETS_URL: process.env.OAUTH_APP_URL || OAUTH_URL, + + OAUTH_MAIL_SERVER_URL: process.env.OAUTH_MAIL_SERVER_URL || process.env.SMTP_HOST, + OAUTH_MAIL_SERVER_PORT: process.env.OAUTH_MAIL_SERVER_PORT || process.env.SMTP_PORT, + OAUTH_MAIL_SERVER_SECURE: true, + OAUTH_MAIL_SERVER_PASSWORD: process.env.OAUTH_MAIL_SERVER_PASSWORD || process.env.SMTP_PASSWORD, + OAUTH_MAIL_SERVER_USER_NAME: process.env.OAUTH_MAIL_SERVER_USER_NAME || process.env.SMTP_USERNAME, + OAUTH_FROM_NAME: process.env.OAUTH_FROM_NAME || '', + OAUTH_FROM_EMAIL: process.env.OAUTH_FROM_EMAIL || process.env.FROM_EMAIL_ADDRESS, + + OAUTH_SESSION_SECRET: process.env.OAUTH_SESSION_SECRET || generateRandomToken({ length: 32 }), + // TODO: dev vs prod + OAUTH_COOKIE_SECURE_OFF: typeof process.env.OAUTH_COOKIE_SECURE_OFF != 'undefined' ? process.env.OAUTH_COOKIE_SECURE_OFF : COOKIE_SECURE_OFF, + + OAUTH_LOGIN_CSM_BASIC_AUTH_USER: process.env.OAUTH_LOGIN_CSM_BASIC_AUTH_USER || BASIC_AUTH_USER, + OAUTH_LOGIN_CSM_BASIC_AUTH_PASSWORD: process.env.OAUTH_LOGIN_CSM_BASIC_AUTH_PASSWORD || BASIC_AUTH_PASSWORD, + + OAUTH_FIRST_CLIENT_ID: OAUTH_FIRST_CLIENT_ID, + OAUTH_FIRST_CLIENT_SECRET: OAUTH_FIRST_CLIENT_SECRET, + OAUTH_ADMIN_CLIENT_ID: OAUTH_ADMIN_CLIENT_ID, + OAUTH_ADMIN_CLIENT_SECRET: OAUTH_ADMIN_CLIENT_SECRET, + + // KPN_CLIENT_ID= + // KPN_CLIENT_SECRET= + + // image server + IMAGE_DB_HOST: process.env.IMAGE_DB_HOST || process.env.DB_HOST, + IMAGE_DB_USERNAME: process.env.IMAGE_DB_USERNAME || process.env.DB_USERNAME, + IMAGE_DB_PASSWORD: process.env.IMAGE_DB_PASSWORD || process.env.DB_PASSWORD, + IMAGE_DB_NAME: process.env.IMAGE_DB_NAME || ( process.env.DB_BASE_NAME ? process.env.DB_BASE_NAME + '-image-server' : 'openstad-image-server' ), + + IMAGE_DOMAIN: IMAGE_DOMAIN, + IMAGE_APP_URL: IMAGE_APP_URL, + + IMAGE_PORT_API: IMAGE_PORT_API, + IMAGE_PORT_IMAGE_SERVER: IMAGE_PORT_IMAGE_SERVER, + + IMAGE_IMAGES_DIR: process.env.IMAGE_IMAGES_DIR || '', + IMAGE_THROTTLE: process.env.IMAGE_THROTTLE || true, + IMAGE_THROTTLE_CC_PROCESSORS: process.env.IMAGE_THROTTLE_CC_PROCESSORS || 4, + IMAGE_THROTTLE_CC_PREFETCHER: process.env.IMAGE_THROTTLE_CC_PREFETCHER || 20, + IMAGE_THROTTLE_CC_REQUESTS: process.env.IMAGE_THROTTLE_CC_REQUESTS || 100, + + IMAGE_CLIENT_NAME: process.env.IMAGE_CLIENT_NAME || 'default-client', + IMAGE_CLIENT_TOKEN: IMAGE_CLIENT_TOKEN, + IMAGE_CLIENT_DISPLAY_NAME: process.env.IMAGE_CLIENT_DISPLAY_NAME || 'Default image server client', + + // frontend + FRONTEND_LOGIN_CSM_BASIC_AUTH_USER: process.env.FRONTEND_LOGIN_CSM_BASIC_AUTH_USER || BASIC_AUTH_USER, + FRONTEND_LOGIN_CSM_BASIC_AUTH_PASSWORD: process.env.FRONTEND_LOGIN_CSM_BASIC_AUTH_PASSWORD || BASIC_AUTH_PASSWORD, + FRONTEND_SAMPLE_DB: process.env.FRONTEND_SAMPLE_DB || 'sampledb', + FRONTEND_MONGO_DB_HOST: process.env.FRONTEND_MONGO_DB_HOST || process.env.MONGO_HOST || 'localhost', + FRONTEND_MONGO_DB_PORT: process.env.FRONTEND_MONGO_DB_PORT || process.env.MONGO_PORT || 27017, + FRONTEND_MONGO_DB_USER: process.env.FRONTEND_MONGO_DB_USER || process.env.MONGO_USER || '', + FRONTEND_MONGO_DB_PASSWORD: process.env.FRONTEND_MONGO_DB_PASSWORD || process.env.MONGO_PASSWORD || '', + FRONTEND_PORT: FRONTEND_PORT, + FRONTEND_PORT2: FRONTEND_PORT2, + FRONTEND_NODE_ENV: process.env.FRONTEND_NODE_ENV || 'development', + FRONTEND_DEFAULT_HOST: process.env.FRONTEND_DEFAULT_HOST || DEFAULT_HOST, + FRONTEND_GOOGLE_MAPS_API_KEY: process.env.FRONTEND_GOOGLE_MAPS_API_KEY || undefined, + FRONTEND_DEFAULT_DB: process.env.FRONTEND_DEFAULT_DB || 'localhost', + FRONTEND_DOMAIN: FRONTEND_DOMAIN, + FRONTEND_APP_URL: FRONTEND_APP_URL, + FRONTEND_API: process.env.FRONTEND_API || API_URL, + FRONTEND_API_LOGOUT_URL: process.env.FRONTEND_API_LOGOUT_URL || OAUTH_URL + '/logout?clientId=' + OAUTH_FIRST_CLIENT_ID, + FRONTEND_IMAGE_API_URL: process.env.FRONTEND_IMAGE_API_URL || IMAGE_APP_URL, + FRONTEND_IMAGE_API_ACCESS_TOKEN: process.env.FRONTEND_IMAGE_API_ACCESS_TOKEN || IMAGE_CLIENT_TOKEN, + FRONTEND_SESSION_SECRET: process.env.FRONTEND_SESSION_SECRET || generateRandomToken({ length: 32 }), + FRONTEND_MINIFY_JS: process.env.FRONTEND_MINIFY_JS || 'OFF', + FRONTEND_APOS_WORKFLOW: process.env.FRONTEND_APOS_WORKFLOW || 'ON', + FRONTEND_SITE_API_KEY: process.env.FRONTEND_SITE_API_KEY || API_FIXED_AUTH_KEY, + FRONTEND_INTERNAL_API_URL: process.env.FRONTEND_INTERNAL_API_URL || "http://localhost:" + API_PORT, + FRONTEND_MAP_TYPE: process.env.FRONTEND_MAP_TYPE || 'googlemaps', + FRONTEND_MAP_TYPE: process.env.FRONTEND_MAP_TYPE || 'googlemaps', + FRONTEND_COOKIE_SECURE_OFF: typeof process.env.ADMIN_COOKIE_SECURE_OFF != 'undefined' ? process.env.ADMIN_COOKIE_SECURE_OFF : COOKIE_SECURE_OFF, + + + + // admin + ADMIN_DOMAIN: ADMIN_DOMAIN, + ADMIN_APP_URL: ADMIN_APP_URL, + ADMIN_PORT: ADMIN_PORT, + ADMIN_PRODUCTION_SERVER_IP: process.env.ADMIN_PRODUCTION_SERVER_IP || process.env.SERVER_IP, + ADMIN_WILDCARD_HOST: process.env.ADMIN_WILDCARD_HOST || DEFAULT_HOST, + ADMIN_API_URL: process.env.ADMIN_API_URL || API_URL, + ADMIN_USER_API: process.env.ADMIN_USER_API || OAUTH_URL, + ADMIN_USER_API_CLIENT_ID: process.env.ADMIN_USER_API_CLIENT_ID || OAUTH_ADMIN_CLIENT_ID, + ADMIN_USER_API_CLIENT_SECRET: process.env.ADMIN_USER_API_CLIENT_SECRET || OAUTH_ADMIN_CLIENT_SECRET, + // TODO: dev vs prod + ADMIN_COOKIE_SECURE_OFF: typeof process.env.ADMIN_COOKIE_SECURE_OFF != 'undefined' ? process.env.ADMIN_COOKIE_SECURE_OFF : COOKIE_SECURE_OFF, + ADMIN_SESSION_SECRET: process.env.ADMIN_SESSION_SECRET || generateRandomToken({ length: 32 }), + ADMIN_SITE_ID: process.env.ADMIN_SITE_ID || 1, + ADMIN_SITE_API_KEY: process.env.ADMIN_SITE_API_KEY || API_FIXED_AUTH_KEY, + ADMIN_BASIC_AUTH_USER: process.env.ADMIN_BASIC_AUTH_USER || BASIC_AUTH_USER, + ADMIN_BASIC_AUTH_PASSWORD: process.env.ADMIN_BASIC_AUTH_PASSWORD || BASIC_AUTH_PASSWORD, + ADMIN_EXTERNAL_SITE_REPO: process.env.ADMIN_EXTERNAL_SITE_REPO || API_URL + '/api/template/site', + ADMIN_MONGO_DB_HOST: process.env.ADMIN_MONGO_DB_HOST || process.env.MONGO_HOST || 'localhost', + ADMIN_MONGO_DB_PORT: process.env.ADMIN_MONGO_DB_PORT || process.env.MONGO_PORT || 27017, + ADMIN_MONGO_USER: process.env.ADMIN_MONGO_USER || process.env.MONGO_USER || '', + ADMIN_MONGO_PASSWORD: process.env.ADMIN_MONGO_PASSWORD || process.env.MONGO_PASSWORD || '', + ADMIN_FRONTEND_URL: FRONTEND_APP_URL, + ADMIN_PUBLIC_IP: process.env.ADMIN_PUBLIC_IP || process.env.SERVER_IP, + ADMIN_IMAGE_API_URL: process.env.ADMIN_IMAGE_API_URL || IMAGE_APP_URL, + ADMIN_IMAGE_API_ACCESS_TOKEN: process.env.ADMIN_IMAGE_API_ACCESS_TOKEN || IMAGE_CLIENT_TOKEN, + ADMIN_FORCE_HTTP: process.env.FORCE_HTTP ? 'true' : '', + +} + +function generateRandomToken(params) { + + var token = ''; + + params.chars = params.chars || 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + params.length = params.length || 25; + + for (let i = 0; i < params.length; i++) { + const rnd = Math.floor(params.chars.length * Math.random()); + const chr = params.chars.substring(rnd, rnd + 1); + token = token + chr; + } + + return token; + +} + diff --git a/scripts/create-nginx-config-example.js b/scripts/create-nginx-config-example.js new file mode 100644 index 0000000..b48abdc --- /dev/null +++ b/scripts/create-nginx-config-example.js @@ -0,0 +1,100 @@ +const fs = require('fs'); + +module.exports = async function createNginxConfigExample(config) { + + let nginxConfigExample = `# ---------------------------------------------------------------------------------------------------- +# API + +server { + listen 80; + server_name ${config.API_DOMAIN}; + + client_max_body_size 20M; + + location / { + proxy_redirect off; + proxy_set_header Host $host; + proxy_pass http://localhost:${config.API_PORT}; + } + +} + +# ---------------------------------------------------------------------------------------------------- +# oauth + +server { + listen 80; + server_name ${config.OAUTH_DOMAIN}; + + client_max_body_size 20M; + + location / { + proxy_redirect off; + proxy_set_header Host $host; + proxy_pass http://localhost:${config.OAUTH_PORT}; + } + +} + +# ---------------------------------------------------------------------------------------------------- +# image server + +server { + listen 80; + server_name ${config.IMAGE_DOMAIN}; + + client_max_body_size 20M; + + location / { + proxy_redirect off; + proxy_set_header Host $host; + proxy_pass http://localhost:${config.IMAGE_PORT_API}; + } + +} + +# ---------------------------------------------------------------------------------------------------- +# frontend + +server { + listen 80; + server_name ${config.FRONTEND_DOMAIN} *.${config.FRONTEND_DOMAIN}; + + client_max_body_size 20M; + + location / { + proxy_redirect off; + proxy_set_header Host $host; + proxy_pass http://localhost:${config.FRONTEND_PORT}; + } + +} + +# ---------------------------------------------------------------------------------------------------- +# admin + +server { + listen 80; + server_name ${config.ADMIN_DOMAIN}; + + client_max_body_size 20M; + + location / { + proxy_redirect off; + proxy_set_header Host $host; + proxy_pass http://localhost:${config.ADMIN_PORT}; + } + +} +`; + + try { + console.log('=============================='); + console.log('Create nginx config example file'); + await fs.writeFileSync('./nginx.config.example', nginxConfigExample ); + } catch (err) { + console.log(err); + } + +} + diff --git a/scripts/execute.js b/scripts/execute.js new file mode 100755 index 0000000..316a3cb --- /dev/null +++ b/scripts/execute.js @@ -0,0 +1,28 @@ +const { spawn } = require('child_process'); + +module.exports = function execute(command, args, options) { + + return new Promise((resolve, reject) => { + + const child = spawn(command, args, options); + + child.on('error', function(err) { + console.log('XXX'); + reject(err) + }); + + child.stdout.on('data', (chunk) => { + console.log(`${chunk}`); + }); + + child.stderr.on('data', (chunk) => { + console.log(`${chunk}`); + }); + + child.on('close', (code) => { + resolve(); + }); + + }); + +} diff --git a/scripts/setup-admin.js b/scripts/setup-admin.js new file mode 100755 index 0000000..0d49c05 --- /dev/null +++ b/scripts/setup-admin.js @@ -0,0 +1,63 @@ +const fs = require('fs').promises; +const util = require('util'); +const execute = require('./execute'); + +module.exports = async function setupAdmin(config) { + + console.log('=============================='); + console.log('Setup admin'); + + try { + + let frontendConfig = `APP_URL=${config.ADMIN_APP_URL} +PORT=${config.ADMIN_PORT} +PUBLIC_IP=${config.ADMIN_PUBLIC_IP} +PRODUCTION_SERVER_IP=${config.ADMIN_PRODUCTION_SERVER_IP} + +WILDCARD_HOST=${config.ADMIN_WILDCARD_HOST} + +SITE_ID=${config.ADMIN_SITE_ID} +SITE_API_KEY=${config.ADMIN_SITE_API_KEY} +API_URL=${config.ADMIN_API_URL} + +USER_API=${config.ADMIN_USER_API} +USER_API_CLIENT_ID=${config.ADMIN_USER_API_CLIENT_ID} +USER_API_CLIENT_SECRET=${config.ADMIN_USER_API_CLIENT_SECRET} + +MONGO_DB_HOST=${config.ADMIN_MONGO_DB_HOST} +MONGO_DB_PORT=${config.ADMIN_MONGO_DB_PORT} +${config.ADMIN_MONGO_DB_USER && 'MONGO_DB_USER='+config.ADMIN_MONGO_DB_USER || ''} +${config.ADMIN_MONGO_DB_PASSWORD && 'MONGO_DB_PASSWORD='+config.ADMIN_MONGO_DB_PASSWORD || ''} + +FRONTEND_URL=${config.ADMIN_FRONTEND_URL} + +IMAGE_API_URL=${config.ADMIN_IMAGE_API_URL} +IMAGE_API_ACCESS_TOKEN=${config.ADMIN_IMAGE_API_ACCESS_TOKEN} + +EXTERNAL_SITE_REPO=${config.ADMIN_EXTERNAL_SITE_REPO} + +BASIC_AUTH_USER=${config.ADMIN_BASIC_AUTH_USER} +BASIC_AUTH_PASSWORD=${config.ADMIN_BASIC_AUTH_PASSWORD} +COOKIE_SECURE_OFF=${config.ADMIN_COOKIE_SECURE_OFF} +SESSION_SECRET=${config.ADMIN_SESSION_SECRET} + +FORCE_HTTP=${config.ADMIN_FORCE_HTTP} +`; + + console.log('------------------------------'); + console.log('Create config file'); + await fs.writeFile('./openstad-management-panel/.env', frontendConfig) + + // npm i + console.log('Execute `npm i`'); + await execute('npm', ['i'], { cwd: './openstad-management-panel' }); + + } catch(err) { + console.log('Admin initialisatie error'); + console.log(err); + process.exit(); + } + + +} + diff --git a/scripts/setup-all.js b/scripts/setup-all.js new file mode 100755 index 0000000..895f0f5 --- /dev/null +++ b/scripts/setup-all.js @@ -0,0 +1,35 @@ +require('dotenv').config(); +const config = require('./config'); +const initApi = require('./setup-api'); +const initImageServer = require('./setup-image-server'); +const initOauthServer = require('./setup-oauth-server'); +const initFrontend = require('./setup-frontend'); +const initAdmin = require('./setup-admin'); +const createNginxConfigExample = require('./create-nginx-config-example'); + +let modules = [ + initApi, + initImageServer, + initOauthServer, + initFrontend, + initAdmin, + createNginxConfigExample, + function() { + return new Promise((resolve, reject) => { + console.log('=============================='); + console.log('Done'); + process.exit(); + resolve(); + }) + } +]; + +async function init() { + + for (let i = 0; i < modules.length; i++) { + await modules[i](config); + } +} + +init(); + diff --git a/scripts/setup-api.js b/scripts/setup-api.js new file mode 100755 index 0000000..b64c228 --- /dev/null +++ b/scripts/setup-api.js @@ -0,0 +1,117 @@ +const fs = require('fs'); +const util = require('util'); +const apiDb = require('promise-mysql'); +const execute = require('./execute'); + +module.exports = async function setupApi(config) { + + console.log('=============================='); + console.log('Setup API'); + + try { + + let connection = await apiDb.createConnection({ + host : config.API_DB_HOST, + user : config.API_DB_USERNAME, + password : config.API_DB_PASSWORD, + database : config.API_DB_NAME, + dialect : config.API_DB_DIALECT, + }); + + // check database + let doCreateDBTables = false; + let rows = await connection.query('SHOW TABLES;') + if (!(rows && rows.length)) { + doCreateDBTables = true; + } + + // create local config + let apiConfig = { + + "url": config.API_URL, + "hostname": config.API_DOMAIN, + + "database": { + host : config.API_DB_HOST, + user : config.API_DB_USERNAME, + password : config.API_DB_PASSWORD, + database : config.API_DB_NAME, + dialect : config.API_DB_DIALECT, + "multipleStatements": true + }, + + "express": { + "port": config.API_PORT, + }, + + "mail": { + "from": config.API_FROM_EMAIL_ADDRESS, + "transport": { + "smtp": { + "port": config.API_SMTP_PORT, + "host": config.API_SMTP_HOST, + "auth": { + "user": config.API_SMTP_USERNAME, + "pass": config.API_SMTP_PASSWORD, + } + } + } + }, + + "security": { + "sessions": { + "secret": config.API_COOKIE_SECRET, + "onlySecure": config.API_API_COOKIE_ONLY_SECURE, + } + }, + + "authorization": { + "jwt-secret": config.API_OAUTH_JWT_SECRET, + "auth-server-url": config.API_OAUTH_URL, + "auth-client-id": config.API_OAUTH_DEFAULT_CLIENT_ID, + "auth-client-secret": config.API_OAUTH_CLIENT_PASSWORD, + "auth-server-login-path": "/dialog/authorize?redirect_uri=[[redirectUrl]]&response_type=code&client_id=[[clientId]]&scope=offline", + "auth-server-exchange-code-path": "/oauth/token", + "auth-server-get-user-path": "/api/userinfo?client_id=[[clientId]]", + "auth-server-logout-path": "/logout?clientId=[[clientId]]", + "after-login-redirect-uri": "/?jwt=[[jwt]]", + "fixed-auth-tokens": config.API_FIXED_AUTH_TOKENS + } + } + + console.log('------------------------------'); + console.log('Create config file'); + await fs.writeFileSync('./openstad-api/config/local.js', 'module.exports = ' + JSON.stringify(apiConfig, null, 2) ); + + // npm i + console.log('------------------------------'); + console.log('Execute `npm i`'); + await execute('npm', ['i'], { cwd: './openstad-api' }); + + // init db + if (doCreateDBTables) { + console.log('------------------------------'); + console.log('Init API database'); + await execute('node', ['reset.js'], { cwd: './openstad-api' }); + } else { + console.log('------------------------------'); + console.log('API database already initialized'); + } + + console.log('Now update database records'); + await connection.query('UPDATE sites SET config = JSON_SET(config, "$.allowedDomains", JSON_ARRAY(?, ?)) WHERE id = 1;', [config.API_DOMAIN, config.ADMIN_DOMAIN]); + await connection.query('UPDATE sites SET config = JSON_SET(config, "$.oauth.default", JSON_OBJECT("auth-client-id", ?, "auth-client-secret", ?)) WHERE id = 1;', [config.OAUTH_ADMIN_CLIENT_ID, config.OAUTH_ADMIN_CLIENT_SECRET]); + + + } catch(err) { + console.log('------------------------------'); + console.log('API initialisatie error'); + console.log(err); + process.exit(); + } + +} + + + + diff --git a/scripts/setup-frontend.js b/scripts/setup-frontend.js new file mode 100755 index 0000000..564ee29 --- /dev/null +++ b/scripts/setup-frontend.js @@ -0,0 +1,55 @@ +const fs = require('fs').promises; +const util = require('util'); +const execute = require('./execute'); + +module.exports = async function setupFrontend(config) { + + console.log('=============================='); + console.log('Setup frontend'); + + try { + + let frontendConfig = `LOGIN_CSM_BASIC_AUTH_USER=${config.FRONTEND_LOGIN_CSM_BASIC_AUTH_USER} +LOGIN_CSM_BASIC_AUTH_PASSWORD=${config.FRONTEND_LOGIN_CSM_BASIC_AUTH_PASSWORD} +SAMPLE_DB=${config.FRONTEND_SAMPLE_DB} +DB_HOST=${config.FRONTEND_DB_HOST} +MONGO_DB_HOST=${config.FRONTEND_MONGO_DB_HOST} +MONGO_DB_PORT=${config.FRONTEND_MONGO_DB_PORT} +${config.ADMIN_MONGO_DB_USER && 'MONGO_DB_USER='+config.ADMIN_MONGO_DB_USER || ''} +${config.ADMIN_MONGO_DB_PASSWORD && 'MONGO_DB_PASSWORD='+config.ADMIN_MONGO_DB_PASSWORD || ''} +PORT=${config.FRONTEND_PORT} +PORT2=${config.FRONTEND_PORT2} +NODE_ENV=${config.FRONTEND_NODE_ENV} +DEFAULT_HOST=${config.FRONTEND_DEFAULT_HOST} +GOOGLE_MAPS_API_KEY=${config.FRONTEND_GOOGLE_MAPS_API_KEY} +DEFAULT_DB=${config.FRONTEND_DEFAULT_DB} +APP_URL=${config.FRONTEND_APP_URL} +API=${config.FRONTEND_API} +API_LOGOUT_URL=${config.FRONTEND_API_LOGOUT_URL} +IMAGE_API_URL=${config.FRONTEND_IMAGE_API_URL} +IMAGE_API_ACCESS_TOKEN=${config.FRONTEND_IMAGE_API_ACCESS_TOKEN} +SESSION_SECRET=${config.FRONTEND_SESSION_SECRET} +MINIFY_JS=${config.FRONTEND_MINIFY_JS} +APOS_WORKFLOW=${config.FRONTEND_APOS_WORKFLOW} +SITE_API_KEY=${config.FRONTEND_SITE_API_KEY} +INTERNAL_API_URL=${config.FRONTEND_INTERNAL_API_URL} +MAP_TYPE=${config.FRONTEND_MAP_TYPE} +COOKIE_SECURE_OFF=${config.FRONTEND_COOKIE_SECURE_OFF} +`; + + console.log('------------------------------'); + console.log('Create config file'); + await fs.writeFile('./openstad-frontend/.env', frontendConfig) + + // npm i + console.log('Execute `npm i`'); + await execute('npm', ['i'], { cwd: './openstad-frontend' }); + + } catch(err) { + console.log('Frontend initialisatie error'); + console.log(err); + process.exit(); + } + +} + diff --git a/scripts/setup-image-server.js b/scripts/setup-image-server.js new file mode 100755 index 0000000..db4608e --- /dev/null +++ b/scripts/setup-image-server.js @@ -0,0 +1,80 @@ +const fs = require('fs'); +const util = require('util'); +const imgDb = require('promise-mysql'); +const execute = require('./execute'); + +module.exports = async function setupImageServer(config) { + + console.log('=============================='); + console.log('Setup image server'); + + try { + + let connection = await imgDb.createConnection({ + host : config.IMAGE_DB_HOST, + user : config.IMAGE_DB_USERNAME, + password : config.IMAGE_DB_PASSWORD, + database : config.IMAGE_DB_NAME, + }); + + // check database + let doCreateDBTables = false; + let rows = await connection.query('SHOW TABLES;') + if (!(rows && rows.length)) { + doCreateDBTables = true; + } + + // create local config + let imgConfig = ` +DB_HOST=${config.IMAGE_DB_HOST} +DB_USER=${config.IMAGE_DB_USERNAME} +DB_PASSWORD=${config.IMAGE_DB_PASSWORD} +DB_NAME=${config.IMAGE_DB_NAME} + +APP_URL=${config.IMAGE_APP_URL} +PORT_API=${config.IMAGE_PORT_API} +PORT_IMAGE_SERVER=${config.IMAGE_PORT_IMAGE_SERVER} + +IMAGES_DIR=${config.IMAGE_IMAGES_DIR} +THROTTLE=${config.IMAGE_THROTTLE} +THROTTLE_CC_PROCESSORS=${config.IMAGE_THROTTLE_CC_PROCESSORS} +THROTTLE_CC_PREFETCHER=${config.IMAGE_THROTTLE_CC_PREFETCHER} +THROTTLE_CC_REQUESTS=${config.IMAGE_THROTTLE_CC_REQUESTS} +` + console.log('------------------------------'); + console.log('Create config file'); + await fs.writeFileSync('./openstad-image-server/.env', imgConfig); + + // npm i + console.log('------------------------------'); + console.log('Execute `npm i`'); + await execute('npm', ['i'], { cwd: './openstad-image-server' }); + + // init db + if (doCreateDBTables) { + console.log('------------------------------'); + console.log('Create database tables'); + await execute('../node_modules/knex/bin/cli.js', ['migrate:latest'], { cwd: './openstad-image-server' }); + } else { + console.log('------------------------------'); + console.log('Database tables already exist'); + } + + // create client + rows = await connection.query('SELECT * FROM clients;') + if (rows && rows.length) { + console.log('Now update existing client'); + await connection.query('UPDATE clients SET clientName = ?, token = ?, displayName = ? WHERE id = ?', [config.IMAGE_CLIENT_NAME, config.IMAGE_CLIENT_TOKEN, config.IMAGE_CLIENT_DISPLAY_NAME, 1 ]); + } else { + console.log('Create a client'); + await connection.query('INSERT INTO clients VALUES( ?, ?, ?, ?, NOW(), NOW() );', [1, config.IMAGE_CLIENT_NAME, config.IMAGE_CLIENT_TOKEN, config.IMAGE_CLIENT_DISPLAY_NAME]) + } + + } catch(err) { + console.log('------------------------------'); + console.log('Image server initialisatie error'); + console.log(err); + process.exit(); + } +} + diff --git a/scripts/setup-oauth-server.js b/scripts/setup-oauth-server.js new file mode 100755 index 0000000..f58ebb9 --- /dev/null +++ b/scripts/setup-oauth-server.js @@ -0,0 +1,116 @@ +const fs = require('fs').promises; +const util = require('util'); +const oauthDb = require('promise-mysql'); +const execute = require('./execute'); + +module.exports = async function setupOauthServer(config) { + + console.log('=============================='); + console.log('Setup oauth server'); + + try { + + let connection = await oauthDb.createConnection({ + host : config.OAUTH_DB_HOST, + user : config.OAUTH_DB_USERNAME, + password : config.OAUTH_DB_PASSWORD, + database : config.OAUTH_DB_NAME, + }) + + // check database + let doCreateDBTables = false; + let rows = await connection.query('SHOW TABLES;'); + if (!(rows && rows.length)) { + doCreateDBTables = true; + } + + // create local config + let oauthConfig = ` +DB_HOST=${config.OAUTH_DB_HOST} +DB_USER=${config.OAUTH_DB_USERNAME} +DB_PASSWORD=${config.OAUTH_DB_PASSWORD} +DB_NAME=${config.OAUTH_DB_NAME} + +MONGO_DB_HOST=${config.OAUTH_MONGO_HOST} +MONGO_DB_PORT=${config.OAUTH_MONGO_PORT} +${config.ADMIN_MONGO_DB_USER && 'MONGO_DB_USER='+config.ADMIN_MONGO_DB_USER || ''} +${config.ADMIN_MONGO_DB_PASSWORD && 'MONGO_DB_PASSWORD='+config.ADMIN_MONGO_DB_PASSWORD || ''} + +MAIL_SERVER_URL=${config.OAUTH_MAIL_SERVER_URL} +MAIL_SERVER_PORT=${config.OAUTH_MAIL_SERVER_PORT} +MAIL_SERVER_SECURE=${config.OAUTH_MAIL_SERVER_SECURE} +MAIL_SERVER_PASSWORD=${config.OAUTH_MAIL_SERVER_PASSWORD} +MAIL_SERVER_USER_NAME=${config.OAUTH_MAIL_SERVER_USER_NAME} +FROM_NAME=${config.OAUTH_FROM_NAME} +FROM_EMAIL=${config.OAUTH_FROM_EMAIL} + +ADMIN_REDIRECT_URL=${config.OAUTH_ADMIN_REDIRECT_URL} + +APP_URL=${config.OAUTH_APP_URL} +PORT=${config.OAUTH_PORT} +EMAIL_ASSETS_URL=${config.OAUTH_EMAIL_ASSETS_URL} + +COOKIE_SECURE_OFF=${config.OAUTH_COOKIE_SECURE_OFF} +SESSION_SECRET=${config.OAUTH_SESSION_SECRET} +` + console.log('------------------------------'); + console.log('Create config file'); + await fs.writeFile('./openstad-oauth-server/.env', oauthConfig); + + // npm i + console.log('------------------------------'); + console.log('Execute `npm i`'); + await execute('npm', ['i'], { cwd: './openstad-oauth-server' }); + + // certs + console.log('------------------------------'); + try { + await fs.mkdir('openstad-oauth-server/certs') + console.error('Certs dir created'); + } catch(err) { + if (err.code !== 'EEXIST') { + throw err; + return; + } + console.error('Certs dir exists'); + } + + console.log('Create certificates'); + await execute('/usr/bin/openssl', ['genrsa', '-out', 'privatekey.pem', '2048'], { cwd: './openstad-oauth-server/certs/' }); + await execute('/usr/bin/openssl', ['req', '-new', '-key', 'privatekey.pem', '-out', 'certrequest.csr', '-subj', `/C=NL/ST=NA/L=NA/O=OpenStad/OU=OpenStad/CN=openstad.niels${process.env.BASE_DOMAIN}"`], { cwd: './openstad-oauth-server/certs/' }); + await execute('/usr/bin/openssl', ['x509', '-req', '-in', 'certrequest.csr', '-signkey', 'privatekey.pem', '-out', 'certificate.pem'], { cwd: './openstad-oauth-server/certs/' }); + + // init db + if (doCreateDBTables) { + + console.log('------------------------------'); + console.log('Create database tables'); + await execute('../node_modules/knex/bin/cli.js', ['migrate:latest'], { cwd: './openstad-oauth-server', env: { ...process.env } }); + await execute ('../node_modules/knex/bin/cli.js', ['seed:run'], { cwd: './openstad-oauth-server', env: { ...process.env, AUTH_FIRST_CLIENT_ID: config.OAUTH_FIRST_CLIENT_ID, AUTH_FIRST_CLIENT_SECRET: config.OAUTH_FIRST_CLIENT_SECRET, AUTH_ADMIN_CLIENT_ID: config.OAUTH_ADMIN_CLIENT_ID, AUTH_ADMIN_CLIENT_SECRET: config.OAUTH_ADMIN_CLIENT_SECRET, FRONTEND_URL: config.FRONTEND_APP_URL, ADMIN_URL: config.ADMIN_APP_URL, API_URL: config.API_URL, } } ); + + } else { + + console.log('------------------------------'); + console.log('Database tables already exist - update records'); + + const siteUrl = config.FRONTEND_APP_URL; + const adminUrl = config.ADMIN_APP_URL; + + let allowedDomains = process.env.NODE_ENV === 'development' ? ['localhost'] : []; + allowedDomains.push((config.API_URL || '').replace('http://', '').replace('https://', '').replace(/\/$/, "")); + allowedDomains = JSON.stringify(allowedDomains); + + await connection.query('UPDATE clients SET siteUrl = ?, clientId = ?, clientSecret = ?, allowedDomains = ? WHERE id = 1;', [siteUrl, config.OAUTH_FIRST_CLIENT_ID, config.OAUTH_FIRST_CLIENT_SECRET, allowedDomains]); + await connection.query('UPDATE clients SET siteUrl = ?, clientId = ?, clientSecret = ?, allowedDomains = ? WHERE id = 2;', [adminUrl, config.OAUTH_ADMIN_CLIENT_ID, config.OAUTH_ADMIN_CLIENT_SECRET, allowedDomains]); + + } + + + } catch(err) { + console.log('------------------------------'); + console.log('Oauth server initialisatie error'); + console.log(err); + process.exit(); + } + +} diff --git a/scripts/start-all.js b/scripts/start-all.js new file mode 100755 index 0000000..daf9a6b --- /dev/null +++ b/scripts/start-all.js @@ -0,0 +1,44 @@ +const execute = require('./execute'); + +async function start() { + + console.log('=============================='); + + let command = 'node'; + + try { + console.log('Test for nodemon'); + await execute('nodemon', ['--version'], { cwd: '.' }); + command = 'nodemon' + } catch (err) { + console.log('nodemon not found'); + } + + + try { + + console.log('Start oauth-server'); + execute(command, ['app.js'], { cwd: './openstad-oauth-server' }); + + console.log('Start image-server'); + execute(command, ['server.js'], { cwd: './openstad-image-server' }); + + console.log('Start frontend'); + execute(command, ['index.js'], { cwd: './openstad-frontend' }); + + console.log('Start admin'); + execute(command, ['app.js'], { cwd: './openstad-management-panel' }); + + console.log('Start API'); + execute(command, ['server.js'], { cwd: './openstad-api' }); + + } catch (err) { + console.log('ERROR'); + console.log(err); + process.exit(); + } + +} + +start(); +