Merge branch 'dev' into mobile_profile_switcher

pull/6976/head
Laurent Cozic 2022-11-05 15:19:57 +00:00 committed by GitHub
commit f1b4557b2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
71 changed files with 2576 additions and 2407 deletions

View File

@ -8,6 +8,22 @@ jobs:
os: [macos-latest, ubuntu-latest, windows-2019] os: [macos-latest, ubuntu-latest, windows-2019]
steps: steps:
# Trying to fix random networking issues on Windows
# https://github.com/actions/runner-images/issues/1187#issuecomment-686735760
- name: Disable TCP/UDP offload on Windows
if: runner.os == 'Windows'
run: Disable-NetAdapterChecksumOffload -Name * -TcpIPv4 -UdpIPv4 -TcpIPv6 -UdpIPv6
- name: Disable TCP/UDP offload on Linux
if: runner.os == 'Linux'
run: sudo ethtool -K eth0 tx off rx off
- name: Disable TCP/UDP offload on macOS
if: runner.os == 'macOS'
run: |
sudo sysctl -w net.link.generic.system.hwcksum_tx=0
sudo sysctl -w net.link.generic.system.hwcksum_rx=0
# Silence apt-get update errors (for example when a module doesn't # Silence apt-get update errors (for example when a module doesn't
# exist) since otherwise it will make the whole build fails, even though # exist) since otherwise it will make the whole build fails, even though
# it might work without update. libsecret-1-dev is required for keytar - # it might work without update. libsecret-1-dev is required for keytar -
@ -48,7 +64,7 @@ jobs:
- uses: olegtarasov/get-tag@v2.1 - uses: olegtarasov/get-tag@v2.1
- uses: actions/setup-node@v2 - uses: actions/setup-node@v2
with: with:
node-version: '16' node-version: '18'
- name: Install Yarn - name: Install Yarn
run: | run: |
@ -130,7 +146,7 @@ jobs:
- uses: actions/setup-node@v2 - uses: actions/setup-node@v2
with: with:
node-version: '16' node-version: '18'
- name: Install Yarn - name: Install Yarn
run: | run: |

View File

@ -10,9 +10,9 @@
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@ephox/oxide-icons-tools": "^2.1.1", "@ephox/oxide-icons-tools": "^2.1.1",
"gulp": "^4.0.2", "gulp": "4.0.2",
"gulp-clean": "^0.4.0", "gulp-clean": "^0.4.0",
"prompts": "^2.2.1" "prompts": "^2.2.1"
}, },
"iconPackName": "Joplin" "iconPackName": "Joplin"
} }

View File

@ -2,7 +2,7 @@
# Build stage # Build stage
# ============================================================================= # =============================================================================
FROM node:16-bullseye AS builder FROM node:18-bullseye AS builder
RUN apt-get update \ RUN apt-get update \
&& apt-get install -y \ && apt-get install -y \

View File

@ -2,16 +2,6 @@
[![Donate using PayPal](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=E8JMYD2LQ8MMA&lc=GB&item_name=Joplin+Development&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted) [![Sponsor on GitHub](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/GitHub-Badge.svg)](https://github.com/sponsors/laurent22/) [![Become a patron](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Patreon-Badge.svg)](https://www.patreon.com/joplin) [![Donate using IBAN](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Donate-IBAN.svg)](https://joplinapp.org/donate/#donations) [![Donate using PayPal](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=E8JMYD2LQ8MMA&lc=GB&item_name=Joplin+Development&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted) [![Sponsor on GitHub](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/GitHub-Badge.svg)](https://github.com/sponsors/laurent22/) [![Become a patron](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Patreon-Badge.svg)](https://www.patreon.com/joplin) [![Donate using IBAN](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Donate-IBAN.svg)](https://joplinapp.org/donate/#donations)
<!-- DONATELINKS --> <!-- DONATELINKS -->
* * *
Joplin will have [its first Meetup on 30 August 2022](https://discourse.joplinapp.org/t/joplin-first-meetup-on-30-august/26808)! Come and join us at the Old Thameside Inn next to London Bridge!
* * *
🌞 Joplin participates in **Google Summer of Code 2022**! More info on [the announcement post](https://github.com/laurent22/joplin/blob/dev/readme/news/20220308-gsoc2022-start.md). 🌞
* * *
<img width="64" src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/LinuxIcons/256x256.png" align="left" /> **Joplin** is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in [Markdown format](#markdown). <img width="64" src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/LinuxIcons/256x256.png" align="left" /> **Joplin** is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in [Markdown format](#markdown).
Notes exported from Evernote [can be imported](#importing) into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported. Notes exported from Evernote [can be imported](#importing) into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported.

View File

@ -62,30 +62,30 @@
} }
}, },
"devDependencies": { "devDependencies": {
"@seiyab/eslint-plugin-react-hooks": "^4.5.1-alpha.5", "@seiyab/eslint-plugin-react-hooks": "4.5.1-alpha.5",
"@typescript-eslint/eslint-plugin": "^5.33.1", "@typescript-eslint/eslint-plugin": "5.33.1",
"@typescript-eslint/parser": "^5.33.1", "@typescript-eslint/parser": "5.33.1",
"cspell": "^5.20.0", "cspell": "5.20.0",
"eslint": "^8.22.0", "eslint": "8.22.0",
"eslint-interactive": "^10.0.0", "eslint-interactive": "10.0.0",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "2.26.0",
"eslint-plugin-promise": "^6.0.1", "eslint-plugin-promise": "6.0.1",
"eslint-plugin-react": "^7.30.1", "eslint-plugin-react": "7.30.1",
"fs-extra": "^8.1.0", "fs-extra": "8.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"gulp": "^4.0.2", "gulp": "4.0.2",
"husky": "^3.0.2", "husky": "3.1.0",
"lerna": "^3.22.1", "lerna": "3.22.1",
"lint-staged": "^9.2.1", "lint-staged": "9.5.0",
"madge": "^4.0.2", "madge": "4.0.2",
"typedoc": "^0.17.8", "typedoc": "0.17.8",
"typescript": "4.7.4" "typescript": "4.7.4"
}, },
"dependencies": { "dependencies": {
"@types/fs-extra": "^9.0.13", "@types/fs-extra": "9.0.13",
"http-server": "^0.12.3", "http-server": "0.13.0",
"node-gyp": "^8.4.1", "node-gyp": "8.4.1",
"nodemon": "^2.0.9" "nodemon": "2.0.15"
}, },
"packageManager": "yarn@3.1.1" "packageManager": "yarn@3.2.4"
} }

View File

@ -42,39 +42,39 @@
"dependencies": { "dependencies": {
"@joplin/lib": "~2.9", "@joplin/lib": "~2.9",
"@joplin/renderer": "~2.9", "@joplin/renderer": "~2.9",
"aws-sdk": "^2.588.0", "aws-sdk": "2.1043.0",
"chalk": "^4.1.0", "chalk": "4.1.2",
"compare-version": "^0.1.2", "compare-version": "0.1.2",
"fs-extra": "^5.0.0", "fs-extra": "5.0.0",
"html-entities": "^1.2.1", "html-entities": "1.4.0",
"image-type": "^3.0.0", "image-type": "3.1.0",
"keytar": "^7.0.0", "keytar": "7.7.0",
"md5": "^2.2.1", "md5": "2.3.0",
"node-rsa": "^1.1.1", "node-rsa": "1.1.1",
"open": "^7.0.4", "open": "7.4.2",
"proper-lockfile": "^2.0.1", "proper-lockfile": "2.0.1",
"read-chunk": "^2.1.0", "read-chunk": "2.1.0",
"server-destroy": "^1.0.1", "server-destroy": "1.0.1",
"sharp": "^0.26.2", "sharp": "0.31.1",
"sprintf-js": "^1.1.2", "sprintf-js": "1.1.2",
"sqlite3": "^5.0.2", "sqlite3": "5.0.2",
"string-padding": "^1.0.2", "string-padding": "1.0.2",
"strip-ansi": "^4.0.0", "strip-ansi": "4.0.0",
"tcp-port-used": "^1.0.2", "tcp-port-used": "1.0.2",
"terminal-kit": "^1.30.0", "terminal-kit": "1.49.4",
"tkwidgets": "0.5.27", "tkwidgets": "0.5.27",
"url-parse": "^1.4.7", "url-parse": "1.5.3",
"word-wrap": "^1.2.3", "word-wrap": "1.2.3",
"yargs-parser": "^7.0.0" "yargs-parser": "7.0.0"
}, },
"devDependencies": { "devDependencies": {
"@joplin/tools": "~2.9", "@joplin/tools": "~2.9",
"@types/fs-extra": "^9.0.6", "@types/fs-extra": "9.0.13",
"@types/jest": "^26.0.15", "@types/jest": "26.0.24",
"@types/node": "^14.14.6", "@types/node": "14.18.0",
"gulp": "^4.0.2", "gulp": "4.0.2",
"jest": "^26.6.3", "jest": "26.6.3",
"temp": "^0.9.1", "temp": "0.9.4",
"typescript": "^4.0.5" "typescript": "4.5.2"
} }
} }

View File

@ -12,16 +12,16 @@
], ],
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"chalk": "^4.1.0", "chalk": "4.1.2",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,18 +14,18 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
}, },
"dependencies": { "dependencies": {
"left-pad": "^1.3.0" "left-pad": "1.3.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -12,16 +12,16 @@
], ],
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"chalk": "^4.1.0", "chalk": "4.1.2",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -12,16 +12,16 @@
], ],
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"chalk": "^4.1.0", "chalk": "4.1.2",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -12,16 +12,16 @@
], ],
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"chalk": "^4.1.0", "chalk": "4.1.2",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -12,16 +12,16 @@
], ],
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"chalk": "^4.1.0", "chalk": "4.1.2",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,15 +14,15 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -14,18 +14,18 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
}, },
"dependencies": { "dependencies": {
"uslug": "^1.0.4" "uslug": "^1.0.4"
} }
} }

View File

@ -14,18 +14,18 @@
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"chalk": "^4.1.0", "chalk": "4.1.2",
"yargs": "^16.2.0" "yargs": "16.2.0"
}, },
"dependencies": { "dependencies": {
"left-pad": "^1.3.0" "left-pad": "1.3.0"
} }
} }

View File

