1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-18 12:49:43 +02:00

Docker, update readme, update dependencies

This commit is contained in:
Maksim Eltyshev 2019-10-01 04:18:33 +05:00
parent 2398199740
commit adbcb67f03
30 changed files with 1202 additions and 1744 deletions

10
.dockerignore Normal file
View file

@ -0,0 +1,10 @@
*/node_modules
*/.gitignore
*/README.md
**/.DS_Store
**/.gitkeep
server/public/*
server/views/*
client/build

43
Dockerfile Normal file
View file

@ -0,0 +1,43 @@
FROM node:alpine AS server-builder
WORKDIR /app
RUN apk add vips-dev fftw-dev build-base python --no-cache \
--repository https://alpine.global.ssl.fastly.net/alpine/edge/community/ \
--repository https://alpine.global.ssl.fastly.net/alpine/edge/main/
COPY server/package.json server/package-lock.json ./
RUN npm i --prod --silent
FROM node:alpine AS client-builder
WORKDIR /app
COPY client/package.json client/package-lock.json ./
RUN npm i --silent
COPY client .
RUN npm run build
FROM node:alpine
RUN apk add bash vips --no-cache \
--repository https://alpine.global.ssl.fastly.net/alpine/edge/community/
WORKDIR /app
COPY --from=server-builder /app/node_modules node_modules
COPY server .
COPY --from=client-builder /app/build public
COPY --from=client-builder /app/build/index.html views
ENV BASE_URL DATABASE_URL
VOLUME /app/public/uploads
EXPOSE 1337
CMD ["npm", "start"]

View file

@ -2,11 +2,11 @@
A Trello-like application built with React and Redux. A Trello-like application built with React and Redux.
![](https://github.com/meltyshev/planka/blob/master/demo.gif?raw=true) ![](https://raw.githubusercontent.com/meltyshev/planka/master/demo.gif)
[Client demo](https://meltyshev.github.io/planka) (with some restrictions). [**Client demo**](https://meltyshev.github.io/planka) (with some limitations).
### Features ## Features
- Create projects, boards, lists, cards, labels and tasks - Create projects, boards, lists, cards, labels and tasks
- Add card members, track time, set a deadline, write comments - Add card members, track time, set a deadline, write comments
@ -15,40 +15,52 @@ A Trello-like application built with React and Redux.
- User notifications - User notifications
- Internationalization - Internationalization
### Tech stack ## Deploy
- React, Redux, Redux-Saga, Redux-ORM, Semantic UI React, react-beautiful-dnd ### Docker Compose
- Sails.js, Knex.js
- PostgreSQL
### Run in development [![](https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png)](https://hub.docker.com/r/meltyshev/planka)
```bash - Make sure you have Docker and Docker Compose installed and operational.
- Create docker-compose.yml based on the example. This is the ONLY file you will need. You can create this file on your own machine by copy and pasting the content.
- Edit BASE_URL to match your domain name or IP address.
Download the docker-compose.yaml:
```
curl -L https://raw.githubusercontent.com/meltyshev/planka/master/docker-compose.yml -o docker-compose.yml
```
Pull images and start services:
```
docker-compose up -d
```
Demo user: demo@demo.demo demo
## Development
```
git clone https://github.com/meltyshev/planka.git git clone https://github.com/meltyshev/planka.git
``` ```
Server: Server folder:
```bash
cd server
npm install
``` ```
npm install
Create a database and edit DATABASE_URL in .env file. # Create a database and edit DATABASE_URL in .env file
```bash
npm run db:migrate npm run db:migrate
npm run db:seed npm run db:seed
npm run start:dev npm run start:dev
``` ```
Client (second terminal window): Client folder:
```bash
cd client
```
npm install npm install
npm start npm start
@ -56,11 +68,13 @@ npm start
Demo user: demo@demo.demo demo Demo user: demo@demo.demo demo
## Run in production ## Tech stack
In progress.. - React, Redux, Redux-Saga, Redux-ORM, Semantic UI React, react-beautiful-dnd
- Sails.js, Knex.js
- PostgreSQL
## Todo ## Roadmap
In progress.. In progress..

587
client/package-lock.json generated
View file

@ -11,17 +11,17 @@
} }
}, },
"@babel/core": { "@babel/core": {
"version": "7.6.0", "version": "7.5.5",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.0.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz",
"integrity": "sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw==", "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==",
"requires": { "requires": {
"@babel/code-frame": "^7.5.5", "@babel/code-frame": "^7.5.5",
"@babel/generator": "^7.6.0", "@babel/generator": "^7.5.5",
"@babel/helpers": "^7.6.0", "@babel/helpers": "^7.5.5",
"@babel/parser": "^7.6.0", "@babel/parser": "^7.5.5",
"@babel/template": "^7.6.0", "@babel/template": "^7.4.4",
"@babel/traverse": "^7.6.0", "@babel/traverse": "^7.5.5",
"@babel/types": "^7.6.0", "@babel/types": "^7.5.5",
"convert-source-map": "^1.1.0", "convert-source-map": "^1.1.0",
"debug": "^4.1.0", "debug": "^4.1.0",
"json5": "^2.1.0", "json5": "^2.1.0",
@ -971,9 +971,9 @@
"integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA=="
}, },
"@hapi/hoek": { "@hapi/hoek": {
"version": "8.2.4", "version": "8.2.5",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.4.tgz", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.5.tgz",
"integrity": "sha512-Ze5SDNt325yZvNO7s5C4fXDscjJ6dcqLFXJQ/M7dZRQCewuDj2iDUuBi6jLQt+APbW9RjjVEvLr35FXuOEqjow==" "integrity": "sha512-rmGFzok1zR3xZKd5m3ihWdqafXFxvPHoQ/78+AG5URKbEbJiwBBfRgzbu+07W5f3+07JRshw6QqGbVmCp8ntig=="
}, },
"@hapi/joi": { "@hapi/joi": {
"version": "15.1.1", "version": "15.1.1",
@ -1037,6 +1037,20 @@
"rimraf": "^2.5.4", "rimraf": "^2.5.4",
"slash": "^2.0.0", "slash": "^2.0.0",
"strip-ansi": "^5.0.0" "strip-ansi": "^5.0.0"
},
"dependencies": {
"jest-resolve": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
"integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
"requires": {
"@jest/types": "^24.9.0",
"browser-resolve": "^1.11.3",
"chalk": "^2.0.1",
"jest-pnp-resolver": "^1.2.1",
"realpath-native": "^1.1.0"
}
}
} }
}, },
"@jest/environment": { "@jest/environment": {
@ -1088,6 +1102,18 @@
"string-length": "^2.0.0" "string-length": "^2.0.0"
}, },
"dependencies": { "dependencies": {
"jest-resolve": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
"integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
"requires": {
"@jest/types": "^24.9.0",
"browser-resolve": "^1.11.3",
"chalk": "^2.0.1",
"jest-pnp-resolver": "^1.2.1",
"realpath-native": "^1.1.0"
}
},
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@ -1456,9 +1482,9 @@
"integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw=="
}, },
"@types/yargs": { "@types/yargs": {
"version": "13.0.2", "version": "13.0.3",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz",
"integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==",
"requires": { "requires": {
"@types/yargs-parser": "*" "@types/yargs-parser": "*"
} }
@ -1469,47 +1495,52 @@
"integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==" "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg=="
}, },
"@typescript-eslint/eslint-plugin": { "@typescript-eslint/eslint-plugin": {
"version": "2.3.1", "version": "1.13.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.3.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz",
"integrity": "sha512-VqVNEsvemviajlaWm03kVMabc6S3xCHGYuY0fReTrIIOZg+3WzB+wfw6fD3KYKerw5lYxmzogmHOZ0i7YKnuwA==", "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==",
"requires": { "requires": {
"@typescript-eslint/experimental-utils": "2.3.1", "@typescript-eslint/experimental-utils": "1.13.0",
"eslint-utils": "^1.4.2", "eslint-utils": "^1.3.1",
"functional-red-black-tree": "^1.0.1", "functional-red-black-tree": "^1.0.1",
"regexpp": "^2.0.1", "regexpp": "^2.0.1",
"tsutils": "^3.17.1" "tsutils": "^3.7.0"
} }
}, },
"@typescript-eslint/experimental-utils": { "@typescript-eslint/experimental-utils": {
"version": "2.3.1", "version": "1.13.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.3.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz",
"integrity": "sha512-FaZEj73o4h6Wd0Lg+R4pZiJGdR0ZYbJr+O2+RbQ1aZjX8bZcfkVDtD+qm74Dv77rfSKkDKE64UTziLBo9UYHQA==", "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==",
"requires": { "requires": {
"@types/json-schema": "^7.0.3", "@types/json-schema": "^7.0.3",
"@typescript-eslint/typescript-estree": "2.3.1", "@typescript-eslint/typescript-estree": "1.13.0",
"eslint-scope": "^5.0.0" "eslint-scope": "^4.0.0"
} }
}, },
"@typescript-eslint/parser": { "@typescript-eslint/parser": {
"version": "2.3.1", "version": "1.13.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.3.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz",
"integrity": "sha512-ZlWdzhCJ2iZnSp/VBAJ/sowFbyHycIux8t0UEH0JsKgQvfSf7949hLYFMwTXdCMeEnpP1zRTHimrR+YHzs8LIw==", "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==",
"requires": { "requires": {
"@types/eslint-visitor-keys": "^1.0.0", "@types/eslint-visitor-keys": "^1.0.0",
"@typescript-eslint/experimental-utils": "2.3.1", "@typescript-eslint/experimental-utils": "1.13.0",
"@typescript-eslint/typescript-estree": "2.3.1", "@typescript-eslint/typescript-estree": "1.13.0",
"eslint-visitor-keys": "^1.1.0" "eslint-visitor-keys": "^1.0.0"
} }
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "2.3.1", "version": "1.13.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.3.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz",
"integrity": "sha512-9SFhUgFuePJBB6jlLkOPPhMkZNiDCr+S8Ft7yAkkP2c5x5bxPhG3pe/exMiQaF8IGyVMDW6Ul0q4/cZ+uF3uog==", "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==",
"requires": { "requires": {
"glob": "^7.1.4",
"is-glob": "^4.0.1",
"lodash.unescape": "4.0.1", "lodash.unescape": "4.0.1",
"semver": "^6.3.0" "semver": "5.5.0"
},
"dependencies": {
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
"integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
}
} }
}, },
"@webassemblyjs/ast": { "@webassemblyjs/ast": {
@ -1681,9 +1712,9 @@
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
}, },
"abab": { "abab": {
"version": "2.0.1", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz",
"integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==" "integrity": "sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg=="
}, },
"accepts": { "accepts": {
"version": "1.3.7", "version": "1.3.7",
@ -2083,16 +2114,27 @@
} }
}, },
"babel-eslint": { "babel-eslint": {
"version": "10.0.3", "version": "10.0.2",
"resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.2.tgz",
"integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", "integrity": "sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q==",
"requires": { "requires": {
"@babel/code-frame": "^7.0.0", "@babel/code-frame": "^7.0.0",
"@babel/parser": "^7.0.0", "@babel/parser": "^7.0.0",
"@babel/traverse": "^7.0.0", "@babel/traverse": "^7.0.0",
"@babel/types": "^7.0.0", "@babel/types": "^7.0.0",
"eslint-visitor-keys": "^1.0.0", "eslint-scope": "3.7.1",
"resolve": "^1.12.0" "eslint-visitor-keys": "^1.0.0"
},
"dependencies": {
"eslint-scope": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
"integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
"requires": {
"esrecurse": "^4.1.0",
"estraverse": "^4.1.1"
}
}
} }
}, },
"babel-extract-comments": { "babel-extract-comments": {
@ -2228,6 +2270,27 @@
"babel-plugin-transform-react-remove-prop-types": "0.4.24" "babel-plugin-transform-react-remove-prop-types": "0.4.24"
}, },
"dependencies": { "dependencies": {
"@babel/core": {
"version": "7.6.0",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.0.tgz",
"integrity": "sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw==",
"requires": {
"@babel/code-frame": "^7.5.5",
"@babel/generator": "^7.6.0",
"@babel/helpers": "^7.6.0",
"@babel/parser": "^7.6.0",
"@babel/template": "^7.6.0",
"@babel/traverse": "^7.6.0",
"@babel/types": "^7.6.0",
"convert-source-map": "^1.1.0",
"debug": "^4.1.0",
"json5": "^2.1.0",
"lodash": "^4.17.13",
"resolve": "^1.3.2",
"semver": "^5.4.1",
"source-map": "^0.5.0"
}
},
"@babel/plugin-proposal-object-rest-spread": { "@babel/plugin-proposal-object-rest-spread": {
"version": "7.5.5", "version": "7.5.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz",
@ -2302,6 +2365,19 @@
"regenerator-runtime": "^0.13.2" "regenerator-runtime": "^0.13.2"
} }
}, },
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"requires": {
"ms": "^2.1.1"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"semver": { "semver": {
"version": "5.7.1", "version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@ -3351,9 +3427,9 @@
} }
}, },
"chownr": { "chownr": {
"version": "1.1.2", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz",
"integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw=="
}, },
"chrome-trace-event": { "chrome-trace-event": {
"version": "1.0.2", "version": "1.0.2",
@ -3534,9 +3610,9 @@
} }
}, },
"commander": { "commander": {
"version": "2.20.0", "version": "2.20.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz",
"integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg=="
}, },
"common-tags": { "common-tags": {
"version": "1.8.0", "version": "1.8.0",
@ -4155,9 +4231,9 @@
} }
}, },
"date-fns": { "date-fns": {
"version": "2.3.0", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.3.0.tgz", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.4.1.tgz",
"integrity": "sha512-A8o+iXBVqQayl9Z39BHgb7m/zLOfhF7LK82t+n9Fq1adds1vaUn8ByVoADqWLe4OTc6BZYc/FdbdTwufNYqkJw==" "integrity": "sha512-2RhmH/sjDSCYW2F3ZQxOUx/I7PvzXpi89aQL2d3OAxSTwLx6NilATeUbe0menFE3Lu5lFkOFci36ivimwYHHxw=="
}, },
"date-now": { "date-now": {
"version": "0.1.4", "version": "0.1.4",
@ -4483,9 +4559,9 @@
"integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w=="
}, },
"dotenv-expand": { "dotenv-expand": {
"version": "5.1.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU="
}, },
"duplexer": { "duplexer": {
"version": "0.1.1", "version": "0.1.1",
@ -4547,9 +4623,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
}, },
"electron-to-chromium": { "electron-to-chromium": {
"version": "1.3.265", "version": "1.3.269",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.265.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.269.tgz",
"integrity": "sha512-ypHt5Nv1Abr27QvJqk3VC4YDNqsrrWYMCmpmR7BNfCpcgYEwmCDoi3uJpp6kvj/MIjpScQoZMCQzLqfMQGmOsg==" "integrity": "sha512-t2ZTfo07HxkxTOUbIwMmqHBSnJsC9heqJUm7LwQu2iSk0wNhG4H5cMREtb8XxeCrQABDZ6IqQKY3yZq+NfAqwg=="
}, },
"elliptic": { "elliptic": {
"version": "6.5.1", "version": "6.5.1",
@ -4581,9 +4657,9 @@
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
}, },
"end-of-stream": { "end-of-stream": {
"version": "1.4.3", "version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.3.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-cbNhPFS6MlYlWTGncSiDYbdqKhwWFy7kNeb1YSOG6K65i/wPTkLVCJQj0hXA4j0m5Da+hBWnqopEnu1FFelisQ==", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"requires": { "requires": {
"once": "^1.4.0" "once": "^1.4.0"
} }
@ -4820,6 +4896,15 @@
"ms": "^2.1.1" "ms": "^2.1.1"
} }
}, },
"eslint-scope": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
"integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
"requires": {
"esrecurse": "^4.1.0",
"estraverse": "^4.1.1"
}
},
"import-fresh": { "import-fresh": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
@ -4891,25 +4976,15 @@
} }
}, },
"eslint-loader": { "eslint-loader": {
"version": "3.0.0", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz",
"integrity": "sha512-rdxyQ0i9VlhwVlR6oEzrIft8WNKYSD2/cOAJ1YVH/F76gAta7Zv1Dr5xJOUyx0fAsHB5cKNz9hwlUVLMFsQlPA==", "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==",
"requires": { "requires": {
"loader-fs-cache": "^1.0.2", "loader-fs-cache": "^1.0.0",
"loader-utils": "^1.2.3", "loader-utils": "^1.0.2",
"object-hash": "^1.3.1", "object-assign": "^4.0.1",
"schema-utils": "^2.1.0" "object-hash": "^1.1.4",
}, "rimraf": "^2.6.1"
"dependencies": {
"schema-utils": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.2.0.tgz",
"integrity": "sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA==",
"requires": {
"ajv": "^6.10.2",
"ajv-keywords": "^3.4.1"
}
}
} }
}, },
"eslint-module-utils": { "eslint-module-utils": {
@ -5159,15 +5234,14 @@
} }
}, },
"eslint-plugin-react-hooks": { "eslint-plugin-react-hooks": {
"version": "2.0.1", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.0.1.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
"integrity": "sha512-xir+3KHKo86AasxlCV8AHRtIZPHljqCRRUYgASkbatmt0fad4+5GgC7zkT7o/06hdKM6MIwp8giHVXqBPaarHQ==", "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA=="
"dev": true
}, },
"eslint-scope": { "eslint-scope": {
"version": "5.0.0", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
"integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
"requires": { "requires": {
"esrecurse": "^4.1.0", "esrecurse": "^4.1.0",
"estraverse": "^4.1.1" "estraverse": "^4.1.1"
@ -6062,9 +6136,9 @@
"integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ=="
}, },
"handlebars": { "handlebars": {
"version": "4.3.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.3.0.tgz", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.0.tgz",
"integrity": "sha512-7XlnO8yBXOdi7AzowjZssQr47Ctidqm7GbgARapOaqSN9HQhlClnOkR9HieGauIT3A8MBC6u9wPCXs97PCYpWg==", "integrity": "sha512-xkRtOt3/3DzTKMOt3xahj2M/EqNhY988T+imYSlMgs5fVhLN2fmKVVj0LtEGmb+3UUYV5Qmm1052Mm3dIQxOvw==",
"requires": { "requires": {
"neo-async": "^2.6.0", "neo-async": "^2.6.0",
"optimist": "^0.6.1", "optimist": "^0.6.1",
@ -6814,11 +6888,6 @@
"path-is-inside": "^1.0.1" "path-is-inside": "^1.0.1"
} }
}, },
"is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
},
"is-plain-object": { "is-plain-object": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@ -6991,12 +7060,12 @@
} }
}, },
"jest": { "jest": {
"version": "24.9.0", "version": "24.8.0",
"resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz",
"integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==",
"requires": { "requires": {
"import-local": "^2.0.0", "import-local": "^2.0.0",
"jest-cli": "^24.9.0" "jest-cli": "^24.8.0"
}, },
"dependencies": { "dependencies": {
"jest-cli": { "jest-cli": {
@ -7053,6 +7122,20 @@
"micromatch": "^3.1.10", "micromatch": "^3.1.10",
"pretty-format": "^24.9.0", "pretty-format": "^24.9.0",
"realpath-native": "^1.1.0" "realpath-native": "^1.1.0"
},
"dependencies": {
"jest-resolve": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
"integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
"requires": {
"@jest/types": "^24.9.0",
"browser-resolve": "^1.11.3",
"chalk": "^2.0.1",
"jest-pnp-resolver": "^1.2.1",
"realpath-native": "^1.1.0"
}
}
} }
}, },
"jest-diff": { "jest-diff": {
@ -7768,11 +7851,11 @@
"integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA=="
}, },
"jest-resolve": { "jest-resolve": {
"version": "24.9.0", "version": "24.8.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz",
"integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==",
"requires": { "requires": {
"@jest/types": "^24.9.0", "@jest/types": "^24.8.0",
"browser-resolve": "^1.11.3", "browser-resolve": "^1.11.3",
"chalk": "^2.0.1", "chalk": "^2.0.1",
"jest-pnp-resolver": "^1.2.1", "jest-pnp-resolver": "^1.2.1",
@ -7813,6 +7896,20 @@
"jest-worker": "^24.6.0", "jest-worker": "^24.6.0",
"source-map-support": "^0.5.6", "source-map-support": "^0.5.6",
"throat": "^4.0.0" "throat": "^4.0.0"
},
"dependencies": {
"jest-resolve": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
"integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
"requires": {
"@jest/types": "^24.9.0",
"browser-resolve": "^1.11.3",
"chalk": "^2.0.1",
"jest-pnp-resolver": "^1.2.1",
"realpath-native": "^1.1.0"
}
}
} }
}, },
"jest-runtime": { "jest-runtime": {
@ -7843,6 +7940,20 @@
"slash": "^2.0.0", "slash": "^2.0.0",
"strip-bom": "^3.0.0", "strip-bom": "^3.0.0",
"yargs": "^13.3.0" "yargs": "^13.3.0"
},
"dependencies": {
"jest-resolve": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
"integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
"requires": {
"@jest/types": "^24.9.0",
"browser-resolve": "^1.11.3",
"chalk": "^2.0.1",
"jest-pnp-resolver": "^1.2.1",
"realpath-native": "^1.1.0"
}
}
} }
}, },
"jest-serializer": { "jest-serializer": {
@ -7868,6 +7979,20 @@
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
"pretty-format": "^24.9.0", "pretty-format": "^24.9.0",
"semver": "^6.2.0" "semver": "^6.2.0"
},
"dependencies": {
"jest-resolve": {
"version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
"integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
"requires": {
"@jest/types": "^24.9.0",
"browser-resolve": "^1.11.3",
"chalk": "^2.0.1",
"jest-pnp-resolver": "^1.2.1",
"realpath-native": "^1.1.0"
}
}
} }
}, },
"jest-util": { "jest-util": {
@ -7915,40 +8040,16 @@
} }
}, },
"jest-watch-typeahead": { "jest-watch-typeahead": {
"version": "0.4.0", "version": "0.3.1",
"resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.0.tgz", "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.3.1.tgz",
"integrity": "sha512-bJR/HPNgOQnkmttg1OkBIrYFAYuxFxExtgQh67N2qPvaWGVC8TCkedRNPKBfmZfVXFD3u2sCH+9OuS5ApBfCgA==", "integrity": "sha512-cDIko96c4Yqg/7mfye1eEYZ6Pvugo9mnOOhGQod3Es7/KptNv1b+9gFVaotzdqNqTlwbkA80BnWHtzV4dc+trA==",
"requires": { "requires": {
"ansi-escapes": "^4.2.1", "ansi-escapes": "^3.0.0",
"chalk": "^2.4.1", "chalk": "^2.4.1",
"jest-watcher": "^24.3.0", "jest-watcher": "^24.3.0",
"slash": "^3.0.0", "slash": "^2.0.0",
"string-length": "^3.1.0", "string-length": "^2.0.0",
"strip-ansi": "^5.0.0" "strip-ansi": "^5.0.0"
},
"dependencies": {
"ansi-escapes": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
"integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==",
"requires": {
"type-fest": "^0.5.2"
}
},
"slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
},
"string-length": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz",
"integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==",
"requires": {
"astral-regex": "^1.0.0",
"strip-ansi": "^5.2.0"
}
}
} }
}, },
"jest-watcher": { "jest-watcher": {
@ -8607,12 +8708,11 @@
} }
}, },
"mini-css-extract-plugin": { "mini-css-extract-plugin": {
"version": "0.8.0", "version": "0.5.0",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz",
"integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==",
"requires": { "requires": {
"loader-utils": "^1.1.0", "loader-utils": "^1.1.0",
"normalize-url": "1.9.1",
"schema-utils": "^1.0.0", "schema-utils": "^1.0.0",
"webpack-sources": "^1.1.0" "webpack-sources": "^1.1.0"
} }
@ -8924,9 +9024,9 @@
} }
}, },
"node-releases": { "node-releases": {
"version": "1.1.32", "version": "1.1.33",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.32.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.33.tgz",
"integrity": "sha512-VhVknkitq8dqtWoluagsGPn3dxTvN9fwgR59fV3D7sLBHe0JfDramsMI8n8mY//ccq/Kkrf8ZRHRpsyVZ3qw1A==", "integrity": "sha512-I0V30bWQEoHb+10W8oedVoUrdjW5wIkYm0w7vvcrPO95pZY738m1k77GF5sO0vKg5eXYg9oGtrMAETbgZGm11A==",
"requires": { "requires": {
"semver": "^5.3.0" "semver": "^5.3.0"
}, },
@ -8970,15 +9070,9 @@
"integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
}, },
"normalize-url": { "normalize-url": {
"version": "1.9.1", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
"integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
"requires": {
"object-assign": "^4.0.1",
"prepend-http": "^1.0.0",
"query-string": "^4.1.0",
"sort-keys": "^1.0.0"
}
}, },
"npm-run-path": { "npm-run-path": {
"version": "2.0.2", "version": "2.0.2",
@ -10232,13 +10326,6 @@
"normalize-url": "^3.0.0", "normalize-url": "^3.0.0",
"postcss": "^7.0.0", "postcss": "^7.0.0",
"postcss-value-parser": "^3.0.0" "postcss-value-parser": "^3.0.0"
},
"dependencies": {
"normalize-url": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
"integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
}
} }
}, },
"postcss-normalize-whitespace": { "postcss-normalize-whitespace": {
@ -10462,11 +10549,6 @@
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
}, },
"prepend-http": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
"integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
},
"pretty-bytes": { "pretty-bytes": {
"version": "5.3.0", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
@ -10628,15 +10710,6 @@
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
}, },
"query-string": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
"integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
"requires": {
"object-assign": "^4.1.0",
"strict-uri-encode": "^1.0.0"
}
},
"querystring": { "querystring": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
@ -10716,9 +10789,9 @@
"integrity": "sha512-JsecfN+JlckncVXTWFWjn0Vk6uInl8GSf4eEd9tTk5qXHlgqkPdILpnYpgZcISXNYAzvfvsCZviaDk8AxyS5sg==" "integrity": "sha512-JsecfN+JlckncVXTWFWjn0Vk6uInl8GSf4eEd9tTk5qXHlgqkPdILpnYpgZcISXNYAzvfvsCZviaDk8AxyS5sg=="
}, },
"react": { "react": {
"version": "16.9.0", "version": "16.10.1",
"resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", "resolved": "https://registry.npmjs.org/react/-/react-16.10.1.tgz",
"integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", "integrity": "sha512-2bisHwMhxQ3XQz4LiJJwG3360pY965pTl/MRrZYxIBKVj4fOHoDs5aZAkYXGxDRO1Li+SyjTAilQEbOmtQJHzA==",
"requires": { "requires": {
"loose-envify": "^1.1.0", "loose-envify": "^1.1.0",
"object-assign": "^4.1.1", "object-assign": "^4.1.1",
@ -10827,14 +10900,14 @@
} }
}, },
"react-dom": { "react-dom": {
"version": "16.9.0", "version": "16.10.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.10.1.tgz",
"integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", "integrity": "sha512-SmM4ZW0uug0rn95U8uqr52I7UdNf6wdGLeXDmNLfg3y5q5H9eAbdjF5ubQc3bjDyRrvdAB2IKG7X0GzSpnn5Mg==",
"requires": { "requires": {
"loose-envify": "^1.1.0", "loose-envify": "^1.1.0",
"object-assign": "^4.1.1", "object-assign": "^4.1.1",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"scheduler": "^0.15.0" "scheduler": "^0.16.1"
} }
}, },
"react-error-overlay": { "react-error-overlay": {
@ -10843,9 +10916,9 @@
"integrity": "sha512-DHRuRk3K4Lg9obI6J4Y+nKvtwjasYRU9CFL3ud42x9YJG1HbQjSNublapC/WBJOA726gNUbqbj0U2df9+uzspQ==" "integrity": "sha512-DHRuRk3K4Lg9obI6J4Y+nKvtwjasYRU9CFL3ud42x9YJG1HbQjSNublapC/WBJOA726gNUbqbj0U2df9+uzspQ=="
}, },
"react-i18next": { "react-i18next": {
"version": "10.13.0", "version": "10.13.1",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-10.13.0.tgz", "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-10.13.1.tgz",
"integrity": "sha512-6BeRvNPlEw7MEmdE63A+VCl+HoVlTi/g0BWvhFWSaKlPFozUn5GGMf91UkpUZd4ItueR18Xvw8yKtji9RSOAOw==", "integrity": "sha512-MReJUMoYooaKZONvoewFuAwf31bQU60Xt25P5wBIPTMphY4LjDJE27rwhEKjNLL24nSIHa3Jh+z9bPwSKISAoA==",
"requires": { "requires": {
"@babel/runtime": "^7.3.1", "@babel/runtime": "^7.3.1",
"html-parse-stringify2": "2.0.1" "html-parse-stringify2": "2.0.1"
@ -10861,9 +10934,9 @@
} }
}, },
"react-is": { "react-is": {
"version": "16.9.0", "version": "16.10.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.1.tgz",
"integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==" "integrity": "sha512-BXUMf9sIOPXXZWqr7+c5SeOKJykyVr2u0UDzEf4LNGc6taGkQe1A9DFD07umCIXz45RLr9oAAwZbAJ0Pkknfaw=="
}, },
"react-onclickoutside": { "react-onclickoutside": {
"version": "6.9.0", "version": "6.9.0",
@ -10897,9 +10970,9 @@
} }
}, },
"react-router": { "react-router": {
"version": "5.1.0", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.0.tgz", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.1.tgz",
"integrity": "sha512-n9HXxaL/6yRlig9XPfGyagI8+bUNdqcu7FUAx0/Z+Us22Z8iHsbkyJ21Inebn9HOxI5Nxlfc8GNabkNSeXfhqw==", "integrity": "sha512-ozTXqxKZsn4GfZqpG5rVFHSSxlNuDoMNxgyjM+mFJVhqlnPwwkRsAPkDm1PcNjBdYxMzqAhtz48HkQB6fSYaAQ==",
"requires": { "requires": {
"@babel/runtime": "^7.1.2", "@babel/runtime": "^7.1.2",
"history": "^4.9.0", "history": "^4.9.0",
@ -10914,41 +10987,41 @@
} }
}, },
"react-router-dom": { "react-router-dom": {
"version": "5.1.0", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.0.tgz", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.1.tgz",
"integrity": "sha512-OkxKbMKjO7IkYqnoaZNX19MnwgjhxwZE871cPUTq0YU2wpIw7QwGxSnSoNRMOa7wO1TwvJJMFpgiEB4C/gVhTw==", "integrity": "sha512-r8R8H0Vt2ISqpk02rR6VZBLk+JZdR6pZV+h9K1y0ISh3/G4GGByNevYBS69x6czcOcWVRcZmXjwY8l9UBCKV+w==",
"requires": { "requires": {
"@babel/runtime": "^7.1.2", "@babel/runtime": "^7.1.2",
"history": "^4.9.0", "history": "^4.9.0",
"loose-envify": "^1.3.1", "loose-envify": "^1.3.1",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react-router": "5.1.0", "react-router": "5.1.1",
"tiny-invariant": "^1.0.2", "tiny-invariant": "^1.0.2",
"tiny-warning": "^1.0.0" "tiny-warning": "^1.0.0"
} }
}, },
"react-scripts": { "react-scripts": {
"version": "3.1.2", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.1.2.tgz", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.1.1.tgz",
"integrity": "sha512-aN9E1jn+Qii45/uLUzS7Hjfd/DXbcaAiRkoMwnJXAXShbpJiP2xwmr7yuVF0kR0cnvt0SI+IPZjsOH8MziSYQQ==", "integrity": "sha512-dbjTG9vJC61OI62hIswQYg5xHvwlxDTH6QXz6ICEuA5AqkFQWk1LKl76sk8fVL2WsyumbBc4FErALwKcEV2vNA==",
"requires": { "requires": {
"@babel/core": "7.6.0", "@babel/core": "7.5.5",
"@svgr/webpack": "4.3.2", "@svgr/webpack": "4.3.2",
"@typescript-eslint/eslint-plugin": "^2.2.0", "@typescript-eslint/eslint-plugin": "1.13.0",
"@typescript-eslint/parser": "^2.2.0", "@typescript-eslint/parser": "1.13.0",
"babel-eslint": "10.0.3", "babel-eslint": "10.0.2",
"babel-jest": "^24.9.0", "babel-jest": "^24.8.0",
"babel-loader": "8.0.6", "babel-loader": "8.0.6",
"babel-plugin-named-asset-import": "^0.3.4", "babel-plugin-named-asset-import": "^0.3.3",
"babel-preset-react-app": "^9.0.2", "babel-preset-react-app": "^9.0.1",
"camelcase": "^5.2.0", "camelcase": "^5.2.0",
"case-sensitive-paths-webpack-plugin": "2.2.0", "case-sensitive-paths-webpack-plugin": "2.2.0",
"css-loader": "2.1.1", "css-loader": "2.1.1",
"dotenv": "6.2.0", "dotenv": "6.2.0",
"dotenv-expand": "5.1.0", "dotenv-expand": "4.2.0",
"eslint": "^6.1.0", "eslint": "^6.1.0",
"eslint-config-react-app": "^5.0.2", "eslint-config-react-app": "^5.0.1",
"eslint-loader": "3.0.0", "eslint-loader": "2.2.1",
"eslint-plugin-flowtype": "3.13.0", "eslint-plugin-flowtype": "3.13.0",
"eslint-plugin-import": "2.18.2", "eslint-plugin-import": "2.18.2",
"eslint-plugin-jsx-a11y": "6.2.3", "eslint-plugin-jsx-a11y": "6.2.3",
@ -10960,11 +11033,11 @@
"html-webpack-plugin": "4.0.0-beta.5", "html-webpack-plugin": "4.0.0-beta.5",
"identity-obj-proxy": "3.0.0", "identity-obj-proxy": "3.0.0",
"is-wsl": "^1.1.0", "is-wsl": "^1.1.0",
"jest": "24.9.0", "jest": "24.8.0",
"jest-environment-jsdom-fourteen": "0.1.0", "jest-environment-jsdom-fourteen": "0.1.0",
"jest-resolve": "24.9.0", "jest-resolve": "24.8.0",
"jest-watch-typeahead": "0.4.0", "jest-watch-typeahead": "0.3.1",
"mini-css-extract-plugin": "0.8.0", "mini-css-extract-plugin": "0.5.0",
"optimize-css-assets-webpack-plugin": "5.0.3", "optimize-css-assets-webpack-plugin": "5.0.3",
"pnp-webpack-plugin": "1.5.0", "pnp-webpack-plugin": "1.5.0",
"postcss-flexbugs-fixes": "4.1.0", "postcss-flexbugs-fixes": "4.1.0",
@ -10972,27 +11045,20 @@
"postcss-normalize": "7.0.1", "postcss-normalize": "7.0.1",
"postcss-preset-env": "6.7.0", "postcss-preset-env": "6.7.0",
"postcss-safe-parser": "4.0.1", "postcss-safe-parser": "4.0.1",
"react-app-polyfill": "^1.0.3", "react-app-polyfill": "^1.0.2",
"react-dev-utils": "^9.0.4", "react-dev-utils": "^9.0.3",
"resolve": "1.12.0", "resolve": "1.12.0",
"resolve-url-loader": "3.1.0", "resolve-url-loader": "3.1.0",
"sass-loader": "7.2.0", "sass-loader": "7.2.0",
"semver": "6.3.0", "semver": "6.3.0",
"style-loader": "1.0.0", "style-loader": "1.0.0",
"terser-webpack-plugin": "1.4.1", "terser-webpack-plugin": "1.4.1",
"ts-pnp": "1.1.4", "ts-pnp": "1.1.2",
"url-loader": "2.1.0", "url-loader": "2.1.0",
"webpack": "4.40.2", "webpack": "4.39.1",
"webpack-dev-server": "3.2.1", "webpack-dev-server": "3.2.1",
"webpack-manifest-plugin": "2.0.4", "webpack-manifest-plugin": "2.0.4",
"workbox-webpack-plugin": "4.3.1" "workbox-webpack-plugin": "4.3.1"
},
"dependencies": {
"eslint-plugin-react-hooks": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
"integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA=="
}
} }
}, },
"react-textarea-autosize": { "react-textarea-autosize": {
@ -11106,9 +11172,9 @@
} }
}, },
"redux-orm": { "redux-orm": {
"version": "0.14.0", "version": "0.14.1",
"resolved": "https://registry.npmjs.org/redux-orm/-/redux-orm-0.14.0.tgz", "resolved": "https://registry.npmjs.org/redux-orm/-/redux-orm-0.14.1.tgz",
"integrity": "sha512-ivB1GoZkp3qW5fCPq6C68k7QsMEScfzKI7FzmXdIGwWmqeZ0zwWJTv+JlckBzSosjAUCwA+ZsREIY5yZ6L2hYA==", "integrity": "sha512-0bh1nFxEmdV1SvYfYRmXx9KKhOURCR+Gl8GSGl+Hc7ePjF3v8mCVDIhQlANgdbs/8fXte7ZpOoVb0Syl+0i8pw==",
"requires": { "requires": {
"@babel/runtime": "^7.6.0", "@babel/runtime": "^7.6.0",
"immutable-ops": "^0.7.0", "immutable-ops": "^0.7.0",
@ -11635,9 +11701,9 @@
} }
}, },
"scheduler": { "scheduler": {
"version": "0.15.0", "version": "0.16.1",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.16.1.tgz",
"integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", "integrity": "sha512-MIuie7SgsqMYOdCXVFZa8SKoNorJZUWHW8dPgto7uEHn1lX3fg2Gu0TzgK8USj76uxV7vB5eRMnZs/cdEHg+cg==",
"requires": { "requires": {
"loose-envify": "^1.1.0", "loose-envify": "^1.1.0",
"object-assign": "^4.1.1" "object-assign": "^4.1.1"
@ -12156,14 +12222,6 @@
} }
} }
}, },
"sort-keys": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
"integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
"requires": {
"is-plain-obj": "^1.0.0"
}
},
"source-list-map": { "source-list-map": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
@ -12459,11 +12517,6 @@
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
"integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
}, },
"strict-uri-encode": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
},
"string-length": { "string-length": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
@ -12594,9 +12647,9 @@
}, },
"dependencies": { "dependencies": {
"schema-utils": { "schema-utils": {
"version": "2.2.0", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.2.0.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz",
"integrity": "sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA==", "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==",
"requires": { "requires": {
"ajv": "^6.10.2", "ajv": "^6.10.2",
"ajv-keywords": "^3.4.1" "ajv-keywords": "^3.4.1"
@ -12698,9 +12751,9 @@
"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
}, },
"terser": { "terser": {
"version": "4.3.2", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.3.2.tgz", "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.4.tgz",
"integrity": "sha512-obxk4x19Zlzj9zY4QeXj9iPCb5W8YGn4v3pn4/fHj0Nw8+R7N02Kvwvz9VpOItCZZD8RC+vnYCDL0gP6FAJ7Xg==", "integrity": "sha512-Kcrn3RiW8NtHBP0ssOAzwa2MsIRQ8lJWiBG/K7JgqPlomA3mtb2DEmp4/hrUA+Jujx+WZ02zqd7GYD+QRBB/2Q==",
"requires": { "requires": {
"commander": "^2.20.0", "commander": "^2.20.0",
"source-map": "~0.6.1", "source-map": "~0.6.1",
@ -12908,9 +12961,9 @@
} }
}, },
"ts-pnp": { "ts-pnp": {
"version": "1.1.4", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.4.tgz", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.2.tgz",
"integrity": "sha512-1J/vefLC+BWSo+qe8OnJQfWTYRS6ingxjwqmHMqaMxXMj7kFtKLgAaYW3JeX3mktjgUL+etlU8/B4VUAUI9QGw==" "integrity": "sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA=="
}, },
"tslib": { "tslib": {
"version": "1.10.0", "version": "1.10.0",
@ -12956,11 +13009,6 @@
"prelude-ls": "~1.1.2" "prelude-ls": "~1.1.2"
} }
}, },
"type-fest": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
"integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw=="
},
"type-is": { "type-is": {
"version": "1.6.18", "version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@ -13189,9 +13237,9 @@
}, },
"dependencies": { "dependencies": {
"schema-utils": { "schema-utils": {
"version": "2.2.0", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.2.0.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz",
"integrity": "sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA==", "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==",
"requires": { "requires": {
"ajv": "^6.10.2", "ajv": "^6.10.2",
"ajv-keywords": "^3.4.1" "ajv-keywords": "^3.4.1"
@ -13374,9 +13422,9 @@
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
}, },
"webpack": { "webpack": {
"version": "4.40.2", "version": "4.39.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.40.2.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.1.tgz",
"integrity": "sha512-5nIvteTDCUws2DVvP9Qe+JPla7kWPPIDFZv55To7IycHWZ+Z5qBdaBYPyuXWdhggTufZkQwfIK+5rKQTVovm2A==", "integrity": "sha512-/LAb2TJ2z+eVwisldp3dqTEoNhzp/TLCZlmZm3GGGAlnfIWDgOEE758j/9atklNLfRyhKbZTCOIoPqLJXeBLbQ==",
"requires": { "requires": {
"@webassemblyjs/ast": "1.8.5", "@webassemblyjs/ast": "1.8.5",
"@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5",
@ -13407,22 +13455,13 @@
"version": "6.3.0", "version": "6.3.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
"integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA=="
},
"eslint-scope": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
"integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
"requires": {
"esrecurse": "^4.1.0",
"estraverse": "^4.1.1"
}
} }
} }
}, },
"webpack-dev-middleware": { "webpack-dev-middleware": {
"version": "3.7.1", "version": "3.7.2",
"resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.1.tgz", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
"integrity": "sha512-5MWu9SH1z3hY7oHOV6Kbkz5x7hXbxK56mGHNqHTe6d+ewxOwKUxoUJBs7QIaJb33lPjl9bJZ3X0vCoooUzC36A==", "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
"requires": { "requires": {
"memory-fs": "^0.4.1", "memory-fs": "^0.4.1",
"mime": "^2.4.4", "mime": "^2.4.4",
@ -13993,9 +14032,9 @@
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
}, },
"yallist": { "yallist": {
"version": "3.0.3", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.0.tgz",
"integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" "integrity": "sha512-6gpP93MR+VOOehKbCPchro3wFZNSNmek8A2kbkOAZLIZAYx1KP/zAqwO0sOHi3xJEb+UBz8NaYt/17UNit1Q9w=="
}, },
"yargs": { "yargs": {
"version": "13.3.0", "version": "13.3.0",

View file

@ -23,14 +23,11 @@
], ],
"parser": "babel-eslint" "parser": "babel-eslint"
}, },
"eslintIgnore": [
"src/service-worker.js"
],
"dependencies": { "dependencies": {
"axios": "^0.19.0", "axios": "^0.19.0",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"connected-react-router": "^6.5.2", "connected-react-router": "^6.5.2",
"date-fns": "^2.3.0", "date-fns": "^2.4.1",
"dequal": "^1.0.0", "dequal": "^1.0.0",
"history": "^4.10.1", "history": "^4.10.1",
"i18next": "^17.0.16", "i18next": "^17.0.16",
@ -38,19 +35,19 @@
"initials": "^3.0.1", "initials": "^3.0.1",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"prop-types": "^15.7.2", "prop-types": "^15.7.2",
"react": "^16.9.0", "react": "^16.10.1",
"react-beautiful-dnd": "^11.0.5", "react-beautiful-dnd": "^11.0.5",
"react-datepicker": "^2.9.6", "react-datepicker": "^2.9.6",
"react-dom": "^16.9.0", "react-dom": "^16.10.1",
"react-i18next": "^10.13.0", "react-i18next": "^10.13.1",
"react-input-mask": "^2.0.4", "react-input-mask": "^2.0.4",
"react-redux": "^7.1.1", "react-redux": "^7.1.1",
"react-router-dom": "^5.1.0", "react-router-dom": "^5.1.1",
"react-scripts": "3.1.2", "react-scripts": "3.1.1",
"react-textarea-autosize": "^7.1.0", "react-textarea-autosize": "^7.1.0",
"redux": "^4.0.4", "redux": "^4.0.4",
"redux-logger": "^3.0.6", "redux-logger": "^3.0.6",
"redux-orm": "^0.14.0", "redux-orm": "^0.14.1",
"redux-saga": "^1.1.1", "redux-saga": "^1.1.1",
"reselect": "^4.0.0", "reselect": "^4.0.0",
"sails.io.js": "^1.2.1", "sails.io.js": "^1.2.1",
@ -60,11 +57,7 @@
"whatwg-fetch": "^3.0.0" "whatwg-fetch": "^3.0.0"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^6.4.0", "eslint": "6.4.0",
"eslint-config-airbnb": "^18.0.1", "eslint-config-airbnb": "^18.0.1"
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.14.3",
"eslint-plugin-react-hooks": "^2.0.1"
} }
} }

View file

@ -13,7 +13,7 @@ const http = {};
return result; return result;
}, new FormData()); }, new FormData());
return fetch(`${Config.API_URL}${Config.API_PATH}${url}`, { return fetch(`${Config.SERVER_BASE_URL}/api${url}`, {
method, method,
headers, headers,
body: formData, body: formData,

View file

@ -5,7 +5,7 @@ import Config from '../constants/Config';
const io = sailsIOClient(socketIOClient); const io = sailsIOClient(socketIOClient);
io.sails.url = Config.API_URL; io.sails.url = Config.SERVER_BASE_URL;
io.sails.autoConnect = false; io.sails.autoConnect = false;
io.sails.reconnection = true; io.sails.reconnection = true;
io.sails.useCORSRouteToGetCookie = false; io.sails.useCORSRouteToGetCookie = false;
@ -22,7 +22,7 @@ socket.connect = socket._connect; // eslint-disable-line no-underscore-dangle
method, method,
data, data,
headers, headers,
url: `${Config.API_PATH}${url}`, url: `/api${url}`,
}, },
(_, { body, error }) => { (_, { body, error }) => {
if (error) { if (error) {

View file

@ -1,13 +1,12 @@
const API_URL = 'http://localhost:1337'; const SERVER_BASE_URL = process.env.REACT_APP_SERVER_BASE_URL
const API_PATH = ''; || (process.env.NODE_ENV === 'production' ? '' : 'http://localhost:1337');
const POSITION_GAP = 65535; const POSITION_GAP = 65535;
const ACTIONS_LIMIT = 10; const ACTIONS_LIMIT = 10;
export default { export default {
API_URL, SERVER_BASE_URL,
API_PATH,
POSITION_GAP, POSITION_GAP,
ACTIONS_LIMIT, ACTIONS_LIMIT,
}; };

View file

@ -3,14 +3,8 @@ import ReactDOM from 'react-dom';
import store from './store'; import store from './store';
import history from './history'; import history from './history';
import * as serviceWorker from './service-worker';
import Root from './components/Root'; import Root from './components/Root';
import './i18n'; import './i18n';
ReactDOM.render(React.createElement(Root, { store, history }), document.getElementById('root')); ReactDOM.render(React.createElement(Root, { store, history }), document.getElementById('root'));
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: http://bit.ly/CRA-PWA
serviceWorker.register();

View file

@ -15,8 +15,7 @@ export default {
addUser_title: 'Add User', addUser_title: 'Add User',
administrator: 'Administrator', administrator: 'Administrator',
all: 'All', all: 'All',
allChangesWillBeAutomaticallySavedAfterConnectionRestored: allChangesWillBeAutomaticallySavedAfterConnectionRestored: 'All changes will be automatically saved<br />after connection restored',
'All changes will be automatically saved<br />after connection restored',
areYouSureYouWantToDeleteThisBoard: 'Are you sure you want to delete this board?', areYouSureYouWantToDeleteThisBoard: 'Are you sure you want to delete this board?',
areYouSureYouWantToDeleteThisCard: 'Are you sure you want to delete this card?', areYouSureYouWantToDeleteThisCard: 'Are you sure you want to delete this card?',
areYouSureYouWantToDeleteThisComment: 'Are you sure you want to delete this comment?', areYouSureYouWantToDeleteThisComment: 'Are you sure you want to delete this comment?',
@ -25,8 +24,7 @@ export default {
areYouSureYouWantToDeleteThisProject: 'Are you sure you want to delete this project?', areYouSureYouWantToDeleteThisProject: 'Are you sure you want to delete this project?',
areYouSureYouWantToDeleteThisTask: 'Are you sure you want to delete this task?', areYouSureYouWantToDeleteThisTask: 'Are you sure you want to delete this task?',
areYouSureYouWantToDeleteThisUser: 'Are you sure you want to delete this user?', areYouSureYouWantToDeleteThisUser: 'Are you sure you want to delete this user?',
areYouSureYouWantToRemoveThisMemberFromProject: areYouSureYouWantToRemoveThisMemberFromProject: 'Are you sure you want to remove this member from project?',
'Are you sure you want to remove this member from project?',
boardNotFound_title: 'Board Not Found', boardNotFound_title: 'Board Not Found',
cardActions_title: 'Card Actions', cardActions_title: 'Card Actions',
cardNotFound_title: 'Card Not Found', cardNotFound_title: 'Card Not Found',
@ -72,10 +70,8 @@ export default {
notifications: 'Notifications', notifications: 'Notifications',
noUnreadNotifications: 'No unread notifications', noUnreadNotifications: 'No unread notifications',
openBoard_title: 'Open Board', openBoard_title: 'Open Board',
pageNotFound_title: 'Page Not Found',
projectNotFound_title: 'Project Not Found', projectNotFound_title: 'Project Not Found',
refreshPageToLoadLastDataAndReceiveUpdates: refreshPageToLoadLastDataAndReceiveUpdates: '<0>Refresh the page</0> to load last data<br />and receive updates',
'<0>Refresh the page</0> to load last data<br />and receive updates',
removeMember_title: 'Remove Member', removeMember_title: 'Remove Member',
seconds: 'Seconds', seconds: 'Seconds',
taskActions_title: 'Task Actions', taskActions_title: 'Task Actions',
@ -87,8 +83,7 @@ export default {
userIsAlreadyExist: 'User is already exist', userIsAlreadyExist: 'User is already exist',
userLeftNewCommentToCard: '{{user}} left a new comment «{{comment}}» to <2>{{card}}</2>', userLeftNewCommentToCard: '{{user}} left a new comment «{{comment}}» to <2>{{card}}</2>',
userMovedCardFromListToList: '{{user}} moved <2>{{card}}</2> from {{fromList}} to {{toList}}', userMovedCardFromListToList: '{{user}} moved <2>{{card}}</2> from {{fromList}} to {{toList}}',
userMovedThisCardFromListToList: userMovedThisCardFromListToList: '<0>{{user}}</0><1> moved this card from {{fromList}} to {{toList}}</1> 12342134123412412412412412412',
'<0>{{user}}</0><1> moved this card from {{fromList}} to {{toList}}</1>',
users: 'Users', users: 'Users',
writeComment: 'Write a comment...', writeComment: 'Write a comment...',
}, },

View file

@ -6,6 +6,7 @@ export default {
invalidPassword: 'Invalid password', invalidPassword: 'Invalid password',
logInToPlanka: 'Log in to Planka', logInToPlanka: 'Log in to Planka',
noInternetConnection: 'No internet connection', noInternetConnection: 'No internet connection',
pageNotFound_title: 'Page Not Found',
password: 'Password', password: 'Password',
projectManagment: 'Project managment', projectManagment: 'Project managment',
serverConnectionFailed: 'Server connection failed', serverConnectionFailed: 'Server connection failed',

View file

@ -19,8 +19,7 @@ export default {
addUser: 'Добавление пользователя', addUser: 'Добавление пользователя',
administrator: 'Администратор', administrator: 'Администратор',
all: 'Все', all: 'Все',
allChangesWillBeAutomaticallySavedAfterConnectionRestored: allChangesWillBeAutomaticallySavedAfterConnectionRestored: 'Все изменения сохранятся автоматически,<br />как только подключение восстановится',
'Все изменения сохранятся автоматически,<br />как только подключение восстановится',
areYouSureYouWantToDeleteThisBoard: 'Вы уверены, что хотите удалить эту доску?', areYouSureYouWantToDeleteThisBoard: 'Вы уверены, что хотите удалить эту доску?',
areYouSureYouWantToDeleteThisCard: 'Вы уверены, что хотите удалить эту карточку?', areYouSureYouWantToDeleteThisCard: 'Вы уверены, что хотите удалить эту карточку?',
areYouSureYouWantToDeleteThisComment: 'Вы уверены, что хотите удалить этот комментарий?', areYouSureYouWantToDeleteThisComment: 'Вы уверены, что хотите удалить этот комментарий?',
@ -29,8 +28,7 @@ export default {
areYouSureYouWantToDeleteThisProject: 'Вы уверены, что хотите удалить этот проект?', areYouSureYouWantToDeleteThisProject: 'Вы уверены, что хотите удалить этот проект?',
areYouSureYouWantToDeleteThisTask: 'Вы уверены, что хотите удалить эту задачу?', areYouSureYouWantToDeleteThisTask: 'Вы уверены, что хотите удалить эту задачу?',
areYouSureYouWantToDeleteThisUser: 'Вы уверены, что хотите удалить этого пользователя?', areYouSureYouWantToDeleteThisUser: 'Вы уверены, что хотите удалить этого пользователя?',
areYouSureYouWantToRemoveThisMemberFromProject: areYouSureYouWantToRemoveThisMemberFromProject: 'Вы уверены, что хотите удалить этого участника из проекта?',
'Вы уверены, что хотите удалить этого участника из проекта?',
boardNotFound: 'Доска не найдена', boardNotFound: 'Доска не найдена',
cardActions: 'Действия с карточкой', cardActions: 'Действия с карточкой',
cardNotFound: 'Карточка не найдена', cardNotFound: 'Карточка не найдена',
@ -76,10 +74,8 @@ export default {
notifications: 'Уведомления', notifications: 'Уведомления',
noUnreadNotifications: 'Уведомлений нет', noUnreadNotifications: 'Уведомлений нет',
openBoard: 'Откройте доску', openBoard: 'Откройте доску',
pageNotFound: 'Страница не найдена',
projectNotFound: 'Доска не найдена', projectNotFound: 'Доска не найдена',
refreshPageToLoadLastDataAndReceiveUpdates: refreshPageToLoadLastDataAndReceiveUpdates: '<0>Обновите страницу</0>, чтобы загрузить<br />актуальные данные и получать обновления',
'<0>Обновите страницу</0>, чтобы загрузить<br />актуальные данные и получать обновления',
removeMember: 'Удаление участника', removeMember: 'Удаление участника',
seconds: 'Секунды', seconds: 'Секунды',
taskActions: 'Действия с задачей', taskActions: 'Действия с задачей',
@ -90,10 +86,8 @@ export default {
userAddedThisCardToList: '<0>{{user}}</0><1> добавил(а) эту карточку в {{list}}</1>', userAddedThisCardToList: '<0>{{user}}</0><1> добавил(а) эту карточку в {{list}}</1>',
userIsAlreadyExist: 'Пользователь уже существует', userIsAlreadyExist: 'Пользователь уже существует',
userLeftNewCommentToCard: '{{user}} оставил(а) комментарий «{{comment}}» к <2>{{card}}</2>', userLeftNewCommentToCard: '{{user}} оставил(а) комментарий «{{comment}}» к <2>{{card}}</2>',
userMovedCardFromListToList: userMovedCardFromListToList: '{{user}} переместил(а) <2>{{card}}</2> из {{fromList}} в {{toList}}',
'{{user}} переместил(а) <2>{{card}}</2> из {{fromList}} в {{toList}}', userMovedThisCardFromListToList: '<0>{{user}}</0><1> переместил(а) эту карточку из {{fromList}} в {{toList}}</1>',
userMovedThisCardFromListToList:
'<0>{{user}}</0><1> переместил(а) эту карточку из {{fromList}} в {{toList}}</1>',
users: 'Пользователи', users: 'Пользователи',
writeComment: 'Напишите комментарий...', writeComment: 'Напишите комментарий...',
}, },

View file

@ -6,6 +6,7 @@ export default {
invalidPassword: 'Неверный пароль', invalidPassword: 'Неверный пароль',
logInToPlanka: 'Вход в Planka', logInToPlanka: 'Вход в Planka',
noInternetConnection: 'Нет соединения', noInternetConnection: 'Нет соединения',
pageNotFound: 'Страница не найдена',
password: 'Пароль', password: 'Пароль',
projectManagment: 'Управление проектами', projectManagment: 'Управление проектами',
serverConnectionFailed: 'Не могу подключиться к серверу', serverConnectionFailed: 'Не могу подключиться к серверу',

View file

@ -1,135 +0,0 @@
// This optional code is used to register a service worker.
// register() is not called by default.
// This lets the app load faster on subsequent visits in production, and gives
// it offline capabilities. However, it also means that developers (and users)
// will only see deployed updates on subsequent visits to a page, after all the
// existing tabs open on the page have been closed, since previously cached
// resources are updated in the background.
// To learn more about the benefits of this model and instructions on how to
// opt-in, read http://bit.ly/CRA-PWA
const isLocalhost = Boolean(
window.location.hostname === 'localhost' ||
// [::1] is the IPv6 localhost address.
window.location.hostname === '[::1]' ||
// 127.0.0.1/8 is considered localhost for IPv4.
window.location.hostname.match(
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
)
);
export function register(config) {
if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
// The URL constructor is available in all browsers that support SW.
const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
if (publicUrl.origin !== window.location.origin) {
// Our service worker won't work if PUBLIC_URL is on a different origin
// from what our page is served on. This might happen if a CDN is used to
// serve assets; see https://github.com/facebook/create-react-app/issues/2374
return;
}
window.addEventListener('load', () => {
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
if (isLocalhost) {
// This is running on localhost. Let's check if a service worker still exists or not.
checkValidServiceWorker(swUrl, config);
// Add some additional logging to localhost, pointing developers to the
// service worker/PWA documentation.
navigator.serviceWorker.ready.then(() => {
console.log(
'This web app is being served cache-first by a service ' +
'worker. To learn more, visit http://bit.ly/CRA-PWA'
);
});
} else {
// Is not localhost. Just register service worker
registerValidSW(swUrl, config);
}
});
}
}
function registerValidSW(swUrl, config) {
navigator.serviceWorker
.register(swUrl)
.then(registration => {
registration.onupdatefound = () => {
const installingWorker = registration.installing;
if (installingWorker == null) {
return;
}
installingWorker.onstatechange = () => {
if (installingWorker.state === 'installed') {
if (navigator.serviceWorker.controller) {
// At this point, the updated precached content has been fetched,
// but the previous service worker will still serve the older
// content until all client tabs are closed.
console.log(
'New content is available and will be used when all ' +
'tabs for this page are closed. See http://bit.ly/CRA-PWA.'
);
// Execute callback
if (config && config.onUpdate) {
config.onUpdate(registration);
}
} else {
// At this point, everything has been precached.
// It's the perfect time to display a
// "Content is cached for offline use." message.
console.log('Content is cached for offline use.');
// Execute callback
if (config && config.onSuccess) {
config.onSuccess(registration);
}
}
}
};
};
})
.catch(error => {
console.error('Error during service worker registration:', error);
});
}
function checkValidServiceWorker(swUrl, config) {
// Check if the service worker can be found. If it can't reload the page.
fetch(swUrl)
.then(response => {
// Ensure service worker exists, and that we really are getting a JS file.
const contentType = response.headers.get('content-type');
if (
response.status === 404 ||
(contentType != null && contentType.indexOf('javascript') === -1)
) {
// No service worker found. Probably a different app. Reload the page.
navigator.serviceWorker.ready.then(registration => {
registration.unregister().then(() => {
window.location.reload();
});
});
} else {
// Service worker found. Proceed as normal.
registerValidSW(swUrl, config);
}
})
.catch(() => {
console.log(
'No internet connection found. App is running in offline mode.'
);
});
}
export function unregister() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.ready.then(registration => {
registration.unregister();
});
}
}

BIN
demo.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 792 KiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Before After
Before After

35
docker-compose.yml Normal file
View file

@ -0,0 +1,35 @@
version: '3'
services:
planka:
image: meltyshev/planka:latest
command: >
bash -c
"for i in `seq 1 30`; do
npm start &&
s=$$? && break || s=$$?;
echo \"Tried $$i times. Waiting 5 seconds...\";
sleep 5;
done; (exit $$s)"
restart: unless-stopped
volumes:
- uploads:/app/public/uploads
ports:
- 3000:1337
environment:
- BASE_URL=http://localhost:3000
- DATABASE_URL=postgresql://postgres@postgres/planka
depends_on:
- postgres
postgres:
image: postgres:alpine
restart: unless-stopped
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=planka
volumes:
uploads:
db-data:

View file

@ -1,3 +1,3 @@
TZ=UTC TZ=UTC
DATABASE_URL=postgresql://localhost/planka
BASE_URL=http://localhost:1337 BASE_URL=http://localhost:1337
DATABASE_URL=postgresql://localhost/planka

16
server/.gitignore vendored
View file

@ -46,9 +46,6 @@
config/local.js config/local.js
.env.local
.env.*.local
################################################ ################################################
# Dependencies # Dependencies
# #
@ -103,10 +100,7 @@ node_modules
# Temporary files generated by Sails/Waterline. # Temporary files generated by Sails/Waterline.
################################################ ################################################
.tmp/* .tmp
!.tmp/public
.tmp/public/uploads/*
!.tmp/public/uploads/.gitkeep
################################################ ################################################
# Miscellaneous # Miscellaneous
@ -130,3 +124,11 @@ lib-cov
*.log *.log
*.out *.out
*.pid *.pid
public/*
!public/uploads
public/uploads/*
!public/uploads/.gitkeep
views/*
!views/.gitkeep

View file

@ -2,15 +2,17 @@
"generators": { "generators": {
"modules": {} "modules": {}
}, },
"_generatedWith": {
"sails": "1.1.0",
"sails-generate": "1.16.4"
},
"hooks": { "hooks": {
"blueprints": false, "blueprints": false,
"grunt": false, "grunt": false,
"i18n": false, "i18n": false,
"session": false, "session": false
"views": false },
"paths": {
"public": "public"
},
"_generatedWith": {
"sails": "1.1.0",
"sails-generate": "1.16.4"
} }
} }

View file

@ -20,6 +20,6 @@ module.exports.custom = {
baseUrl: process.env.BASE_URL, baseUrl: process.env.BASE_URL,
uploadsPath: path.join(sails.config.paths.tmp, 'public', 'uploads'), uploadsPath: path.join(sails.config.paths.public, 'uploads'),
uploadsUrl: `${process.env.BASE_URL}/uploads`, uploadsUrl: `${process.env.BASE_URL}/uploads`,
}; };

View file

@ -19,6 +19,7 @@
* https://sailsjs.com/docs/concepts/deployment * https://sailsjs.com/docs/concepts/deployment
*/ */
const url = require('url');
const path = require('path'); const path = require('path');
const sails = require('sails'); const sails = require('sails');
@ -246,7 +247,7 @@ module.exports = {
***************************************************************************/ ***************************************************************************/
onlyAllowOrigins: [ onlyAllowOrigins: [
process.env.BASE_URL, new url.URL(process.env.BASE_URL).origin,
], ],
/*************************************************************************** /***************************************************************************
@ -360,7 +361,7 @@ module.exports = {
custom: { custom: {
baseUrl: process.env.BASE_URL, baseUrl: process.env.BASE_URL,
uploadsPath: path.join(sails.config.paths.tmp, 'public', 'uploads'), uploadsPath: path.join(sails.config.paths.public, 'uploads'),
uploadsUrl: `${process.env.BASE_URL}/uploads`, uploadsUrl: `${process.env.BASE_URL}/uploads`,
// mailgunDomain: 'mg.example.com', // mailgunDomain: 'mg.example.com',

View file

@ -9,55 +9,60 @@
*/ */
module.exports.routes = { module.exports.routes = {
'POST /access-tokens': 'access-tokens/create', 'POST /api/access-tokens': 'access-tokens/create',
'GET /users': 'users/index', 'GET /api/users': 'users/index',
'POST /users': 'users/create', 'POST /api/users': 'users/create',
'GET /users/me': 'users/show', 'GET /api/users/me': 'users/show',
'PATCH /users/:id': 'users/update', 'PATCH /api/users/:id': 'users/update',
'POST /users/:id/upload-avatar': 'users/upload-avatar', 'POST /api/users/:id/upload-avatar': 'users/upload-avatar',
'DELETE /users/:id': 'users/delete', 'DELETE /api/users/:id': 'users/delete',
'GET /projects': 'projects/index', 'GET /api/projects': 'projects/index',
'POST /projects': 'projects/create', 'POST /api/projects': 'projects/create',
'PATCH /projects/:id': 'projects/update', 'PATCH /api/projects/:id': 'projects/update',
'DELETE /projects/:id': 'projects/delete', 'DELETE /api/projects/:id': 'projects/delete',
'POST /projects/:projectId/memberships': 'project-memberships/create', 'POST /api/projects/:projectId/memberships': 'project-memberships/create',
'DELETE /project-memberships/:id': 'project-memberships/delete', 'DELETE /api/project-memberships/:id': 'project-memberships/delete',
'POST /projects/:projectId/boards': 'boards/create', 'POST /api/projects/:projectId/boards': 'boards/create',
'GET /boards/:id': 'boards/show', 'GET /api/boards/:id': 'boards/show',
'PATCH /boards/:id': 'boards/update', 'PATCH /api/boards/:id': 'boards/update',
'DELETE /boards/:id': 'boards/delete', 'DELETE /api/boards/:id': 'boards/delete',
'POST /boards/:boardId/lists': 'lists/create', 'POST /api/boards/:boardId/lists': 'lists/create',
'PATCH /lists/:id': 'lists/update', 'PATCH /api/lists/:id': 'lists/update',
'DELETE /lists/:id': 'lists/delete', 'DELETE /api/lists/:id': 'lists/delete',
'POST /boards/:boardId/labels': 'labels/create', 'POST /api/boards/:boardId/labels': 'labels/create',
'PATCH /labels/:id': 'labels/update', 'PATCH /api/labels/:id': 'labels/update',
'DELETE /labels/:id': 'labels/delete', 'DELETE /api/labels/:id': 'labels/delete',
'POST /lists/:listId/cards': 'cards/create', 'POST /api/lists/:listId/cards': 'cards/create',
'GET /cards/:id': 'cards/show', 'GET /api/cards/:id': 'cards/show',
'PATCH /cards/:id': 'cards/update', 'PATCH /api/cards/:id': 'cards/update',
'DELETE /cards/:id': 'cards/delete', 'DELETE /api/cards/:id': 'cards/delete',
'POST /cards/:cardId/memberships': 'card-memberships/create', 'POST /api/cards/:cardId/memberships': 'card-memberships/create',
'DELETE /cards/:cardId/memberships': 'card-memberships/delete', 'DELETE /api/cards/:cardId/memberships': 'card-memberships/delete',
'POST /cards/:cardId/labels': 'card-labels/create', 'POST /api/cards/:cardId/labels': 'card-labels/create',
'DELETE /cards/:cardId/labels/:labelId': 'card-labels/delete', 'DELETE /api/cards/:cardId/labels/:labelId': 'card-labels/delete',
'POST /cards/:cardId/tasks': 'tasks/create', 'POST /api/cards/:cardId/tasks': 'tasks/create',
'PATCH /tasks/:id': 'tasks/update', 'PATCH /api/tasks/:id': 'tasks/update',
'DELETE /tasks/:id': 'tasks/delete', 'DELETE /api/tasks/:id': 'tasks/delete',
'GET /cards/:cardId/actions': 'actions/index', 'GET /api/cards/:cardId/actions': 'actions/index',
'POST /cards/:cardId/comment-actions': 'comment-actions/create', 'POST /api/cards/:cardId/comment-actions': 'comment-actions/create',
'PATCH /comment-actions/:id': 'comment-actions/update', 'PATCH /api/comment-actions/:id': 'comment-actions/update',
'DELETE /comment-actions/:id': 'comment-actions/delete', 'DELETE /api/comment-actions/:id': 'comment-actions/delete',
'GET /notifications': 'notifications/index', 'GET /api/notifications': 'notifications/index',
'PATCH /notifications/:ids': 'notifications/update' 'PATCH /api/notifications/:ids': 'notifications/update',
'GET /*': {
view: 'index',
skipAssets: true,
},
}; };

View file

@ -24,7 +24,7 @@ module.exports.views = {
* * * *
***************************************************************************/ ***************************************************************************/
// extension: 'ejs', extension: 'html',
/*************************************************************************** /***************************************************************************
* * * *
@ -35,5 +35,5 @@ module.exports.views = {
* * * *
***************************************************************************/ ***************************************************************************/
layout: 'layouts/layout', layout: false,
}; };