@ -24,6 +24,19 @@ const getClientEnvironment = require('./env');
const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin'); const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');
const ForkTsCheckerWebpackPlugin = require('react-dev-utils/ForkTsCheckerWebpackPlugin'); const ForkTsCheckerWebpackPlugin = require('react-dev-utils/ForkTsCheckerWebpackPlugin');
const typescriptFormatter = require('react-dev-utils/typescriptFormatter'); const typescriptFormatter = require('react-dev-utils/typescriptFormatter');
const md5 = require('md5');
class HashGen {
update(data) {
this.data_ = data;
}
digest() {
return md5(escape(this.data_));
}
}
const postcssNormalize = require('postcss-normalize'); const postcssNormalize = require('postcss-normalize');
@ -166,6 +179,8 @@ module.exports = function(webpackEnv) {
// changing JS code would still trigger a refresh. // changing JS code would still trigger a refresh.
].filter(Boolean), ].filter(Boolean),
output: { output: {
// Needed to fix this: https://www.reddit.com/r/webdev/comments/qd14bm/node_17_currently_breaks_most_webpack/
hashFunction: HashGen,
// The build folder. // The build folder.
path: isEnvProduction ? paths.appBuild : undefined, path: isEnvProduction ? paths.appBuild : undefined,
// Add /* filename */ comments to generated require()s in the output. // Add /* filename */ comments to generated require()s in the output.

View File

@ -20,8 +20,8 @@
"babel-preset-react-app": "^9.1.1", "babel-preset-react-app": "^9.1.1",
"camelcase": "^5.3.1", "camelcase": "^5.3.1",
"case-sensitive-paths-webpack-plugin": "2.3.0", "case-sensitive-paths-webpack-plugin": "2.3.0",
"css-loader": "3.4.2", "css-loader": "3.6.0",
"dotenv": "8.2.0", "dotenv": "8.6.0",
"dotenv-expand": "5.1.0", "dotenv-expand": "5.1.0",
"file-loader": "4.3.0", "file-loader": "4.3.0",
"fs-extra": "^8.1.0", "fs-extra": "^8.1.0",
@ -38,14 +38,14 @@
"postcss-loader": "3.0.0", "postcss-loader": "3.0.0",
"postcss-normalize": "8.0.1", "postcss-normalize": "8.0.1",
"postcss-preset-env": "6.7.1", "postcss-preset-env": "6.7.1",
"postcss-safe-parser": "4.0.1", "postcss-safe-parser": "4.0.2",
"react": "^16.12.0", "react": "^16.12.0",
"react-app-polyfill": "^1.0.6", "react-app-polyfill": "^1.0.6",
"react-dev-utils": "^10.1.0", "react-dev-utils": "^10.1.0",
"react-dom": "^16.12.0", "react-dom": "^16.12.0",
"react-redux": "^5.0.7", "react-redux": "^5.0.7",
"redux": "^4.0.0", "redux": "^4.0.0",
"resolve": "1.15.0", "resolve": "1.22.1",
"resolve-url-loader": "^3.1.3", "resolve-url-loader": "^3.1.3",
"sass-loader": "8.0.2", "sass-loader": "8.0.2",
"semver": "6.3.0", "semver": "6.3.0",
@ -61,6 +61,7 @@
"devDependencies": { "devDependencies": {
"cra-build-watch": "^3.4.0", "cra-build-watch": "^3.4.0",
"fs-extra": "^6.0.1", "fs-extra": "^6.0.1",
"md5": "^2.3.0",
"react-scripts": "^3.3.1" "react-scripts": "^3.3.1"
} }
}, },
@ -3126,17 +3127,6 @@
"eslint": ">= 4.12.1" "eslint": ">= 4.12.1"
} }
}, },
"node_modules/babel-eslint/node_modules/resolve": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
"integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"dependencies": {
"path-parse": "^1.0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/babel-extract-comments": { "node_modules/babel-extract-comments": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz",
@ -3286,17 +3276,6 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/babel-plugin-macros/node_modules/resolve": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
"integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"dependencies": {
"path-parse": "^1.0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/babel-plugin-macros/node_modules/resolve-from": { "node_modules/babel-plugin-macros/node_modules/resolve-from": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@ -3984,6 +3963,15 @@
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
}, },
"node_modules/charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/chokidar": { "node_modules/chokidar": {
"version": "3.3.1", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
@ -4840,6 +4828,15 @@
"semver": "bin/semver" "semver": "bin/semver"
} }
}, },
"node_modules/crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/crypto-browserify": { "node_modules/crypto-browserify": {
"version": "3.12.0", "version": "3.12.0",
"resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
@ -4946,22 +4943,23 @@
} }
}, },
"node_modules/css-loader": { "node_modules/css-loader": {
"version": "3.4.2", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
"integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==",
"dependencies": { "dependencies": {
"camelcase": "^5.3.1", "camelcase": "^5.3.1",
"cssesc": "^3.0.0", "cssesc": "^3.0.0",
"icss-utils": "^4.1.1", "icss-utils": "^4.1.1",
"loader-utils": "^1.2.3", "loader-utils": "^1.2.3",
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",
"postcss": "^7.0.23", "postcss": "^7.0.32",
"postcss-modules-extract-imports": "^2.0.0", "postcss-modules-extract-imports": "^2.0.0",
"postcss-modules-local-by-default": "^3.0.2", "postcss-modules-local-by-default": "^3.0.2",
"postcss-modules-scope": "^2.1.1", "postcss-modules-scope": "^2.2.0",
"postcss-modules-values": "^3.0.0", "postcss-modules-values": "^3.0.0",
"postcss-value-parser": "^4.0.2", "postcss-value-parser": "^4.1.0",
"schema-utils": "^2.6.0" "schema-utils": "^2.7.0",
"semver": "^6.3.0"
}, },
"engines": { "engines": {
"node": ">= 8.9.0" "node": ">= 8.9.0"
@ -5663,11 +5661,11 @@
} }
}, },
"node_modules/dotenv": { "node_modules/dotenv": {
"version": "8.2.0", "version": "8.6.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
"engines": { "engines": {
"node": ">=8" "node": ">=10"
} }
}, },
"node_modules/dotenv-expand": { "node_modules/dotenv-expand": {
@ -6454,18 +6452,6 @@
"react-is": "^16.8.1" "react-is": "^16.8.1"
} }
}, },
"node_modules/eslint-plugin-react/node_modules/resolve": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
"integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
"dev": true,
"dependencies": {
"path-parse": "^1.0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/eslint-scope": { "node_modules/eslint-scope": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
@ -8375,10 +8361,9 @@
} }
}, },
"node_modules/is-core-module": { "node_modules/is-core-module": {
"version": "2.3.0", "version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
"integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
"dev": true,
"dependencies": { "dependencies": {
"has": "^1.0.3" "has": "^1.0.3"
}, },
@ -10662,6 +10647,17 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/md5": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
"integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
"dev": true,
"dependencies": {
"charenc": "0.0.2",
"crypt": "0.0.2",
"is-buffer": "~1.1.6"
}
},
"node_modules/md5.js": { "node_modules/md5.js": {
"version": "1.3.5", "version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@ -10913,19 +10909,6 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/meow/node_modules/resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
"dev": true,
"dependencies": {
"is-core-module": "^2.2.0",
"path-parse": "^1.0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/meow/node_modules/semver": { "node_modules/meow/node_modules/semver": {
"version": "7.3.5", "version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@ -12488,9 +12471,9 @@
} }
}, },
"node_modules/path-parse": { "node_modules/path-parse": {
"version": "1.0.6", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
}, },
"node_modules/path-to-regexp": { "node_modules/path-to-regexp": {
"version": "0.1.7", "version": "0.1.7",
@ -12528,6 +12511,11 @@
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
}, },
"node_modules/picocolors": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
},
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
@ -12645,20 +12633,19 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "7.0.26", "version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
"integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
"dependencies": { "dependencies": {
"chalk": "^2.4.2", "picocolors": "^0.2.1",
"source-map": "^0.6.1", "source-map": "^0.6.1"
"supports-color": "^6.1.0"
}, },
"engines": { "engines": {
"node": ">=6.0.0" "node": ">=6.0.0"
}, },
"funding": { "funding": {
"type": "tidelift", "type": "opencollective",
"url": "https://tidelift.com/funding/github/npm/postcss" "url": "https://opencollective.com/postcss/"
} }
}, },
"node_modules/postcss-attribute-case-insensitive": { "node_modules/postcss-attribute-case-insensitive": {
@ -13288,9 +13275,9 @@
} }
}, },
"node_modules/postcss-modules-scope": { "node_modules/postcss-modules-scope": {
"version": "2.1.1", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
"integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
"dependencies": { "dependencies": {
"postcss": "^7.0.6", "postcss": "^7.0.6",
"postcss-selector-parser": "^6.0.0" "postcss-selector-parser": "^6.0.0"
@ -13673,11 +13660,11 @@
} }
}, },
"node_modules/postcss-safe-parser": { "node_modules/postcss-safe-parser": {
"version": "4.0.1", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
"integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
"dependencies": { "dependencies": {
"postcss": "^7.0.0" "postcss": "^7.0.26"
}, },
"engines": { "engines": {
"node": ">=6.0.0" "node": ">=6.0.0"
@ -13747,9 +13734,9 @@
} }
}, },
"node_modules/postcss-value-parser": { "node_modules/postcss-value-parser": {
"version": "4.0.2", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
}, },
"node_modules/postcss-values-parser": { "node_modules/postcss-values-parser": {
"version": "2.0.1", "version": "2.0.1",
@ -13772,17 +13759,6 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/postcss/node_modules/supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/prelude-ls": { "node_modules/prelude-ls": {
"version": "1.1.2", "version": "1.1.2",
"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",
@ -16025,6 +16001,71 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/react-scripts/node_modules/css-loader": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz",
"integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==",
"dev": true,
"dependencies": {
"camelcase": "^5.3.1",
"cssesc": "^3.0.0",
"icss-utils": "^4.1.1",
"loader-utils": "^1.2.3",
"normalize-path": "^3.0.0",
"postcss": "^7.0.23",
"postcss-modules-extract-imports": "^2.0.0",
"postcss-modules-local-by-default": "^3.0.2",
"postcss-modules-scope": "^2.1.1",
"postcss-modules-values": "^3.0.0",
"postcss-value-parser": "^4.0.2",
"schema-utils": "^2.6.0"
},
"engines": {
"node": ">= 8.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^4.0.0 || ^5.0.0"
}
},
"node_modules/react-scripts/node_modules/css-loader/node_modules/postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
"dev": true,
"dependencies": {
"picocolors": "^0.2.1",
"source-map": "^0.6.1"
},
"engines": {
"node": ">=6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
}
},
"node_modules/react-scripts/node_modules/css-loader/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-scripts/node_modules/dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/react-scripts/node_modules/electron-to-chromium": { "node_modules/react-scripts/node_modules/electron-to-chromium": {
"version": "1.3.427", "version": "1.3.427",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz",
@ -16565,6 +16606,18 @@
"node": ">=6.0.0" "node": ">=6.0.0"
} }
}, },
"node_modules/react-scripts/node_modules/postcss-safe-parser": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz",
"integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==",
"dev": true,
"dependencies": {
"postcss": "^7.0.0"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/react-scripts/node_modules/postcss/node_modules/has-flag": { "node_modules/react-scripts/node_modules/postcss/node_modules/has-flag": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@ -16851,6 +16904,18 @@
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
"dev": true "dev": true
}, },
"node_modules/react-scripts/node_modules/resolve": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
"integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==",
"dev": true,
"dependencies": {
"path-parse": "^1.0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/react-scripts/node_modules/resolve-url-loader": { "node_modules/react-scripts/node_modules/resolve-url-loader": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz",
@ -18201,11 +18266,16 @@
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
}, },
"node_modules/resolve": { "node_modules/resolve": {
"version": "1.15.0", "version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dependencies": { "dependencies": {
"path-parse": "^1.0.6" "is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
@ -19765,6 +19835,17 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/svg-parser": { "node_modules/svg-parser": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz",
@ -24417,16 +24498,6 @@
"@babel/types": "^7.0.0", "@babel/types": "^7.0.0",
"eslint-visitor-keys": "^1.0.0", "eslint-visitor-keys": "^1.0.0",
"resolve": "^1.12.0" "resolve": "^1.12.0"
},
"dependencies": {
"resolve": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
"integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"requires": {
"path-parse": "^1.0.6"
}
}
} }
}, },
"babel-extract-comments": { "babel-extract-comments": {
@ -24543,14 +24614,6 @@
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
}, },
"resolve": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
"integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"requires": {
"path-parse": "^1.0.6"
}
},
"resolve-from": { "resolve-from": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@ -25148,6 +25211,12 @@
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
}, },
"charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
"dev": true
},
"chokidar": { "chokidar": {
"version": "3.3.1", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
@ -25824,6 +25893,12 @@
} }
} }
}, },
"crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
"dev": true
},
"crypto-browserify": { "crypto-browserify": {
"version": "3.12.0", "version": "3.12.0",
"resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
@ -25909,22 +25984,23 @@
} }
}, },
"css-loader": { "css-loader": {
"version": "3.4.2", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
"integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==",
"requires": { "requires": {
"camelcase": "^5.3.1", "camelcase": "^5.3.1",
"cssesc": "^3.0.0", "cssesc": "^3.0.0",
"icss-utils": "^4.1.1", "icss-utils": "^4.1.1",
"loader-utils": "^1.2.3", "loader-utils": "^1.2.3",
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",
"postcss": "^7.0.23", "postcss": "^7.0.32",
"postcss-modules-extract-imports": "^2.0.0", "postcss-modules-extract-imports": "^2.0.0",
"postcss-modules-local-by-default": "^3.0.2", "postcss-modules-local-by-default": "^3.0.2",
"postcss-modules-scope": "^2.1.1", "postcss-modules-scope": "^2.2.0",
"postcss-modules-values": "^3.0.0", "postcss-modules-values": "^3.0.0",
"postcss-value-parser": "^4.0.2", "postcss-value-parser": "^4.1.0",
"schema-utils": "^2.6.0" "schema-utils": "^2.7.0",
"semver": "^6.3.0"
}, },
"dependencies": { "dependencies": {
"normalize-path": { "normalize-path": {
@ -26490,9 +26566,9 @@
} }
}, },
"dotenv": { "dotenv": {
"version": "8.2.0", "version": "8.6.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g=="
}, },
"dotenv-expand": { "dotenv-expand": {
"version": "5.1.0", "version": "5.1.0",
@ -27156,15 +27232,6 @@
"object-assign": "^4.1.1", "object-assign": "^4.1.1",
"react-is": "^16.8.1" "react-is": "^16.8.1"
} }
},
"resolve": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
"integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
}
} }
} }
}, },
@ -28678,10 +28745,9 @@
} }
}, },
"is-core-module": { "is-core-module": {
"version": "2.3.0", "version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
"integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
"dev": true,
"requires": { "requires": {
"has": "^1.0.3" "has": "^1.0.3"
} }
@ -30480,6 +30546,17 @@
"object-visit": "^1.0.0" "object-visit": "^1.0.0"
} }
}, },
"md5": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
"integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
"dev": true,
"requires": {
"charenc": "0.0.2",
"crypt": "0.0.2",
"is-buffer": "~1.1.6"
}
},
"md5.js": { "md5.js": {
"version": "1.3.5", "version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@ -30678,16 +30755,6 @@
} }
} }
}, },
"resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
"dev": true,
"requires": {
"is-core-module": "^2.2.0",
"path-parse": "^1.0.6"
}
},
"semver": { "semver": {
"version": "7.3.5", "version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@ -31879,9 +31946,9 @@
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
}, },
"path-parse": { "path-parse": {
"version": "1.0.6", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
}, },
"path-to-regexp": { "path-to-regexp": {
"version": "0.1.7", "version": "0.1.7",
@ -31913,6 +31980,11 @@
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
}, },
"picocolors": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
},
"picomatch": { "picomatch": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
@ -31999,27 +32071,18 @@
"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
}, },
"postcss": { "postcss": {
"version": "7.0.26", "version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
"integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
"requires": { "requires": {
"chalk": "^2.4.2", "picocolors": "^0.2.1",
"source-map": "^0.6.1", "source-map": "^0.6.1"
"supports-color": "^6.1.0"
}, },
"dependencies": { "dependencies": {
"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",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"requires": {
"has-flag": "^3.0.0"
}
} }
} }
}, },
@ -32530,9 +32593,9 @@
} }
}, },
"postcss-modules-scope": { "postcss-modules-scope": {
"version": "2.1.1", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
"integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
"requires": { "requires": {
"postcss": "^7.0.6", "postcss": "^7.0.6",
"postcss-selector-parser": "^6.0.0" "postcss-selector-parser": "^6.0.0"
@ -32868,11 +32931,11 @@
} }
}, },
"postcss-safe-parser": { "postcss-safe-parser": {
"version": "4.0.1", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
"integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
"requires": { "requires": {
"postcss": "^7.0.0" "postcss": "^7.0.26"
} }
}, },
"postcss-selector-matches": { "postcss-selector-matches": {
@ -32932,9 +32995,9 @@
} }
}, },
"postcss-value-parser": { "postcss-value-parser": {
"version": "4.0.2", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
}, },
"postcss-values-parser": { "postcss-values-parser": {
"version": "2.0.1", "version": "2.0.1",
@ -34780,6 +34843,50 @@
"which": "^2.0.1" "which": "^2.0.1"
} }
}, },
"css-loader": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz",
"integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==",
"dev": true,
"requires": {
"camelcase": "^5.3.1",
"cssesc": "^3.0.0",
"icss-utils": "^4.1.1",
"loader-utils": "^1.2.3",
"normalize-path": "^3.0.0",
"postcss": "^7.0.23",
"postcss-modules-extract-imports": "^2.0.0",
"postcss-modules-local-by-default": "^3.0.2",
"postcss-modules-scope": "^2.1.1",
"postcss-modules-values": "^3.0.0",
"postcss-value-parser": "^4.0.2",
"schema-utils": "^2.6.0"
},
"dependencies": {
"postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
"dev": true,
"requires": {
"picocolors": "^0.2.1",
"source-map": "^0.6.1"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
"dev": true
},
"electron-to-chromium": { "electron-to-chromium": {
"version": "1.3.427", "version": "1.3.427",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz",
@ -35217,6 +35324,15 @@
"postcss-selector-not": "^4.0.0" "postcss-selector-not": "^4.0.0"
} }
}, },
"postcss-safe-parser": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz",
"integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==",
"dev": true,
"requires": {
"postcss": "^7.0.0"
}
},
"react-dev-utils": { "react-dev-utils": {
"version": "10.2.1", "version": "10.2.1",
"resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz",
@ -35424,6 +35540,15 @@
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
"dev": true "dev": true
}, },
"resolve": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
"integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
}
},
"resolve-url-loader": { "resolve-url-loader": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz",
@ -36451,11 +36576,13 @@
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
}, },
"resolve": { "resolve": {
"version": "1.15.0", "version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"requires": { "requires": {
"path-parse": "^1.0.6" "is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
} }
}, },
"resolve-cwd": { "resolve-cwd": {
@ -37686,6 +37813,11 @@
"has-flag": "^3.0.0" "has-flag": "^3.0.0"
} }
}, },
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
},
"svg-parser": { "svg-parser": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz",

View File

@ -13,13 +13,13 @@
"babel-loader": "8.0.6", "babel-loader": "8.0.6",
"babel-plugin-named-asset-import": "^0.3.6", "babel-plugin-named-asset-import": "^0.3.6",
"babel-preset-react-app": "^9.1.1", "babel-preset-react-app": "^9.1.1",
"camelcase": "^5.3.1", "camelcase": "5.3.1",
"case-sensitive-paths-webpack-plugin": "2.3.0", "case-sensitive-paths-webpack-plugin": "2.3.0",
"css-loader": "3.4.2", "css-loader": "3.6.0",
"dotenv": "8.2.0", "dotenv": "8.6.0",
"dotenv-expand": "5.1.0", "dotenv-expand": "5.1.0",
"file-loader": "4.3.0", "file-loader": "4.3.0",
"fs-extra": "^8.1.0", "fs-extra": "8.1.0",
"html-webpack-plugin": "4.0.0-beta.11", "html-webpack-plugin": "4.0.0-beta.11",
"identity-obj-proxy": "3.0.0", "identity-obj-proxy": "3.0.0",
"jest": "24.9.0", "jest": "24.9.0",
@ -33,14 +33,14 @@
"postcss-loader": "3.0.0", "postcss-loader": "3.0.0",
"postcss-normalize": "8.0.1", "postcss-normalize": "8.0.1",
"postcss-preset-env": "6.7.1", "postcss-preset-env": "6.7.1",
"postcss-safe-parser": "4.0.1", "postcss-safe-parser": "4.0.2",
"react": "^16.12.0", "react": "^16.12.0",
"react-app-polyfill": "^1.0.6", "react-app-polyfill": "^1.0.6",
"react-dev-utils": "^10.1.0", "react-dev-utils": "^10.1.0",
"react-dom": "^16.12.0", "react-dom": "^16.12.0",
"react-redux": "^5.0.7", "react-redux": "^5.0.7",
"redux": "^4.0.0", "redux": "4.1.2",
"resolve": "1.15.0", "resolve": "1.22.1",
"resolve-url-loader": "^3.1.3", "resolve-url-loader": "^3.1.3",
"sass-loader": "8.0.2", "sass-loader": "8.0.2",
"semver": "6.3.0", "semver": "6.3.0",
@ -55,7 +55,8 @@
}, },
"scripts": { "scripts": {
"start": "node scripts/start.js", "start": "node scripts/start.js",
"build": "node scripts/build.js SKIP_PREFLIGHT_CHECK", "build": "echo 'Clipper build is disabled due to disabled due to ERR_OSSL_EVP_UNSUPPORTED error on CI'",
"build_DISABLED": "node scripts/build.js SKIP_PREFLIGHT_CHECK",
"test": "node scripts/test.js --env=jsdom", "test": "node scripts/test.js --env=jsdom",
"watch": "cra-build-watch", "watch": "cra-build-watch",
"postinstall": "node postinstall.js && npm run build" "postinstall": "node postinstall.js && npm run build"
@ -63,6 +64,7 @@
"devDependencies": { "devDependencies": {
"cra-build-watch": "^3.4.0", "cra-build-watch": "^3.4.0",
"fs-extra": "^6.0.1", "fs-extra": "^6.0.1",
"md5": "^2.3.0",
"react-scripts": "^3.3.1" "react-scripts": "^3.3.1"
}, },
"browserslist": [ "browserslist": [
@ -124,4 +126,4 @@
"react-app" "react-app"
] ]
} }
} }

View File

@ -107,26 +107,26 @@
"homepage": "https://github.com/laurent22/joplin#readme", "homepage": "https://github.com/laurent22/joplin#readme",
"devDependencies": { "devDependencies": {
"@joplin/tools": "~2.9", "@joplin/tools": "~2.9",
"@testing-library/react-hooks": "^3.4.2", "@testing-library/react-hooks": "8.0.1",
"@types/jest": "^26.0.15", "@types/jest": "26.0.24",
"@types/node": "^14.14.6", "@types/node": "14.18.0",
"@types/react": "16.9.55", "@types/react": "16.14.34",
"@types/react-redux": "7.1.24", "@types/react-redux": "7.1.24",
"@types/styled-components": "5.1.4", "@types/styled-components": "5.1.26",
"ajv": "^6.5.0", "ajv": "6.12.6",
"app-builder-bin": "^1.9.11", "app-builder-bin": "1.11.6",
"babel-cli": "^6.26.0", "babel-cli": "6.26.0",
"babel-preset-react": "^6.24.1", "babel-preset-react": "6.24.1",
"electron": "19.0.10", "electron": "19.1.4",
"electron-builder": "^23.0.3", "electron-builder": "23.0.8",
"electron-notarize": "^1.2.1", "electron-notarize": "1.2.1",
"electron-rebuild": "^3.2.7", "electron-rebuild": "3.2.7",
"glob": "^7.1.6", "glob": "7.2.0",
"gulp": "^4.0.2", "gulp": "4.0.2",
"jest": "^26.6.3", "jest": "26.6.3",
"js-sha512": "^0.8.0", "js-sha512": "0.8.0",
"nan": "2.14.2", "nan": "2.17.0",
"react-test-renderer": "^16.14.0", "react-test-renderer": "16.14.0",
"typescript": "4.0.5" "typescript": "4.0.5"
}, },
"optionalDependencies": { "optionalDependencies": {
@ -135,47 +135,47 @@
"7zip-bin-win": "^2.1.1" "7zip-bin-win": "^2.1.1"
}, },
"dependencies": { "dependencies": {
"@electron/remote": "^2.0.1", "@electron/remote": "2.0.8",
"@fortawesome/fontawesome-free": "^5.13.0", "@fortawesome/fontawesome-free": "5.15.4",
"@joeattardi/emoji-button": "^4.6.0", "@joeattardi/emoji-button": "4.6.4",
"@joplin/lib": "~2.9", "@joplin/lib": "~2.9",
"@joplin/pdf-viewer": "~2.9", "@joplin/pdf-viewer": "~2.9",
"@joplin/renderer": "~2.9", "@joplin/renderer": "~2.9",
"async-mutex": "^0.1.3", "async-mutex": "0.4.0",
"codemirror": "^5.56.0", "codemirror": "5.64.0",
"color": "^3.1.2", "color": "3.2.1",
"compare-versions": "^3.2.1", "compare-versions": "3.6.0",
"countable": "^3.0.1", "countable": "3.0.1",
"debounce": "^1.2.0", "debounce": "1.2.1",
"electron-window-state": "^5.0.3", "electron-window-state": "5.0.3",
"formatcoords": "^1.1.3", "formatcoords": "1.1.3",
"fs-extra": "10.0.0", "fs-extra": "10.0.0",
"highlight.js": "^10.2.1", "highlight.js": "10.7.3",
"immer": "^7.0.5", "immer": "7.0.15",
"keytar": "^7.0.0", "keytar": "7.7.0",
"mark.js": "^8.11.1", "mark.js": "8.11.1",
"md5": "^2.2.1", "md5": "2.3.0",
"moment": "^2.22.2", "moment": "2.29.1",
"node-fetch": "^1.7.3", "node-fetch": "1.7.3",
"node-notifier": "^8.0.0", "node-notifier": "8.0.2",
"node-rsa": "^1.1.1", "node-rsa": "1.1.1",
"pretty-bytes": "^5.3.0", "pretty-bytes": "5.6.0",
"re-resizable": "^6.5.4", "re-resizable": "6.9.1",
"react": "16.13.1", "react": "16.14.0",
"react-datetime": "^2.14.0", "react-datetime": "2.16.3",
"react-dom": "16.9.0", "react-dom": "16.14.0",
"react-redux": "5.0.7", "react-redux": "5.1.2",
"react-select": "^2.4.3", "react-select": "2.4.4",
"react-toggle-button": "^2.2.0", "react-toggle-button": "2.2.0",
"react-tooltip": "^3.10.0", "react-tooltip": "3.11.6",
"redux": "3.7.2", "redux": "3.7.2",
"reselect": "^4.0.0", "reselect": "4.1.5",
"roboto-fontface": "^0.10.0", "roboto-fontface": "0.10.0",
"smalltalk": "^2.5.1", "smalltalk": "2.5.1",
"sqlite3": "^5.0.2", "sqlite3": "5.0.2",
"styled-components": "5.1.1", "styled-components": "5.3.6",
"styled-system": "5.1.5", "styled-system": "5.1.5",
"taboverride": "^4.0.3", "taboverride": "4.0.3",
"tinymce": "^5.2.0" "tinymce": "5.10.2"
} }
} }

View File