19
server/db/init.js Normal file
View file

@ -0,0 +1,19 @@
const config = require('./knexfile');
const knex = require('knex')(config);
(async function () {
try {
const exists = await knex.schema.hasTable(config.migrations.tableName);
if (!exists) {
await knex.migrate.latest();
await knex.seed.run();
}
} catch (error) {
process.exitCode = 1;
throw error;
} finally {
knex.destroy();
}
})();

View file

@ -1,15 +1,15 @@
const path = require('path'); const path = require('path');
const _ = require('lodash');
require('dotenv').config({ require('dotenv').config({
path: path.resolve(__dirname, '../.env') path: path.resolve(__dirname, '../.env')
}); });
// Update with your config settings.
module.exports = { module.exports = {
client: 'pg', client: 'pg',
connection: process.env.DATABASE_URL, connection: process.env.DATABASE_URL,
migrations: { migrations: {
tableName: 'migration' tableName: 'migration'
} },
wrapIdentifier: (value, origImpl) => origImpl(_.snakeCase(value))
}; };

View file

@ -4,13 +4,11 @@ exports.seed = function(knex) {
const date = new Date().toUTCString(); const date = new Date().toUTCString();
return knex('user').insert({ return knex('user').insert({
/* eslint-disable camelcase */
email: 'demo@demo.demo', email: 'demo@demo.demo',
password: bcrypt.hashSync('demo', 10), password: bcrypt.hashSync('demo', 10),
is_admin: true, isAdmin: true,
name: 'Demo Demo', name: 'Demo Demo',
created_at: date, createdAt: date,
updated_at: date updatedAt: date
/* eslint-enable camelcase */
}); });
}; };