@ -225,20 +225,20 @@ PODS:
- React-Core - React-Core
- react-native-document-picker (4.3.0): - react-native-document-picker (4.3.0):
- React-Core - React-Core
- react-native-geolocation (2.0.2): - react-native-geolocation (3.0.3):
- React - React-Core
- react-native-get-random-values (1.7.1): - react-native-get-random-values (1.7.1):
- React-Core - React-Core
- react-native-image-picker (4.10.0): - react-native-image-picker (4.10.0):
- React-Core - React-Core
- react-native-image-resizer (1.4.5): - react-native-image-resizer (1.4.5):
- React-Core - React-Core
- react-native-netinfo (6.2.1): - react-native-netinfo (9.3.6):
- React-Core - React-Core
- react-native-rsa-native (2.0.4): - react-native-rsa-native (2.0.4):
- React - React
- react-native-slider (3.0.3): - react-native-slider (4.3.3):
- React - React-Core
- react-native-sqlite-storage (5.0.0): - react-native-sqlite-storage (5.0.0):
- React - React
- react-native-version-info (1.1.1): - react-native-version-info (1.1.1):
@ -316,7 +316,7 @@ PODS:
- React-Core - React-Core
- RNCPushNotificationIOS (1.10.1): - RNCPushNotificationIOS (1.10.1):
- React-Core - React-Core
- RNDateTimePicker (3.5.2): - RNDateTimePicker (6.5.4):
- React-Core - React-Core
- RNFileViewer (2.1.4): - RNFileViewer (2.1.4):
- React-Core - React-Core
@ -531,13 +531,13 @@ SPEC CHECKSUMS:
react-native-alarm-notification: 4817a2a0d7cc2ed2acc97337ebcdf9ae2a69c9d5 react-native-alarm-notification: 4817a2a0d7cc2ed2acc97337ebcdf9ae2a69c9d5
react-native-camera: b8cc03e2feec0c04403d0998e37cf519d8fd4c6f react-native-camera: b8cc03e2feec0c04403d0998e37cf519d8fd4c6f
react-native-document-picker: 20f652c2402d3ddc81f396d8167c3bd978add4a2 react-native-document-picker: 20f652c2402d3ddc81f396d8167c3bd978add4a2
react-native-geolocation: c956aeb136625c23e0dce0467664af2c437888c9 react-native-geolocation: 2b4052c14edff18ba402795f4ce0f2a093c4ba3e
react-native-get-random-values: 2c4ff6b44cb71291dabe9a8ae87d3877dcf387da react-native-get-random-values: 2c4ff6b44cb71291dabe9a8ae87d3877dcf387da
react-native-image-picker: 4bc9ed38c8be255b515d8c88babbaf74973f91a8 react-native-image-picker: 4bc9ed38c8be255b515d8c88babbaf74973f91a8
react-native-image-resizer: d9fb629a867335bdc13230ac2a58702bb8c8828f react-native-image-resizer: d9fb629a867335bdc13230ac2a58702bb8c8828f
react-native-netinfo: 3d3769f0d65de15c83a9bf1346f8be71de5a24bf react-native-netinfo: f80db8cac2151405633324cb645c60af098ee461
react-native-rsa-native: 1f6bba06dd02f0e652a66a384c75c270f7a0062f react-native-rsa-native: 1f6bba06dd02f0e652a66a384c75c270f7a0062f
react-native-slider: e99fc201cefe81270fc9d81714a7a0f5e566b168 react-native-slider: 7d19220da2f2ae7cbb9aa80127cb73c597fa221f
react-native-sqlite-storage: 418ef4afc5e6df6ce3574c4617e5f0b65cffde55 react-native-sqlite-storage: 418ef4afc5e6df6ce3574c4617e5f0b65cffde55
react-native-version-info: a106f23009ac0db4ee00de39574eb546682579b9 react-native-version-info: a106f23009ac0db4ee00de39574eb546682579b9
react-native-webview: 0aa2cde4ee7e3e1c5fffdf64dbce9c709aa18155 react-native-webview: 0aa2cde4ee7e3e1c5fffdf64dbce9c709aa18155
@ -556,7 +556,7 @@ SPEC CHECKSUMS:
rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495 RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
RNCPushNotificationIOS: 87b8d16d3ede4532745e05b03c42cff33a36cc45 RNCPushNotificationIOS: 87b8d16d3ede4532745e05b03c42cff33a36cc45
RNDateTimePicker: 7658208086d86d09e1627b5c34ba0cf237c60140 RNDateTimePicker: 93b9659fbd0fd91a4fb568bf8f5c00b0175aa1ba
RNFileViewer: 83cc066ad795b1f986791d03b56fe0ee14b6a69f RNFileViewer: 83cc066ad795b1f986791d03b56fe0ee14b6a69f
RNFS: 3ab21fa6c56d65566d1fb26c2228e2b6132e5e32 RNFS: 3ab21fa6c56d65566d1fb26c2228e2b6132e5e32
RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93

View File

@ -21,92 +21,92 @@
"@joplin/lib": "~2.9", "@joplin/lib": "~2.9",
"@joplin/react-native-saf-x": "~2.9", "@joplin/react-native-saf-x": "~2.9",
"@joplin/renderer": "~2.9", "@joplin/renderer": "~2.9",
"@react-native-community/clipboard": "^1.5.0", "@react-native-community/clipboard": "1.5.1",
"@react-native-community/datetimepicker": "^3.0.3", "@react-native-community/datetimepicker": "6.5.4",
"@react-native-community/geolocation": "^2.0.2", "@react-native-community/geolocation": "3.0.3",
"@react-native-community/netinfo": "^6.0.0", "@react-native-community/netinfo": "9.3.6",
"@react-native-community/push-notification-ios": "^1.6.0", "@react-native-community/push-notification-ios": "1.10.1",
"@react-native-community/slider": "^3.0.3", "@react-native-community/slider": "4.3.3",
"assert-browserify": "^2.0.0", "assert-browserify": "2.0.0",
"buffer": "^5.0.8", "buffer": "5.7.1",
"constants-browserify": "^1.0.0", "constants-browserify": "1.0.0",
"crypto-browserify": "^3.12.0", "crypto-browserify": "3.12.0",
"events": "^3.2.0", "events": "3.3.0",
"joplin-rn-alarm-notification": "^1.0.5", "joplin-rn-alarm-notification": "1.0.5",
"jsc-android": "241213.1.0", "jsc-android": "241213.1.0",
"md5": "^2.2.1", "md5": "2.3.0",
"prop-types": "^15.6.0", "prop-types": "15.7.2",
"punycode": "^2.1.1", "punycode": "2.1.1",
"react": "17.0.2", "react": "17.0.2",
"react-native": "0.66.1", "react-native": "0.66.1",
"react-native-action-button": "^2.8.5", "react-native-action-button": "2.8.5",
"react-native-camera": "^3.40.0", "react-native-camera": "3.44.3",
"react-native-dialogbox": "^0.6.10", "react-native-dialogbox": "0.6.10",
"react-native-document-picker": "^4.0.0", "react-native-document-picker": "4.3.0",
"react-native-dropdownalert": "^3.1.2", "react-native-dropdownalert": "3.11.0",
"react-native-file-viewer": "^2.1.4", "react-native-file-viewer": "2.1.4",
"react-native-fs": "^2.16.6", "react-native-fs": "2.18.0",
"react-native-get-random-values": "^1.7.0", "react-native-get-random-values": "1.7.1",
"react-native-image-picker": "^4.10.0", "react-native-image-picker": "4.10.0",
"react-native-image-resizer": "^1.3.0", "react-native-image-resizer": "1.4.5",
"react-native-modal-datetime-picker": "^9.0.0", "react-native-modal-datetime-picker": "9.2.3",
"react-native-popup-menu": "^0.15.13", "react-native-popup-menu": "0.15.13",
"react-native-quick-actions": "^0.3.13", "react-native-quick-actions": "0.3.13",
"react-native-rsa-native": "^2.0.4", "react-native-rsa-native": "2.0.4",
"react-native-securerandom": "^1.0.0-rc.0", "react-native-securerandom": "1.0.0",
"react-native-share": "^7.2.1", "react-native-share": "7.3.2",
"react-native-side-menu-updated": "^1.3.2", "react-native-side-menu-updated": "1.3.2",
"react-native-sqlite-storage": "^5.0.0", "react-native-sqlite-storage": "5.0.0",
"react-native-url-polyfill": "^1.3.0", "react-native-url-polyfill": "1.3.0",
"react-native-vector-icons": "^7.1.0", "react-native-vector-icons": "7.1.0",
"react-native-version-info": "^1.1.0", "react-native-version-info": "1.1.1",
"react-native-webview": "^10.9.2", "react-native-webview": "10.10.2",
"react-redux": "5.0.7", "react-redux": "5.1.2",
"redux": "4.0.0", "redux": "4.0.0",
"rn-fetch-blob": "^0.12.0", "rn-fetch-blob": "0.12.0",
"stream": "0.0.2", "stream": "0.0.2",
"stream-browserify": "^3.0.0", "stream-browserify": "3.0.0",
"string-natural-compare": "^2.0.2", "string-natural-compare": "2.0.3",
"timers": "^0.1.1", "timers": "0.1.1",
"url": "^0.11.0" "url": "0.11.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.12.9", "@babel/core": "7.16.0",
"@babel/runtime": "^7.12.5", "@babel/runtime": "7.16.3",
"@codemirror/commands": "^6.0.0", "@codemirror/commands": "6.0.0",
"@codemirror/lang-cpp": "^6.0.0", "@codemirror/lang-cpp": "6.0.1",
"@codemirror/lang-html": "^6.0.0", "@codemirror/lang-html": "6.0.0",
"@codemirror/lang-java": "^6.0.0", "@codemirror/lang-java": "6.0.0",
"@codemirror/lang-javascript": "^6.0.0", "@codemirror/lang-javascript": "6.0.0",
"@codemirror/lang-markdown": "^6.0.0", "@codemirror/lang-markdown": "6.0.0",
"@codemirror/lang-php": "^6.0.0", "@codemirror/lang-php": "6.0.0",
"@codemirror/lang-rust": "^6.0.0", "@codemirror/lang-rust": "6.0.0",
"@codemirror/language": "^6.0.0", "@codemirror/language": "6.0.0",
"@codemirror/legacy-modes": "^6.1.0", "@codemirror/legacy-modes": "6.1.0",
"@codemirror/search": "^6.0.0", "@codemirror/search": "6.0.0",
"@codemirror/state": "^6.0.0", "@codemirror/state": "6.0.0",
"@codemirror/view": "^6.0.0", "@codemirror/view": "6.0.0",
"@joplin/tools": "~2.9", "@joplin/tools": "~2.9",
"@lezer/highlight": "^1.0.0", "@lezer/highlight": "1.0.0",
"@types/fs-extra": "^9.0.13", "@types/fs-extra": "9.0.13",
"@types/jest": "^28.1.3", "@types/jest": "28.1.5",
"@types/react-native": "^0.64.4", "@types/react-native": "0.64.19",
"@types/react-redux": "^7.1.24", "@types/react-redux": "7.1.24",
"babel-plugin-module-resolver": "^4.1.0", "babel-plugin-module-resolver": "4.1.0",
"execa": "^4.0.0", "execa": "4.1.0",
"fs-extra": "^8.1.0", "fs-extra": "8.1.0",
"gulp": "^4.0.2", "gulp": "4.0.2",
"jest": "^28.1.1", "jest": "28.1.2",
"jest-environment-jsdom": "^28.1.3", "jest-environment-jsdom": "28.1.3",
"jetifier": "^1.6.5", "jetifier": "1.6.8",
"jsdom": "^20.0.0", "jsdom": "20.0.0",
"metro-react-native-babel-preset": "^0.66.2", "metro-react-native-babel-preset": "0.66.2",
"nodemon": "^2.0.12", "nodemon": "2.0.15",
"ts-jest": "^28.0.5", "ts-jest": "28.0.5",
"ts-loader": "^9.3.1", "ts-loader": "9.3.1",
"ts-node": "^10.9.1", "ts-node": "10.9.1",
"typescript": "^4.7.4", "typescript": "4.7.4",
"uglify-js": "^3.13.10", "uglify-js": "3.14.4",
"webpack": "^5.74.0" "webpack": "5.74.0"
} }
} }

View File

@ -39,23 +39,23 @@
"prepare": "npm run build" "prepare": "npm run build"
}, },
"dependencies": { "dependencies": {
"domelementtype": "^2.0.1", "domelementtype": "2.2.0",
"domhandler": "3.0.0", "domhandler": "3.3.0",
"domutils": "^2.0.0", "domutils": "2.8.0",
"entities": "^2.0.0" "entities": "2.2.0"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^25.1.3", "@types/jest": "25.2.3",
"@types/node": "^13.1.1", "@types/node": "13.13.52",
"@typescript-eslint/eslint-plugin": "^1.13.0", "@typescript-eslint/eslint-plugin": "1.13.0",
"@typescript-eslint/parser": "^1.13.0", "@typescript-eslint/parser": "1.13.0",
"coveralls": "^3.0.1", "coveralls": "3.1.1",
"eslint": "^6.0.0", "eslint": "6.8.0",
"eslint-config-prettier": "^6.0.0", "eslint-config-prettier": "6.15.0",
"jest": "^26.6.3", "jest": "26.6.3",
"prettier": "^1.18.2", "prettier": "1.19.1",
"ts-jest": "^24.0.2", "ts-jest": "24.3.0",
"typescript": "3.8.2" "typescript": "3.9.10"
}, },
"jest": { "jest": {
"preset": "ts-jest", "preset": "ts-jest",

View File

@ -15,8 +15,8 @@
"README.md" "README.md"
], ],
"devDependencies": { "devDependencies": {
"standard": "^8.6.0", "standard": "8.6.0",
"tap": "^10.5.1" "tap": "10.7.3"
}, },
"gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14" "gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14"
} }

View File

@ -8,10 +8,10 @@
}, },
"dependencies": { "dependencies": {
"node-emoji": "1.11.0", "node-emoji": "1.11.0",
"unorm": ">= 1.0.0" "unorm": "1.6.0"
}, },
"devDependencies": { "devDependencies": {
"should": ">= 0.2.1" "should": "13.2.3"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -23,13 +23,13 @@
"npm": ">= 4.0.0" "npm": ">= 4.0.0"
}, },
"dependencies": { "dependencies": {
"chalk": "^2.1.0", "chalk": "2.4.2",
"slugify": "^1.4.6", "slugify": "1.6.3",
"yeoman-generator": "^2.0.1", "yeoman-generator": "2.0.5",
"yosay": "^2.0.1" "yosay": "2.0.2"
}, },
"devDependencies": { "devDependencies": {
"jest": "^26.6.3" "jest": "26.6.3"
}, },
"repository": "https://github.com/laurent22/generator-joplin", "repository": "https://github.com/laurent22/generator-joplin",
"license": "MIT", "license": "MIT",

View File

@ -15,13 +15,13 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@joplin/fork-htmlparser2": "^4.1.41", "@joplin/fork-htmlparser2": "^4.1.41",
"css": "^3.0.0", "css": "3.0.0",
"datauri": "^4.1.0", "datauri": "4.1.0",
"fs-extra": "^10.0.0", "fs-extra": "10.0.0",
"html-entities": "^1.2.1" "html-entities": "1.4.0"
}, },
"devDependencies": { "devDependencies": {
"@types/fs-extra": "^9.0.6" "@types/fs-extra": "9.0.13"
}, },
"gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14" "gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14"
} }

View File

@ -16,20 +16,20 @@
"test-ci": "yarn test" "test-ci": "yarn test"
}, },
"devDependencies": { "devDependencies": {
"@types/fs-extra": "^9.0.6", "@types/fs-extra": "9.0.13",
"@types/jest": "^26.0.15", "@types/jest": "26.0.24",
"@types/js-yaml": "^4.0.2", "@types/js-yaml": "4.0.5",
"@types/node": "^14.14.6", "@types/node": "14.18.0",
"@types/node-rsa": "^1.1.1", "@types/node-rsa": "1.1.1",
"@types/react": "^17.0.20", "@types/react": "17.0.37",
"clean-html": "^1.5.0", "clean-html": "1.5.0",
"jest": "26.6.3", "jest": "26.6.3",
"sharp": "^0.26.2", "sharp": "0.31.1",
"typescript": "^4.0.5" "typescript": "4.5.2"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.34.0", "@aws-sdk/client-s3": "3.44.0",
"@aws-sdk/s3-request-presigner": "^3.34.0", "@aws-sdk/s3-request-presigner": "3.44.0",
"@joplin/fork-htmlparser2": "^4.1.41", "@joplin/fork-htmlparser2": "^4.1.41",
"@joplin/fork-sax": "^1.2.45", "@joplin/fork-sax": "^1.2.45",
"@joplin/fork-uslug": "^1.0.6", "@joplin/fork-uslug": "^1.0.6",
@ -37,60 +37,60 @@
"@joplin/renderer": "^2.9.1", "@joplin/renderer": "^2.9.1",
"@joplin/turndown": "^4.0.63", "@joplin/turndown": "^4.0.63",
"@joplin/turndown-plugin-gfm": "^1.0.45", "@joplin/turndown-plugin-gfm": "^1.0.45",
"@types/nanoid": "^3.0.0", "@types/nanoid": "3.0.0",
"async-mutex": "^0.1.3", "async-mutex": "0.4.0",
"base-64": "^0.1.0", "base-64": "0.1.0",
"base64-stream": "^1.0.0", "base64-stream": "1.0.0",
"builtin-modules": "^3.1.0", "builtin-modules": "3.2.0",
"chokidar": "^3.4.3", "chokidar": "3.5.2",
"color": "3.1.2", "color": "3.2.1",
"compare-versions": "^3.6.0", "compare-versions": "3.6.0",
"css": "^3.0.0", "css": "3.0.0",
"diff-match-patch": "^1.0.4", "diff-match-patch": "1.0.5",
"es6-promise-pool": "^2.5.0", "es6-promise-pool": "2.5.0",
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "3.1.3",
"fast-xml-parser": "3.21.1", "fast-xml-parser": "3.21.1",
"follow-redirects": "^1.2.4", "follow-redirects": "1.14.5",
"form-data": "^2.1.4", "form-data": "2.5.1",
"fs-extra": "^5.0.0", "fs-extra": "5.0.0",
"hpagent": "^1.0.0", "hpagent": "1.0.0",
"html-entities": "^1.2.1", "html-entities": "1.4.0",
"html-minifier": "^3.5.15", "html-minifier": "3.5.21",
"image-data-uri": "^2.0.0", "image-data-uri": "2.0.1",
"image-type": "^3.0.0", "image-type": "3.1.0",
"immer": "^7.0.14", "immer": "7.0.15",
"js-yaml": "^4.1.0", "js-yaml": "4.1.0",
"levenshtein": "^1.0.5", "levenshtein": "1.0.5",
"markdown-it": "^10.0.0", "markdown-it": "10.0.0",
"md5": "^2.2.1", "md5": "2.3.0",
"md5-file": "^4.0.0", "md5-file": "4.0.0",
"moment": "^2.29.1", "moment": "2.29.1",
"multiparty": "^4.2.1", "multiparty": "4.2.2",
"mustache": "^4.0.1", "mustache": "4.2.0",
"nanoid": "^3.1.12", "nanoid": "3.1.30",
"node-fetch": "^1.7.1", "node-fetch": "1.7.3",
"node-notifier": "^8.0.0", "node-notifier": "8.0.2",
"node-persist": "^2.1.0", "node-persist": "2.1.0",
"node-rsa": "^1.1.1", "node-rsa": "1.1.1",
"promise": "^7.1.1", "promise": "7.3.1",
"query-string": "4.3.4", "query-string": "4.3.4",
"re-reselect": "^4.0.0", "re-reselect": "4.0.0",
"read-chunk": "^2.1.0", "read-chunk": "2.1.0",
"redux": "^3.7.2", "redux": "3.7.2",
"relative": "^3.0.2", "relative": "3.0.2",
"reselect": "^4.0.0", "reselect": "4.1.5",
"server-destroy": "^1.0.1", "server-destroy": "1.0.1",
"sprintf-js": "^1.1.2", "sprintf-js": "1.1.2",
"sqlite3": "^5.0.2", "sqlite3": "5.0.2",
"string-padding": "^1.0.2", "string-padding": "1.0.2",
"string-to-stream": "^1.1.0", "string-to-stream": "1.1.1",
"tar": "^4.4.10", "tar": "4.4.19",
"tcp-port-used": "^0.1.2", "tcp-port-used": "0.1.2",
"uglifycss": "0.0.29", "uglifycss": "0.0.29",
"url-parse": "^1.4.7", "url-parse": "1.5.3",
"uuid": "^3.0.1", "uuid": "3.4.0",
"word-wrap": "^1.2.3", "word-wrap": "1.2.3",
"xml2js": "^0.4.19" "xml2js": "0.4.23"
}, },
"gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14" "gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14"
} }

View File

@ -19,31 +19,31 @@
"author": "Joplin", "author": "Joplin",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/jest": "^28.1.6", "@types/jest": "28.1.6",
"@types/pdfjs-dist": "^2.10.378", "@types/pdfjs-dist": "2.10.378",
"@types/react": "16.9.55", "@types/react": "16.14.34",
"@types/react-dom": "^16.9.0", "@types/react-dom": "16.9.16",
"@types/styled-components": "^5.1.25", "@types/styled-components": "5.1.25",
"babel-jest": "^28.1.3", "babel-jest": "28.1.3",
"css-loader": "^6.7.1", "css-loader": "6.7.1",
"jest": "^28.1.3", "jest": "28.1.3",
"jest-environment-jsdom": "^28.1.3", "jest-environment-jsdom": "28.1.3",
"style-loader": "^3.3.1", "style-loader": "3.3.1",
"ts-jest": "^28.0.7", "ts-jest": "28.0.7",
"ts-loader": "^9.3.0", "ts-loader": "9.3.1",
"typescript": "^4.0.5", "typescript": "4.5.2",
"webpack": "^5.73.0", "webpack": "5.74.0",
"webpack-cli": "^4.10.0" "webpack-cli": "4.10.0"
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.1.2", "@fortawesome/fontawesome-svg-core": "6.1.2",
"@fortawesome/free-solid-svg-icons": "^6.1.2", "@fortawesome/free-solid-svg-icons": "6.1.2",
"@fortawesome/react-fontawesome": "^0.2.0", "@fortawesome/react-fontawesome": "0.2.0",
"@joplin/lib": "~2.9", "@joplin/lib": "~2.9",
"async-mutex": "^0.4.0", "async-mutex": "0.4.0",
"pdfjs-dist": "^2.14.305", "pdfjs-dist": "2.14.305",
"react": "16.13.1", "react": "16.14.0",
"react-dom": "16.9.0", "react-dom": "16.14.0",
"styled-components": "^5.3.5" "styled-components": "5.3.5"
} }
} }

View File

@ -29,12 +29,15 @@ describe('pdfData', () => {
expect(pdf.pageCount).toBe(1); expect(pdf.pageCount).toBe(1);
}); });
test('Should throw error on invalid file', async () => { // Disable test because it throws warnings in console
const pdf = new PdfDocument(document); // https://github.com/mozilla/pdf.js/issues/12443
await expect(async () => {
await pdf.loadDoc(''); // test('Should throw error on invalid file', async () => {
}).rejects.toThrowError(); // const pdf = new PdfDocument(document);
}); // await expect(async () => {
// await pdf.loadDoc('');
// }).rejects.toThrowError();
// });
test('Should get correct page size', async () => { test('Should get correct page size', async () => {
const file = await loadFile(pdfFilePath1); const file = await loadFile(pdfFilePath1);

View File

@ -20,21 +20,21 @@
"dependencies": { "dependencies": {
"@joplin/lib": "^2.9.1", "@joplin/lib": "^2.9.1",
"@joplin/tools": "^2.9.1", "@joplin/tools": "^2.9.1",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"gh-release-assets": "^2.0.0", "gh-release-assets": "2.0.0",
"node-fetch": "^2.6.1", "node-fetch": "2.6.6",
"source-map-support": "^0.5.21", "source-map-support": "0.5.21",
"yargs": "^16.0.3" "yargs": "16.2.0"
}, },
"devDependencies": { "devDependencies": {
"@types/fs-extra": "^9.0.6", "@types/fs-extra": "9.0.13",
"@types/jest": "^26.0.15", "@types/jest": "26.0.24",
"@types/node": "^14.14.6", "@types/node": "14.18.0",
"jest": "^26.6.3", "jest": "26.6.3",
"source-map-loader": "^3.0.0", "source-map-loader": "3.0.0",
"typescript": "4.1.3", "typescript": "4.1.3",
"webpack": "^5.65.0", "webpack": "5.65.0",
"webpack-cli": "^4.9.1" "webpack-cli": "4.9.1"
}, },
"gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14" "gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14"
} }

View File

@ -15,16 +15,16 @@
], ],
"devDependencies": { "devDependencies": {
"@types/node": "^14.0.14", "@types/node": "^14.0.14",
"chalk": "^4.1.0", "chalk": "4.1.2",
"copy-webpack-plugin": "^6.1.0", "copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1", "fs-extra": "9.1.0",
"glob": "^7.1.6", "glob": "7.2.0",
"on-build-webpack": "^0.1.0", "on-build-webpack": "^0.1.0",
"tar": "^6.0.5", "tar": "6.1.11",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"typescript": "^3.9.3", "typescript": "^3.9.3",
"webpack": "^4.43.0", "webpack": "^4.43.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^3.3.11",
"yargs": "^16.2.0" "yargs": "16.2.0"
} }
} }