1833
server/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -4,10 +4,11 @@
"scripts": { "scripts": {
"console": "dotenv sails console", "console": "dotenv sails console",
"custom-tests": "echo \"(No other custom tests yet.)\" && echo", "custom-tests": "echo \"(No other custom tests yet.)\" && echo",
"db:init": "cd db && node init.js",
"db:migrate": "knex migrate:latest --cwd db", "db:migrate": "knex migrate:latest --cwd db",
"db:seed": "knex seed:run --cwd db", "db:seed": "knex seed:run --cwd db",
"lint": "node_modules/@sailshq/eslint/bin/eslint.js . --max-warnings=0 --report-unused-disable-directives && echo '✔ Your .js files look good.'", "lint": "node_modules/@sailshq/eslint/bin/eslint.js . --max-warnings=0 --report-unused-disable-directives && echo '✔ Your .js files look good.'",
"start": "NODE_ENV=production node app.js", "start": "npm run db:init && NODE_ENV=production node app.js",
"start:dev": "nodemon", "start:dev": "nodemon",
"test": "npm run lint && npm run custom-tests && echo 'Done.'" "test": "npm run lint && npm run custom-tests && echo 'Done.'"
}, },
@ -23,13 +24,13 @@
"sails-hook-orm": "^2.1.1", "sails-hook-orm": "^2.1.1",
"sails-hook-sockets": "^2.0.0", "sails-hook-sockets": "^2.0.0",
"sails-postgresql": "^1.0.1", "sails-postgresql": "^1.0.1",
"sharp": "^0.23.0" "sharp": "^0.23.1"
}, },
"devDependencies": { "devDependencies": {
"@sailshq/eslint": "^4.19.3", "@sailshq/eslint": "^4.19.3",
"js-yaml": ">=3.13.1", "js-yaml": ">=3.13.1",
"mixin-deep": ">=1.3.2", "mixin-deep": ">=1.3.2",
"nodemon": "^1.19.2", "nodemon": "^1.19.3",
"set-value": ">=2.0.1" "set-value": ">=2.0.1"
}, },
"engines": { "engines": {

0
server/views/.gitkeep Normal file
View file