View File

@ -39,12 +39,12 @@
"access": "public" "access": "public"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.12.9", "@babel/core": "7.16.0",
"@types/react": "^16.9.55", "@types/react": "16.14.21",
"@types/react-native": "^0.64.4", "@types/react-native": "0.64.19",
"react": "17.0.2", "react": "17.0.2",
"react-native": "0.66.1", "react-native": "0.66.1",
"typescript": "^4.0.5" "typescript": "4.5.2"
}, },
"peerDependencies": { "peerDependencies": {
"react": "*", "react": "*",

View File

@ -18,35 +18,35 @@
"author": "", "author": "",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/jest": "^26.0.15", "@types/jest": "26.0.24",
"@types/node": "^14.14.6", "@types/node": "14.18.0",
"jest": "^26.6.3", "jest": "26.6.3",
"typescript": "^4.0.5" "typescript": "4.5.2"
}, },
"dependencies": { "dependencies": {
"@joplin/fork-htmlparser2": "^4.1.41", "@joplin/fork-htmlparser2": "^4.1.41",
"@joplin/fork-uslug": "^1.0.6", "@joplin/fork-uslug": "^1.0.6",
"font-awesome-filetypes": "^2.1.0", "font-awesome-filetypes": "2.1.0",
"fs-extra": "^8.1.0", "fs-extra": "8.1.0",
"highlight.js": "11.1.0", "highlight.js": "11.1.0",
"html-entities": "^1.2.1", "html-entities": "1.4.0",
"json-stringify-safe": "^5.0.1", "json-stringify-safe": "5.0.1",
"katex": "^0.13.3", "katex": "0.13.24",
"markdown-it": "^10.0.0", "markdown-it": "10.0.0",
"markdown-it-abbr": "^1.0.4", "markdown-it-abbr": "1.0.4",
"markdown-it-anchor": "^5.2.5", "markdown-it-anchor": "5.3.0",
"markdown-it-deflist": "^2.0.3", "markdown-it-deflist": "2.1.0",
"markdown-it-emoji": "^1.4.0", "markdown-it-emoji": "1.4.0",
"markdown-it-expand-tabs": "^1.0.13", "markdown-it-expand-tabs": "1.0.13",
"markdown-it-footnote": "^3.0.2", "markdown-it-footnote": "3.0.3",
"markdown-it-ins": "^3.0.0", "markdown-it-ins": "3.0.1",
"markdown-it-mark": "^3.0.0", "markdown-it-mark": "3.0.1",
"markdown-it-multimd-table": "^4.1.2", "markdown-it-multimd-table": "4.1.2",
"markdown-it-sub": "^1.0.0", "markdown-it-sub": "1.0.0",
"markdown-it-sup": "^1.0.0", "markdown-it-sup": "1.0.0",
"markdown-it-toc-done-right": "^4.1.0", "markdown-it-toc-done-right": "4.2.0",
"md5": "^2.2.1", "md5": "2.3.0",
"mermaid": "^9.1.7" "mermaid": "9.1.7"
}, },
"gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14" "gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14"
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@joplin/server", "name": "@joplin/server",
"version": "2.9.5", "version": "2.9.6",
"private": true, "private": true,
"scripts": { "scripts": {
"start-dev": "yarn run build && JOPLIN_IS_TESTING=1 nodemon --config nodemon.json --ext ts,js,mustache,css,tsx dist/app.js --env dev", "start-dev": "yarn run build && JOPLIN_IS_TESTING=1 nodemon --config nodemon.json --ext ts,js,mustache,css,tsx dist/app.js --env dev",
@ -21,61 +21,61 @@
"watch": "tsc --watch --preserveWatchOutput --project tsconfig.json" "watch": "tsc --watch --preserveWatchOutput --project tsconfig.json"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.40.0", "@aws-sdk/client-s3": "3.44.0",
"@fortawesome/fontawesome-free": "^5.15.1", "@fortawesome/fontawesome-free": "5.15.4",
"@joplin/lib": "~2.9", "@joplin/lib": "~2.9",
"@joplin/renderer": "~2.9", "@joplin/renderer": "~2.9",
"@koa/cors": "^3.1.0", "@koa/cors": "4.0.0",
"@types/uuid": "^8.3.1", "@types/uuid": "8.3.3",
"bcryptjs": "^2.4.3", "bcryptjs": "2.4.3",
"bulma": "^0.9.1", "bulma": "0.9.3",
"bulma-prefers-dark": "^0.1.0-beta.0", "bulma-prefers-dark": "0.1.0-beta.1",
"compare-versions": "^3.6.0", "compare-versions": "3.6.0",
"dayjs": "^1.9.8", "dayjs": "1.10.7",
"formidable": "^1.2.2", "formidable": "1.2.6",
"fs-extra": "^8.1.0", "fs-extra": "8.1.0",
"html-entities": "^1.3.1", "html-entities": "1.4.0",
"jquery": "^3.6.0", "jquery": "3.6.0",
"knex": "0.95.15", "knex": "0.95.15",
"koa": "2.8.1", "koa": "2.13.4",
"markdown-it": "^12.0.4", "markdown-it": "12.2.0",
"mustache": "^3.1.0", "mustache": "3.2.1",
"nanoid": "^2.1.1", "nanoid": "2.1.11",
"node-cron": "^3.0.0", "node-cron": "3.0.0",
"node-env-file": "^0.1.8", "node-env-file": "0.1.8",
"nodemailer": "^6.6.0", "nodemailer": "6.7.2",
"nodemon": "^2.0.6", "nodemon": "2.0.15",
"pg": "^8.5.1", "pg": "8.7.1",
"pretty-bytes": "^5.6.0", "pretty-bytes": "5.6.0",
"prettycron": "^0.10.0", "prettycron": "0.10.0",
"query-string": "^6.8.3", "query-string": "6.14.1",
"rate-limiter-flexible": "^2.2.4", "rate-limiter-flexible": "2.3.6",
"raw-body": "^2.4.1", "raw-body": "2.4.2",
"sqlite3": "^4.1.0", "sqlite3": "4.2.0",
"stripe": "^8.150.0", "stripe": "8.191.0",
"uuid": "^8.3.2", "uuid": "8.3.2",
"yargs": "^17.2.1", "yargs": "17.3.0",
"zxcvbn": "^4.4.2" "zxcvbn": "4.4.2"
}, },
"devDependencies": { "devDependencies": {
"@joplin/tools": "~2.9", "@joplin/tools": "~2.9",
"@rmp135/sql-ts": "^1.12.1", "@rmp135/sql-ts": "1.12.1",
"@types/fs-extra": "^8.0.0", "@types/fs-extra": "8.1.2",
"@types/jest": "^26.0.15", "@types/jest": "26.0.24",
"@types/jest-expect-message": "^1.0.3", "@types/jest-expect-message": "1.0.3",
"@types/jsdom": "^16.2.6", "@types/jsdom": "16.2.13",
"@types/koa": "2.0.49", "@types/koa": "2.13.4",
"@types/markdown-it": "^12.0.0", "@types/markdown-it": "12.2.3",
"@types/mustache": "^0.8.32", "@types/mustache": "0.8.32",
"@types/nodemailer": "^6.4.1", "@types/nodemailer": "6.4.4",
"@types/yargs": "^17.0.4", "@types/yargs": "17.0.7",
"@types/zxcvbn": "^4.4.1", "@types/zxcvbn": "4.4.1",
"gulp": "^4.0.2", "gulp": "4.0.2",
"jest": "^26.6.3", "jest": "26.6.3",
"jest-expect-message": "^1.0.2", "jest-expect-message": "1.0.2",
"jsdom": "^16.4.0", "jsdom": "16.7.0",
"node-mocks-http": "^1.10.0", "node-mocks-http": "1.11.0",
"source-map-support": "^0.5.13", "source-map-support": "0.5.21",
"typescript": "4.1.2" "typescript": "4.1.2"
} }
} }

View File

@ -184,7 +184,7 @@ async function main() {
app.use(cors({ app.use(cors({
// https://github.com/koajs/cors/issues/52#issuecomment-413887382 // https://github.com/koajs/cors/issues/52#issuecomment-413887382
origin: (ctx: AppContext) => { origin: (ctx: AppContext) => {
const origin = ctx.request.header.origin; const origin = ctx.request.origin;
if (acceptOrigin(origin)) { if (acceptOrigin(origin)) {
return origin; return origin;

View File

@ -34,6 +34,11 @@ export default class UserDeletionModel extends BaseModel<UserDeletion> {
return !!r; return !!r;
} }
public async isDeletedOrBeingDeleted(userId: Uuid) {
const r: UserDeletion = await this.db(this.tableName).select(['id', 'start_time']).where('user_id', '=', userId).first();
return !!r && !!r.start_time;
}
public async add(userId: Uuid, scheduledTime: number, options: AddOptions = null): Promise<UserDeletion> { public async add(userId: Uuid, scheduledTime: number, options: AddOptions = null): Promise<UserDeletion> {
options = { options = {
...defaultAddOptions(), ...defaultAddOptions(),
@ -120,4 +125,10 @@ export default class UserDeletionModel extends BaseModel<UserDeletion> {
return userIds; return userIds;
} }
// Remove a user from the deletion queue, before it gets deleted. If it has
// already been deleted or if it's being deleted, no action is performed.
public async removeFromQueueByUserId(userId: Uuid) {
await this.db(this.tableName).where('user_id', '=', userId).andWhere('start_time', '=', 0).delete();
}
} }

View File

@ -1,8 +1,11 @@
import Logger from '@joplin/lib/Logger';
import { isUniqueConstraintError } from '../db'; import { isUniqueConstraintError } from '../db';
import { User, UserFlag, UserFlagType, userFlagTypeToLabel, Uuid } from '../services/database/types'; import { User, UserFlag, UserFlagType, userFlagTypeToLabel, Uuid } from '../services/database/types';
import { formatDateTime } from '../utils/time'; import { formatDateTime } from '../utils/time';
import BaseModel from './BaseModel'; import BaseModel from './BaseModel';
const logger = Logger.create('UserFlagModel');
interface AddRemoveOptions { interface AddRemoveOptions {
updateUser?: boolean; updateUser?: boolean;
} }
@ -138,15 +141,35 @@ export default class UserFlagModels extends BaseModel<UserFlag> {
newProps.enabled = 0; newProps.enabled = 0;
} }
let removeFromDeletionQueue = false;
if (!user.enabled && newProps.enabled) {
if (await this.models().userDeletion().isDeletedOrBeingDeleted(userId)) {
// User account is being deleted or already deleted and cannot
// be enabled again.
logger.error('Trying to enable an account that is queued for deletion - leaving account disabled');
newProps.enabled = 0;
} else {
// If the user has been re-enabled, we want to remove it from
// the deletion queue (if it has been queued there) immediately,
// so that it doesn't incorrectly get deleted.
removeFromDeletionQueue = true;
}
}
if (user.enabled !== newProps.enabled) { if (user.enabled !== newProps.enabled) {
newProps.disabled_time = !newProps.enabled ? Date.now() : 0; newProps.disabled_time = !newProps.enabled ? Date.now() : 0;
} }
if (user.can_upload !== newProps.can_upload || user.enabled !== newProps.enabled) { if (user.can_upload !== newProps.can_upload || user.enabled !== newProps.enabled) {
await this.models().user().save({ await this.withTransaction(async () => {
id: userId, if (removeFromDeletionQueue) await this.models().userDeletion().removeFromQueueByUserId(userId);
...newProps,
}); await this.models().user().save({
id: userId,
...newProps,
});
}, 'UserFlagModel::updateUserFromFlags');
} }
} }

View File

@ -5,6 +5,7 @@ import { betaUserDateRange, stripeConfig } from '../utils/stripe';
import { accountByType, AccountType } from './UserModel'; import { accountByType, AccountType } from './UserModel';
import { failedPaymentFinalAccount, failedPaymentWarningInterval } from './SubscriptionModel'; import { failedPaymentFinalAccount, failedPaymentWarningInterval } from './SubscriptionModel';
import { stripePortalUrl } from '../utils/urlUtils'; import { stripePortalUrl } from '../utils/urlUtils';
import { Day } from '../utils/time';
describe('UserModel', function() { describe('UserModel', function() {
@ -403,4 +404,54 @@ describe('UserModel', function() {
expect(await models().userFlag().byUserId(user1.id, UserFlagType.AccountOverLimit)).toBeFalsy(); expect(await models().userFlag().byUserId(user1.id, UserFlagType.AccountOverLimit)).toBeFalsy();
}); });
test('should disable and enable users', async () => {
const { user: user1 } = await createUserAndSession(1);
const { user: user2 } = await createUserAndSession(2);
jest.useFakeTimers('modern');
const t0 = new Date('2022-01-01').getTime();
jest.setSystemTime(t0);
await models().userFlag().add(user1.id, UserFlagType.ManuallyDisabled);
expect((await models().user().load(user1.id)).enabled).toBe(0);
expect((await models().user().load(user2.id)).enabled).toBe(1);
const t1 = new Date('2022-02-01').getTime();
jest.setSystemTime(t1);
// If we run the user deletion service at this point, it should add the
// disabled account
await models().userDeletion().autoAdd(10, 10 * Day, t1 + 3 * Day);
expect(await models().userDeletion().count()).toBe(1);
// If we make the account enabled again, the user should be immediately
// removed from the queue
await models().userFlag().remove(user1.id, UserFlagType.ManuallyDisabled);
expect(await models().userDeletion().count()).toBe(0);
await models().userFlag().add(user1.id, UserFlagType.ManuallyDisabled);
const t2 = new Date('2022-03-01').getTime();
jest.setSystemTime(t2);
// Should be added again
await models().userDeletion().autoAdd(10, 10 * Day, t2 + 3 * Day);
expect(await models().userDeletion().count()).toBe(1);
const t3 = new Date('2022-04-01').getTime();
jest.setSystemTime(t3);
// Now if the service were to run, the user deletion would start and it
// should no longer be possible to remove it from the queue. And it
// shouldn't be possible to enable the user either.
const job = await models().userDeletion().next();
expect(job.user_id).toBe(user1.id);
await models().userDeletion().start(job.id);
await models().userFlag().add(user1.id, UserFlagType.ManuallyDisabled);
expect((await models().user().load(user1.id)).enabled).toBe(0);
});
}); });

View File

@ -84,7 +84,7 @@ router.post('api/batch', async (_path: SubPath, ctx: AppContext) => {
response[subRequestId] = { response[subRequestId] = {
status: r.status, status: r.status,
body: typeof r.body === 'object' ? { ...r.body } : r.body, body: typeof r.body === 'object' ? { ...(r.body as object) } : r.body,
header: r.header ? { ...r.header } : {}, header: r.header ? { ...r.header } : {},
}; };
} }

View File

@ -49,7 +49,7 @@ export async function putItemContents(path: SubPath, ctx: AppContext, isBatch: b
// include the "share_id" field property so it doesn't need to be set via // include the "share_id" field property so it doesn't need to be set via
// query parameter. // query parameter.
if (ctx.query['share_id']) { if (ctx.query['share_id']) {
saveOptions.shareId = ctx.query['share_id']; saveOptions.shareId = ctx.query['share_id'] as string;
await ctx.joplin.models.item().checkIfAllowed(ctx.joplin.owner, AclAction.Create, { jop_share_id: saveOptions.shareId }); await ctx.joplin.models.item().checkIfAllowed(ctx.joplin.owner, AclAction.Create, { jop_share_id: saveOptions.shareId });
} }

View File

@ -24,9 +24,11 @@ describe('api_ping', function() {
await routeHandler(context); await routeHandler(context);
const body = context.response.body as any;
expect(context.response.status).toBe(200); expect(context.response.status).toBe(200);
expect(context.response.body.status).toBe('ok'); expect(body.status).toBe('ok');
expect(context.response.body.message).toBe('Joplin Server is running'); expect(body.message).toBe('Joplin Server is running');
}); });
}); });

View File

@ -39,9 +39,9 @@ describe('api/sessions', function() {
const context = await postSession(user.email, password); const context = await postSession(user.email, password);
expect(context.response.status).toBe(200); expect(context.response.status).toBe(200);
expect(!!context.response.body.id).toBe(true); expect(!!(context.response.body as any).id).toBe(true);
const session: Session = await models().session().load(context.response.body.id); const session: Session = await models().session().load((context.response.body as any).id);
expect(session.user_id).toBe(user.id); expect(session.user_id).toBe(user.id);
}); });

View File

@ -28,7 +28,7 @@ describe('index/home', function() {
await routeHandler(context); await routeHandler(context);
expect(context.response.body.indexOf(user.email) >= 0).toBe(true); expect((context.response.body as any).indexOf(user.email) >= 0).toBe(true);
}); });
}); });

View File

@ -44,7 +44,7 @@ describe('index_login', function() {
await routeHandler(context); await routeHandler(context);
const doc = parseHtml(context.response.body); const doc = parseHtml(context.response.body as string);
expect(!!doc.querySelector('input[name=email]')).toBe(true); expect(!!doc.querySelector('input[name=email]')).toBe(true);
expect(!!doc.querySelector('input[name=password]')).toBe(true); expect(!!doc.querySelector('input[name=password]')).toBe(true);
}); });

View File

@ -48,7 +48,7 @@ const subRoutes: Record<string, RouteHandler> = {
reset: async (_path: SubPath, ctx: AppContext) => { reset: async (_path: SubPath, ctx: AppContext) => {
let successMessage: string = ''; let successMessage: string = '';
let error: Error = null; let error: Error = null;
const token = ctx.query.token; const token = ctx.query.token as string;
if (ctx.method === 'POST') { if (ctx.method === 'POST') {
const fields = await bodyFields<ResetPasswordFields>(ctx.req); const fields = await bodyFields<ResetPasswordFields>(ctx.req);

View File

@ -37,7 +37,7 @@ async function getShareContent(shareId: string, query: any = {}): Promise<string
}); });
await routeHandler(context); await routeHandler(context);
await checkContextError(context); await checkContextError(context);
return context.response.body; return context.response.body as any;
} }
describe('shares.link', function() { describe('shares.link', function() {

View File

@ -407,7 +407,7 @@ const getHandlers: Record<string, StripeRouteHandler> = {
success: async (stripe: Stripe, _path: SubPath, ctx: AppContext) => { success: async (stripe: Stripe, _path: SubPath, ctx: AppContext) => {
try { try {
const models = ctx.joplin.models; const models = ctx.joplin.models;
const checkoutSession = await stripe.checkout.sessions.retrieve(ctx.query.session_id); const checkoutSession = await stripe.checkout.sessions.retrieve(ctx.query.session_id as string);
const userEmail = checkoutSession.customer_details.email || checkoutSession.customer_email; // customer_email appears to be always null but fallback to it just in case const userEmail = checkoutSession.customer_details.email || checkoutSession.customer_email; // customer_email appears to be always null but fallback to it just in case
if (!userEmail) throw new Error(`Could not find email from checkout session: ${JSON.stringify(checkoutSession)}`); if (!userEmail) throw new Error(`Could not find email from checkout session: ${JSON.stringify(checkoutSession)}`);
const user = await waitForUserCreation(models, userEmail); const user = await waitForUserCreation(models, userEmail);

View File

@ -59,7 +59,7 @@ async function getUserHtml(sessionId: string, userId: string): Promise<string> {
await routeHandler(context); await routeHandler(context);
checkContextError(context); checkContextError(context);
return context.response.body; return context.response.body as string;
} }
describe('index/users', function() { describe('index/users', function() {

View File

@ -124,7 +124,7 @@ router.publicSchemas.push('users/:id/confirm');
router.get('users/:id/confirm', async (path: SubPath, ctx: AppContext, error: Error = null) => { router.get('users/:id/confirm', async (path: SubPath, ctx: AppContext, error: Error = null) => {
const models = ctx.joplin.models; const models = ctx.joplin.models;
const userId = path.id; const userId = path.id;
const token = ctx.query.token; const token = ctx.query.token as string;
if (!token) throw new ErrorBadRequest('Missing token'); if (!token) throw new ErrorBadRequest('Missing token');

View File

@ -2,7 +2,7 @@ import config from '../config';
import { shareFolderWithUser } from '../utils/testing/shareApiUtils'; import { shareFolderWithUser } from '../utils/testing/shareApiUtils';
import { afterAllTests, beforeAllDb, beforeEachDb, createNote, createUserAndSession, models } from '../utils/testing/testUtils'; import { afterAllTests, beforeAllDb, beforeEachDb, createNote, createUserAndSession, models } from '../utils/testing/testUtils';
import { Env } from '../utils/types'; import { Env } from '../utils/types';
import { BackupItemType } from './database/types'; import { BackupItemType, UserFlagType } from './database/types';
import UserDeletionService from './UserDeletionService'; import UserDeletionService from './UserDeletionService';
const newService = () => { const newService = () => {
@ -32,6 +32,8 @@ describe('UserDeletionService', function() {
const t0 = new Date('2021-12-14').getTime(); const t0 = new Date('2021-12-14').getTime();
const t1 = t0 + 1000; const t1 = t0 + 1000;
await models().userFlag().toggle(user1.id, UserFlagType.ManuallyDisabled, true);
const job = await models().userDeletion().add(user1.id, t1, { const job = await models().userDeletion().add(user1.id, t1, {
processData: true, processData: true,
processAccount: false, processAccount: false,
@ -63,6 +65,8 @@ describe('UserDeletionService', function() {
const t0 = new Date('2021-12-14').getTime(); const t0 = new Date('2021-12-14').getTime();
const t1 = t0 + 1000; const t1 = t0 + 1000;
await models().userFlag().toggle(user1.id, UserFlagType.ManuallyDisabled, true);
const job = await models().userDeletion().add(user1.id, t1, { const job = await models().userDeletion().add(user1.id, t1, {
processData: false, processData: false,
processAccount: true, processAccount: true,
@ -92,7 +96,7 @@ describe('UserDeletionService', function() {
const content = JSON.parse(backupItem.content.toString()); const content = JSON.parse(backupItem.content.toString());
expect(content.user.id).toBe(user1.id); expect(content.user.id).toBe(user1.id);
expect(content.user.email).toBe(user1.email); expect(content.user.email).toBe(user1.email);
expect(content.flags.length).toBe(0); expect(content.flags.length).toBe(1);
}); });
test('should not delete notebooks that are not owned', async function() { test('should not delete notebooks that are not owned', async function() {
@ -113,6 +117,8 @@ describe('UserDeletionService', function() {
expect(await models().share().count()).toBe(1); expect(await models().share().count()).toBe(1);
expect(await models().shareUser().count()).toBe(1); expect(await models().shareUser().count()).toBe(1);
await models().userFlag().toggle(user2.id, UserFlagType.ManuallyDisabled, true);
const job = await models().userDeletion().add(user2.id, Date.now()); const job = await models().userDeletion().add(user2.id, Date.now());
const service = newService(); const service = newService();
await service.processDeletionJob(job, { sleepBetweenOperations: 0 }); await service.processDeletionJob(job, { sleepBetweenOperations: 0 });
@ -140,6 +146,8 @@ describe('UserDeletionService', function() {
expect(await models().share().count()).toBe(1); expect(await models().share().count()).toBe(1);
expect(await models().shareUser().count()).toBe(1); expect(await models().shareUser().count()).toBe(1);
await models().userFlag().toggle(user1.id, UserFlagType.ManuallyDisabled, true);
const job = await models().userDeletion().add(user1.id, Date.now()); const job = await models().userDeletion().add(user1.id, Date.now());
const service = newService(); const service = newService();
await service.processDeletionJob(job, { sleepBetweenOperations: 0 }); await service.processDeletionJob(job, { sleepBetweenOperations: 0 });
@ -149,4 +157,27 @@ describe('UserDeletionService', function() {
expect(await models().item().count()).toBe(0); expect(await models().item().count()).toBe(0);
}); });
test('should not do anything if the user is still enabled', async function() {
const { user: user1 } = await createUserAndSession(1);
const t0 = new Date('2021-12-14').getTime();
const t1 = t0 + 1000;
const job = await models().userDeletion().add(user1.id, t1, {
processData: false,
processAccount: true,
});
expect(await models().userDeletion().count()).toBe(1);
const service = newService();
await service.processDeletionJob(job, { sleepBetweenOperations: 0 });
// Nothing has been done because the user is still enabled
expect(await models().user().count()).toBe(1);
// And the job should have been removed from the queue
expect(await models().userDeletion().count()).toBe(0);
});
}); });

View File

@ -90,6 +90,20 @@ export default class UserDeletionService extends BaseService {
logger.info('Starting user deletion: ', deletion); logger.info('Starting user deletion: ', deletion);
// Normally, a user that is still enabled should not be processed here,
// because it should not have been queued to begin with (or if it was
// queued, then enabled, it should have been removed from the queue).
// But as a fail safe we have this extra check.
//
// We also remove the job from the queue so that the service doesn't try
// to process it again.
const user = await this.models.user().load(deletion.user_id);
if (user.enabled) {
logger.error(`Trying to delete a user that is still enabled - aborting and removing the user from the queue. Deletion job: ${JSON.stringify(deletion)}`);
await this.models.userDeletion().removeFromQueueByUserId(user.id);
return;
}
let error: any = null; let error: any = null;
let success: boolean = true; let success: boolean = true;

View File

@ -60,7 +60,7 @@ export function headerSessionId(headers: any): string {
} }
export function contextSessionId(ctx: AppContext, throwIfNotFound = true): string { export function contextSessionId(ctx: AppContext, throwIfNotFound = true): string {
if (ctx.headers['x-api-auth']) return ctx.headers['x-api-auth']; if (ctx.headers['x-api-auth']) return ctx.headers['x-api-auth'] as string;
const id = cookieGet(ctx, 'sessionId'); const id = cookieGet(ctx, 'sessionId');
if (!id && throwIfNotFound) throw new ErrorForbidden('Invalid or missing session'); if (!id && throwIfNotFound) throw new ErrorForbidden('Invalid or missing session');
@ -76,6 +76,6 @@ export function isAdminRequest(ctx: AppContext): boolean {
} }
export function userIp(ctx: AppContext): string { export function userIp(ctx: AppContext): string {
if (ctx.headers['x-real-ip']) return ctx.headers['x-real-ip']; if (ctx.headers['x-real-ip']) return ctx.headers['x-real-ip'] as string;
return ctx.ip; return ctx.ip;
} }

View File

@ -6,6 +6,7 @@ import { downloadPlugins, extractPlugins, localPluginsVersion } from './bundleDe
import { pathExists, readFile, remove } from 'fs-extra'; import { pathExists, readFile, remove } from 'fs-extra';
import Setting from '@joplin/lib/models/Setting'; import Setting from '@joplin/lib/models/Setting';
import { createTempDir, supportDir } from '@joplin/lib/testing/test-utils'; import { createTempDir, supportDir } from '@joplin/lib/testing/test-utils';
import { rootDir } from './tool-utils';
const fetch = require('node-fetch'); const fetch = require('node-fetch');
@ -170,8 +171,6 @@ describe('bundleDefaultPlugins', function() {
.mockResolvedValueOnce({ text: () => Promise.resolve(NPM_Response2), ok: true }) .mockResolvedValueOnce({ text: () => Promise.resolve(NPM_Response2), ok: true })
.mockResolvedValueOnce({ buffer: () => Promise.resolve(tgzData), ok: true }); .mockResolvedValueOnce({ buffer: () => Promise.resolve(tgzData), ok: true });
const tempDir = await createTempDir();
const downloadedPlugins = await downloadPlugins(testCase.localVersions, testDefaultPluginsInfo, manifests); const downloadedPlugins = await downloadPlugins(testCase.localVersions, testDefaultPluginsInfo, manifests);
expect(downloadedPlugins[Object.keys(testDefaultPluginsInfo)[0]]).toBe(testCase.downloadedPlugin1); expect(downloadedPlugins[Object.keys(testDefaultPluginsInfo)[0]]).toBe(testCase.downloadedPlugin1);
@ -182,9 +181,10 @@ describe('bundleDefaultPlugins', function() {
testCase.calledWith.forEach((callValue, index) => expect(mockFetch).toHaveBeenNthCalledWith(index + 1, callValue)); testCase.calledWith.forEach((callValue, index) => expect(mockFetch).toHaveBeenNthCalledWith(index + 1, callValue));
jest.clearAllMocks(); jest.clearAllMocks();
await remove(tempDir);
} }
await remove(`${rootDir}/packages/tools/joplin-plugin-backup-1.1.0.tgz`);
await remove(`${rootDir}/packages/tools/joplin-plugin-rich-markdown-0.9.0.tgz`);
}); });
it('should extract plugins files', async () => { it('should extract plugins files', async () => {

View File

@ -41,7 +41,7 @@ async function downloadFile(url: string, outputPath: string) {
export async function extractPlugins(currentDir: string, defaultPluginDir: string, downloadedPluginsNames: PluginIdAndName): Promise<void> { export async function extractPlugins(currentDir: string, defaultPluginDir: string, downloadedPluginsNames: PluginIdAndName): Promise<void> {
for (const pluginId of Object.keys(downloadedPluginsNames)) { for (const pluginId of Object.keys(downloadedPluginsNames)) {
await execCommand2(`tar xzf ${currentDir}/${downloadedPluginsNames[pluginId]}`); await execCommand2(`tar xzf ${currentDir}/${downloadedPluginsNames[pluginId]}`, { quiet: true });
await move(`package/publish/${pluginId}.jpl`,`${defaultPluginDir}/${pluginId}/plugin.jpl`, { overwrite: true }); await move(`package/publish/${pluginId}.jpl`,`${defaultPluginDir}/${pluginId}/plugin.jpl`, { overwrite: true });
await move(`package/publish/${pluginId}.json`,`${defaultPluginDir}/${pluginId}/manifest.json`, { overwrite: true }); await move(`package/publish/${pluginId}.json`,`${defaultPluginDir}/${pluginId}/manifest.json`, { overwrite: true });
await remove(`${downloadedPluginsNames[pluginId]}`); await remove(`${downloadedPluginsNames[pluginId]}`);

View File

@ -23,37 +23,37 @@
"@joplin/lib": "^2.9.1", "@joplin/lib": "^2.9.1",
"@joplin/renderer": "^2.9.1", "@joplin/renderer": "^2.9.1",
"@types/node-fetch": "1.6.9", "@types/node-fetch": "1.6.9",
"@types/yargs": "16.0.3", "@types/yargs": "16.0.4",
"dayjs": "^1.10.7", "dayjs": "1.10.7",
"execa": "^4.1.0", "execa": "4.1.0",
"fs-extra": "^4.0.3", "fs-extra": "4.0.3",
"gettext-parser": "^1.3.0", "gettext-parser": "1.4.0",
"glob": "^7.1.6", "glob": "7.2.0",
"markdown-it": "^8.4.1", "markdown-it": "8.4.2",
"md5-file": "^4.0.0", "md5-file": "4.0.0",
"moment": "^2.24.0", "moment": "2.29.1",
"mustache": "^2.3.0", "mustache": "2.3.2",
"node-fetch": "1.7.3", "node-fetch": "1.7.3",
"relative": "^3.0.2", "relative": "3.0.2",
"request": "^2.88.0", "request": "2.88.2",
"sharp": "^0.25.2", "sharp": "0.31.1",
"source-map-support": "^0.5.19", "source-map-support": "0.5.21",
"uri-template": "^1.0.1", "uri-template": "1.0.3",
"yargs": "16.0.3" "yargs": "16.2.0"
}, },
"devDependencies": { "devDependencies": {
"@rmp135/sql-ts": "^1.6.0", "@rmp135/sql-ts": "1.12.1",
"@types/fs-extra": "^9.0.6", "@types/fs-extra": "9.0.13",
"@types/jest": "^26.0.15", "@types/jest": "26.0.24",
"@types/mustache": "^0.8.32", "@types/mustache": "0.8.32",
"@types/node": "^14.14.6", "@types/node": "14.18.0",
"gettext-extractor": "^3.5.3", "gettext-extractor": "3.5.3",
"gulp": "^4.0.2", "gulp": "4.0.2",
"jest": "^26.6.3", "jest": "26.6.3",
"rss": "^1.2.2", "rss": "1.2.2",
"sass": "^1.39.2", "sass": "1.44.0",
"sqlite3": "^5.0.0", "sqlite3": "5.0.2",
"typescript": "^4.1.3" "typescript": "4.5.2"
}, },
"gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14" "gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14"
} }

View File

@ -8,10 +8,10 @@
"author": "Dom Christie", "author": "Dom Christie",
"main": "lib/turndown-plugin-gfm.cjs.js", "main": "lib/turndown-plugin-gfm.cjs.js",
"devDependencies": { "devDependencies": {
"browserify": "^14.5.0", "browserify": "14.5.0",
"rollup": "^0.50.0", "rollup": "0.50.1",
"standard": "^10.0.3", "standard": "10.0.3",
"turndown": "4.0.1", "turndown": "4.0.2",
"turndown-attendant": "0.0.3" "turndown-attendant": "0.0.3"
}, },
"files": [ "files": [

View File

@ -11,17 +11,17 @@
"jsdom": false "jsdom": false
}, },
"dependencies": { "dependencies": {
"css": "^2.2.4", "css": "2.2.4",
"html-entities": "^1.2.1", "html-entities": "1.4.0",
"jsdom": "^15.2.1" "jsdom": "15.2.1"
}, },
"devDependencies": { "devDependencies": {
"browserify": "^14.5.0", "browserify": "14.5.0",
"rollup": "^0.50.0", "rollup": "0.50.1",
"rollup-plugin-commonjs": "^8.2.6", "rollup-plugin-commonjs": "8.4.1",
"rollup-plugin-node-resolve": "^3.0.0", "rollup-plugin-node-resolve": "3.4.0",
"rollup-plugin-replace": "^2.0.0", "rollup-plugin-replace": "2.2.0",
"standard": "^10.0.3", "standard": "10.0.3",
"turndown-attendant": "0.0.3" "turndown-attendant": "0.0.3"
}, },
"files": [ "files": [

View File

@ -1,5 +1,18 @@
# Joplin Server Changelog # Joplin Server Changelog
## [server-v2.9.6](https://github.com/laurent22/joplin/releases/tag/server-v2.9.6) - 2022-11-05T11:52:09Z
- Improved: Allow enabling and disabling tasks (1379c9c)
- Improved: Allow searching user by email or name (1cfbefb)
- Improved: Fail-safe when trying to delete a non-disabled account (21883b4)
- Improved: Paginate users (8ac8d53)
- Improved: Refactor table structure (8ea6d89)
- Improved: Update sender email (bf92ee7)
- Improved: Upgrade Koa framework to 2.13.4 (dc92546)
- Improved: Upgrade to Node 18 (f34078b)
- Improved: When re-activating an account, remove it from the deletion queue (bbc4228)
- Fixed: Fixed account activation logic (ccf5d20)
## [server-v2.9.5](https://github.com/laurent22/joplin/releases/tag/server-v2.9.5) - 2022-10-11T10:44:01Z ## [server-v2.9.5](https://github.com/laurent22/joplin/releases/tag/server-v2.9.5) - 2022-10-11T10:44:01Z
- New: Add support for sidebar in user pages (053dbab) - New: Add support for sidebar in user pages (053dbab)

View File

@ -1,4 +1,4 @@
## How to add a new default plugin # How to add a new default plugin
To add a new default plugin for desktop: To add a new default plugin for desktop:
- Add the plugin ID and pinned version to `defaultPlugins` object located in [desktopDefaultPluginsInfo.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.ts#L5) - Add the plugin ID and pinned version to `defaultPlugins` object located in [desktopDefaultPluginsInfo.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.ts#L5)
@ -19,6 +19,7 @@ To add a new default plugin for desktop:
``` ```
## Bundling of default plugins ## Bundling of default plugins
Script for bundling default plugins is present in [bundleDefaultPlugins.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/tools/bundleDefaultPlugins.ts) Script for bundling default plugins is present in [bundleDefaultPlugins.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/tools/bundleDefaultPlugins.ts)
Every time a new desktop release is being built, we compare the local default plugins version with pinned plugin version mentioned in [desktopDefaultPluginsInfo.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.ts) Every time a new desktop release is being built, we compare the local default plugins version with pinned plugin version mentioned in [desktopDefaultPluginsInfo.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.ts)
@ -26,6 +27,7 @@ Every time a new desktop release is being built, we compare the local default pl
If there is a newer version available, we will pull the `tgz` file of plugin from NPM registry and extract it. We will then move `manifest.json` and `plugin.jpl` to the build folder of desktop. If there is a newer version available, we will pull the `tgz` file of plugin from NPM registry and extract it. We will then move `manifest.json` and `plugin.jpl` to the build folder of desktop.
## Installing of default plugins ## Installing of default plugins
- All the functions related to default plugins are located in [defaultPluginsUtils.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/defaultPluginsUtils.ts) - All the functions related to default plugins are located in [defaultPluginsUtils.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/defaultPluginsUtils.ts)
- On every startup, we check if there are new plugins available in build folder that have not been installed yet. After installing the new plugin, we update the `installedDefaultPlugins` array in `Setting.ts` with respective plugin ID for future reference. - On every startup, we check if there are new plugins available in build folder that have not been installed yet. After installing the new plugin, we update the `installedDefaultPlugins` array in `Setting.ts` with respective plugin ID for future reference.
- After installing is complete, we apply the default settings for each default plugin. Default settings are located in [desktopDefaultPluginsInfo.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.ts) - After installing is complete, we apply the default settings for each default plugin. Default settings are located in [desktopDefaultPluginsInfo.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.ts)

View File

@ -12,6 +12,17 @@
], ],
"ignoreDeps": [ "ignoreDeps": [
"react-native", "react-native",
"@types/react-native" "@types/react-native",
"@babel/core",
"babel-eslint",
"babel-loader",
"katex",
"jsc-android",
"metro-react-native-babel-preset",
"webpack",
"rollup",
"typedoc",
"actions/stale",
"@svgr/webpack"
] ]
} }

3057
yarn.lock

File diff suppressed because it is too large Load Diff