From 82a6a2c17036ce22245928726cb848f80aeded17 Mon Sep 17 00:00:00 2001 From: Bruce Liu Date: Wed, 15 Dec 2021 09:24:47 +0800 Subject: [PATCH 1/6] updated electron to 16.0.4 --- package-lock.json | 146 +++++++++++++++++++++++++-------------------- package.json | 4 +- src/main/window.ts | 2 - 3 files changed, 82 insertions(+), 70 deletions(-) diff --git a/package-lock.json b/package-lock.json index 36ba296..c07bd04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,10 +1,11 @@ { "name": "fluent-reader", - "version": "1.0.2", + "version": "1.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { + "name": "fluent-reader", "version": "1.0.2", "license": "BSD-3-Clause", "devDependencies": { @@ -15,7 +16,7 @@ "@types/react-dom": "^16.9.8", "@types/react-redux": "^7.1.9", "@yang991178/rss-parser": "^3.8.1", - "electron": "^13.1.4", + "electron": "^16.0.2", "electron-builder": "^22.11.3", "electron-react-devtools": "^0.5.3", "electron-store": "^5.2.0", @@ -68,9 +69,9 @@ } }, "node_modules/@electron/get": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz", - "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.1.tgz", + "integrity": "sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -78,17 +79,26 @@ "fs-extra": "^8.1.0", "got": "^9.6.0", "progress": "^2.0.3", - "sanitize-filename": "^1.6.2", + "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "engines": { "node": ">=8.6" }, "optionalDependencies": { - "global-agent": "^2.0.2", + "global-agent": "^3.0.0", "global-tunnel-ng": "^2.7.1" } }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@electron/universal": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.0.5.tgz", @@ -1365,9 +1375,9 @@ "dev": true }, "node_modules/boolean": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.2.tgz", - "integrity": "sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz", + "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==", "dev": true, "optional": true }, @@ -2348,9 +2358,9 @@ } }, "node_modules/config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "optional": true, "dependencies": { @@ -2449,13 +2459,6 @@ "node": ">=0.10.0" } }, - "node_modules/core-js": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.7.0.tgz", - "integrity": "sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA==", - "dev": true, - "optional": true - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -2802,9 +2805,9 @@ } }, "node_modules/detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true, "optional": true }, @@ -3076,13 +3079,13 @@ } }, "node_modules/electron": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.1.4.tgz", - "integrity": "sha512-4qhRZbRvGqHmMWsCG/kRVF4X8VIq9Nujgm+gXZLBSpiR6uUtMHy7ViBTQZl1PGf6O9Ppxhpr9Yz+k6Um9WoP3Q==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/electron/-/electron-16.0.4.tgz", + "integrity": "sha512-IptwmowvMP1SFOmZLh6rrURwfnOxbDBXBRBcaOdfBM5I+B9mgtdNwzNC3ymFFNzEkZUwdOyg9fu3iyjAAQIQgw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@electron/get": "^1.0.1", + "@electron/get": "^1.13.0", "@types/node": "^14.6.2", "extract-zip": "^1.0.3" }, @@ -3728,6 +3731,9 @@ "optional": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-scope": { @@ -4379,14 +4385,13 @@ } }, "node_modules/global-agent": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", - "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "dev": true, "optional": true, "dependencies": { "boolean": "^3.0.1", - "core-js": "^3.6.5", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", @@ -4480,9 +4485,9 @@ } }, "node_modules/globalthis": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", - "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", "dev": true, "optional": true, "dependencies": { @@ -4490,6 +4495,9 @@ }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/got": { @@ -7359,6 +7367,9 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/serialize-javascript": { @@ -8225,6 +8236,9 @@ "optional": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typedarray": { @@ -9465,20 +9479,28 @@ } }, "@electron/get": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz", - "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.1.tgz", + "integrity": "sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA==", "dev": true, "requires": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", - "global-agent": "^2.0.2", + "global-agent": "^3.0.0", "global-tunnel-ng": "^2.7.1", "got": "^9.6.0", "progress": "^2.0.3", - "sanitize-filename": "^1.6.2", + "semver": "^6.2.0", "sumchecker": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@electron/universal": { @@ -10615,9 +10637,9 @@ "dev": true }, "boolean": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.2.tgz", - "integrity": "sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz", + "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==", "dev": true, "optional": true }, @@ -11433,9 +11455,9 @@ } }, "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "optional": true, "requires": { @@ -11518,13 +11540,6 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "core-js": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.7.0.tgz", - "integrity": "sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA==", - "dev": true, - "optional": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -11800,9 +11815,9 @@ "dev": true }, "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true, "optional": true }, @@ -12021,12 +12036,12 @@ } }, "electron": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.1.4.tgz", - "integrity": "sha512-4qhRZbRvGqHmMWsCG/kRVF4X8VIq9Nujgm+gXZLBSpiR6uUtMHy7ViBTQZl1PGf6O9Ppxhpr9Yz+k6Um9WoP3Q==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/electron/-/electron-16.0.4.tgz", + "integrity": "sha512-IptwmowvMP1SFOmZLh6rrURwfnOxbDBXBRBcaOdfBM5I+B9mgtdNwzNC3ymFFNzEkZUwdOyg9fu3iyjAAQIQgw==", "dev": true, "requires": { - "@electron/get": "^1.0.1", + "@electron/get": "^1.13.0", "@types/node": "^14.6.2", "extract-zip": "^1.0.3" } @@ -13079,14 +13094,13 @@ } }, "global-agent": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", - "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "dev": true, "optional": true, "requires": { "boolean": "^3.0.1", - "core-js": "^3.6.5", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", @@ -13160,9 +13174,9 @@ } }, "globalthis": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", - "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", "dev": true, "optional": true, "requires": { diff --git a/package.json b/package.json index aa5e3a6..0f852cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fluent-reader", - "version": "1.0.2", + "version": "1.1.0", "description": "Modern desktop RSS reader", "main": "./dist/electron.js", "scripts": { @@ -26,7 +26,7 @@ "@types/react-dom": "^16.9.8", "@types/react-redux": "^7.1.9", "@yang991178/rss-parser": "^3.8.1", - "electron": "^13.1.4", + "electron": "^16.0.2", "electron-builder": "^22.11.3", "electron-react-devtools": "^0.5.3", "electron-store": "^5.2.0", diff --git a/src/main/window.ts b/src/main/window.ts index 2db60bb..20ed1b8 100644 --- a/src/main/window.ts +++ b/src/main/window.ts @@ -63,9 +63,7 @@ export class WindowManager { show: false, webPreferences: { webviewTag: true, - enableRemoteModule: false, contextIsolation: true, - worldSafeExecuteJavaScript: true, spellcheck: false, preload: path.join( app.getAppPath(), From 4e842e642037b761a6b02983a4d99f695effa929 Mon Sep 17 00:00:00 2001 From: Bruce Liu Date: Wed, 15 Dec 2021 14:39:11 +0800 Subject: [PATCH 2/6] fix negative unread counts #216 --- src/scripts/models/item.ts | 6 ++++-- src/scripts/models/source.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/scripts/models/item.ts b/src/scripts/models/item.ts index fbe7df8..5eca66c 100644 --- a/src/scripts/models/item.ts +++ b/src/scripts/models/item.ts @@ -312,7 +312,8 @@ const markUnreadDone = (item: RSSItem): ItemActionTypes => ({ }) export function markRead(item: RSSItem): AppThunk { - return dispatch => { + return (dispatch, getState) => { + item = getState().items[item._id] if (!item.hasRead) { db.itemsDB .update(db.items) @@ -377,7 +378,8 @@ export function markAllRead( } export function markUnread(item: RSSItem): AppThunk { - return dispatch => { + return (dispatch, getState) => { + item = getState().items[item._id] if (item.hasRead) { db.itemsDB .update(db.items) diff --git a/src/scripts/models/source.ts b/src/scripts/models/source.ts index f44a547..85c5c06 100644 --- a/src/scripts/models/source.ts +++ b/src/scripts/models/source.ts @@ -483,7 +483,7 @@ export function sourceReducer( } case MARK_ALL_READ: { let nextState = { ...state } - action.sids.map((sid, i) => { + action.sids.forEach((sid) => { nextState[sid] = { ...state[sid], unreadCount: action.time ? state[sid].unreadCount : 0, From cf38cc00c890a755cf5324a5a292b0e48760bc42 Mon Sep 17 00:00:00 2001 From: Bruce Liu Date: Thu, 16 Dec 2021 10:14:43 +0800 Subject: [PATCH 3/6] add rtl and vertical article text directions --- dist/article/article.css | 29 +++++++++++++-- dist/article/article.html | 4 +-- dist/article/article.js | 10 +++++- src/components/article.tsx | 54 ++++++++++++++++++++++++++-- src/containers/article-container.tsx | 9 +++++ src/main/utils.ts | 10 +++--- src/main/window.ts | 1 + src/scripts/db.ts | 13 +++++-- src/scripts/i18n/en-US.json | 6 +++- src/scripts/i18n/zh-CN.json | 6 +++- src/scripts/i18n/zh-TW.json | 6 +++- src/scripts/models/source.ts | 8 +++++ src/scripts/settings.ts | 2 ++ 13 files changed, 140 insertions(+), 18 deletions(-) diff --git a/dist/article/article.css b/dist/article/article.css index 3081e3e..ff336e4 100644 --- a/dist/article/article.css +++ b/dist/article/article.css @@ -2,14 +2,25 @@ html, body { + margin: 0; font-family: "Segoe UI", "Source Han Sans SC Regular", "Microsoft YaHei", sans-serif; } -html { +body { + padding: 12px 96px 32px; overflow: hidden scroll; } +body.rtl { + direction: rtl; +} +body.vertical { + padding: 32px; + padding-right: 96px; + writing-mode: vertical-rl; + overflow: scroll hidden; +} + :root { - margin: 12px 96px 32px; --gray: #484644; --primary: #0078d4; --primary-alt: #004578; @@ -58,6 +69,11 @@ a:active { margin: 0 auto; display: none; } +body.vertical #main { + max-width: unset; + max-height: 700px; + margin: auto 0; +} #main.show { display: block; animation-name: fadeIn; @@ -80,12 +96,21 @@ a:active { article { line-height: 1.6; } +body.vertical article { + line-height: 1.5; +} +body.vertical article p { + text-indent: 2rem; +} article * { max-width: 100%; } article img { height: auto; } +body.vertical article img { + max-height: 75%; +} article figure { margin: 16px 0; text-align: center; diff --git a/dist/article/article.html b/dist/article/article.html index 564c801..24e76e7 100644 --- a/dist/article/article.html +++ b/dist/article/article.html @@ -3,14 +3,14 @@ + content="default-src 'none'; script-src-elem 'sha256-sLDWrq1tUAO8IyyqmUckFqxbXYfZ2/3TEUmtxH8Unf0=' 'sha256-OOzJH14UHiDzBx2LDF/KOAR+BVrHdNzZ2fZvPaqCMhY='; img-src http: https: data:; style-src 'self' 'unsafe-inline'; frame-src http: https:; media-src http: https:; connect-src https: http:"> Article
- + \ No newline at end of file diff --git a/dist/article/article.js b/dist/article/article.js index 85f71f6..0a31fa8 100644 --- a/dist/article/article.js +++ b/dist/article/article.js @@ -2,6 +2,15 @@ function get(name) { if (name = (new RegExp('[?&]' + encodeURIComponent(name) + '=([^&]*)')).exec(location.search)) return decodeURIComponent(name[1]); } +let dir = get("d") +if (dir === "1") { + document.body.classList.add("rtl") +} else if (dir === "2") { + document.body.classList.add("vertical") + document.body.addEventListener("wheel", (evt) => { + document.scrollingElement.scrollLeft -= evt.deltaY; + }); +} async function getArticle(url) { let article = get("a") if (get("m") === "1") { @@ -32,4 +41,3 @@ getArticle(url).then(article => { main.innerHTML = dom.body.innerHTML main.classList.add("show") }) - diff --git a/src/components/article.tsx b/src/components/article.tsx index 74f869e..ce35f39 100644 --- a/src/components/article.tsx +++ b/src/components/article.tsx @@ -12,7 +12,7 @@ import { Icon, Link, } from "@fluentui/react" -import { RSSSource, SourceOpenTarget } from "../scripts/models/source" +import { RSSSource, SourceOpenTarget, SourceTextDirection } from "../scripts/models/source" import { shareSubmenu } from "./context-menu" import { platformCtrl, decodeFetchResponse } from "../scripts/utils" @@ -31,6 +31,10 @@ type ArticleProps = { textMenu: (position: [number, number], text: string, url: string) => void imageMenu: (position: [number, number]) => void dismissContextMenu: () => void + updateSourceTextDirection: ( + source: RSSSource, + direction: SourceTextDirection + ) => void } type ArticleState = { @@ -82,6 +86,39 @@ class Article extends React.Component { })), }) + updateTextDirection = (direction: SourceTextDirection) => { + this.props.updateSourceTextDirection(this.props.source, direction) + } + + directionMenuProps = (): IContextualMenuProps => ({ + items: [ + { + key: "LTR", + text: intl.get("article.LTR"), + iconProps: { iconName: "Forward" }, + canCheck: true, + checked: this.props.source.textDir === SourceTextDirection.LTR, + onClick: () => this.updateTextDirection(SourceTextDirection.LTR), + }, + { + key: "RTL", + text: intl.get("article.RTL"), + iconProps: { iconName: "Back" }, + canCheck: true, + checked: this.props.source.textDir === SourceTextDirection.RTL, + onClick: () => this.updateTextDirection(SourceTextDirection.RTL), + }, + { + key: "Vertical", + text: intl.get("article.Vertical"), + iconProps: { iconName: "Down" }, + canCheck: true, + checked: this.props.source.textDir === SourceTextDirection.Vertical, + onClick: () => this.updateTextDirection(SourceTextDirection.Vertical), + }, + ] + }) + moreMenuProps = (): IContextualMenuProps => ({ items: [ { @@ -122,6 +159,13 @@ class Article extends React.Component { disabled: this.state.loadWebpage, subMenuProps: this.fontMenuProps(), }, + { + key: "directionMenu", + text: intl.get("article.textDir"), + iconProps: { iconName: "ChangeEntitlements" }, + disabled: this.state.loadWebpage, + subMenuProps: this.directionMenuProps(), + }, { key: "divider_1", itemType: ContextualMenuItemType.Divider, @@ -290,7 +334,11 @@ class Article extends React.Component { ) ) - return `article/article.html?a=${a}&h=${h}&s=${this.state.fontSize}&u=${ + return `article/article.html?a=${a}&h=${h}&s=${ + this.state.fontSize + }&d=${ + this.props.source.textDir + }&u=${ this.props.item.link }&m=${this.state.loadFull ? 1 : 0}` } @@ -400,7 +448,7 @@ class Article extends React.Component { ? this.props.item.link : this.articleView() } - webpreferences="contextIsolation,disableDialogs,autoplayPolicy=document-user-activation-required" + webpreferences="contextIsolation,disableDialogs,autoplayPolicy=document-user-activation-required,nativeWindowOpen=false" partition={this.state.loadWebpage ? "sandbox" : undefined} /> )} diff --git a/src/containers/article-container.tsx b/src/containers/article-container.tsx index e98cd6e..c09d7df 100644 --- a/src/containers/article-container.tsx +++ b/src/containers/article-container.tsx @@ -17,6 +17,7 @@ import { closeContextMenu, openImageMenu, } from "../scripts/models/app" +import { RSSSource, SourceTextDirection, updateSource } from "../scripts/models/source" type ArticleContainerProps = { itemId: number @@ -58,6 +59,14 @@ const mapDispatchToProps = (dispatch: AppDispatch) => { imageMenu: (position: [number, number]) => dispatch(openImageMenu(position)), dismissContextMenu: () => dispatch(closeContextMenu()), + updateSourceTextDirection: ( + source: RSSSource, + direction: SourceTextDirection + ) => { + dispatch( + updateSource({ ...source, textDir: direction } as RSSSource) + ) + }, } } diff --git a/src/main/utils.ts b/src/main/utils.ts index 6c954ba..6d38a12 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -5,7 +5,6 @@ import { app, session, clipboard, - TouchBar, } from "electron" import { WindowManager } from "./window" import fs = require("fs") @@ -28,11 +27,12 @@ export function setUtilsListeners(manager: WindowManager) { } app.on("web-contents-created", (_, contents) => { - // TODO: Use contents.setWindowOpenHandler instead of new-window listener - contents.on("new-window", (event, url, _, disposition) => { - if (manager.hasWindow()) event.preventDefault() + contents.setWindowOpenHandler((details) => { if (contents.getType() === "webview") - openExternal(url, disposition === "background-tab") + openExternal(details.url, details.disposition === "background-tab") + return { + action: manager.hasWindow() ? "deny" : "allow", + } }) contents.on("will-navigate", (event, url) => { event.preventDefault() diff --git a/src/main/window.ts b/src/main/window.ts index 20ed1b8..95bfb91 100644 --- a/src/main/window.ts +++ b/src/main/window.ts @@ -69,6 +69,7 @@ export class WindowManager { app.getAppPath(), (app.isPackaged ? "dist/" : "") + "preload.js" ), + nativeWindowOpen: false, }, }) this.mainWindowState.manage(this.mainWindow) diff --git a/src/scripts/db.ts b/src/scripts/db.ts index 06295b9..b0c032b 100644 --- a/src/scripts/db.ts +++ b/src/scripts/db.ts @@ -4,7 +4,7 @@ import lf from "lovefield" import { RSSSource } from "./models/source" import { RSSItem } from "./models/item" -const sdbSchema = lf.schema.create("sourcesDB", 1) +const sdbSchema = lf.schema.create("sourcesDB", 2) sdbSchema .createTable("sources") .addColumn("sid", lf.Type.INTEGER) @@ -17,6 +17,7 @@ sdbSchema .addColumn("serviceRef", lf.Type.STRING) .addColumn("fetchFrequency", lf.Type.NUMBER) .addColumn("rules", lf.Type.OBJECT) + .addColumn("textDir", lf.Type.NUMBER) .addNullable(["iconurl", "serviceRef", "rules"]) .addIndex("idxURL", ["url"], true) @@ -48,8 +49,15 @@ export let sources: lf.schema.Table export let itemsDB: lf.Database export let items: lf.schema.Table +async function onUpgradeSourceDB(rawDb: lf.raw.BackStore) { + const version = rawDb.getVersion() + if (version < 2) { + await rawDb.addTableColumn("sources", "textDir", 0) + } +} + export async function init() { - sourcesDB = await sdbSchema.connect() + sourcesDB = await sdbSchema.connect({ onUpgrade: onUpgradeSourceDB }) sources = sourcesDB.getSchema().table("sources") itemsDB = await idbSchema.connect() items = itemsDB.getSchema().table("items") @@ -90,6 +98,7 @@ async function migrateNeDB() { // @ts-ignore delete doc._id if (!doc.fetchFrequency) doc.fetchFrequency = 0 + doc.textDir = 0 return sources.createRow(doc) }) const iRows = itemDocs.map(doc => { diff --git a/src/scripts/i18n/en-US.json b/src/scripts/i18n/en-US.json index d79e86e..8c5b1c3 100644 --- a/src/scripts/i18n/en-US.json +++ b/src/scripts/i18n/en-US.json @@ -66,7 +66,11 @@ "loadWebpage": "Load webpage", "loadFull": "Load full content", "notify": "Notify if fetched in background", - "dontNotify": "Don't notify" + "dontNotify": "Don't notify", + "textDir": "Text direction", + "LTR": "Left-to-right", + "RTL": "Right-to-left", + "Vertical": "Vertical" }, "context": { "share": "Share", diff --git a/src/scripts/i18n/zh-CN.json b/src/scripts/i18n/zh-CN.json index 8a22b62..067903a 100644 --- a/src/scripts/i18n/zh-CN.json +++ b/src/scripts/i18n/zh-CN.json @@ -66,7 +66,11 @@ "loadWebpage": "加载网页", "loadFull": "抓取全文", "notify": "后台抓取时发送通知", - "dontNotify": "不发送通知" + "dontNotify": "不发送通知", + "textDir": "文本方向", + "LTR": "从左到右", + "RTL": "从右到左", + "Vertical": "纵书" }, "context": { "share": "分享", diff --git a/src/scripts/i18n/zh-TW.json b/src/scripts/i18n/zh-TW.json index b49b098..08bce4f 100644 --- a/src/scripts/i18n/zh-TW.json +++ b/src/scripts/i18n/zh-TW.json @@ -66,7 +66,11 @@ "loadWebpage": "載入網頁", "loadFull": "抓取全文", "notify": "後臺抓取時傳送通知", - "dontNotify": "不傳送通知" + "dontNotify": "不傳送通知", + "textDir": "文本方向", + "LTR": "從左到右", + "RTL": "從右到左", + "Vertical": "縱書" }, "context": { "share": "分享", diff --git a/src/scripts/models/source.ts b/src/scripts/models/source.ts index 85c5c06..583cf7a 100644 --- a/src/scripts/models/source.ts +++ b/src/scripts/models/source.ts @@ -23,6 +23,12 @@ export const enum SourceOpenTarget { FullContent, } +export const enum SourceTextDirection { + LTR, + RTL, + Vertical, +} + export class RSSSource { sid: number url: string @@ -34,6 +40,7 @@ export class RSSSource { serviceRef?: string fetchFrequency: number // in minutes rules?: SourceRule[] + textDir: SourceTextDirection constructor(url: string, name: string = null) { this.url = url @@ -41,6 +48,7 @@ export class RSSSource { this.openTarget = SourceOpenTarget.Local this.lastFetched = new Date() this.fetchFrequency = 0 + this.textDir = SourceTextDirection.LTR } static async fetchMetaData(source: RSSSource) { diff --git a/src/scripts/settings.ts b/src/scripts/settings.ts index b716a1f..45ee994 100644 --- a/src/scripts/settings.ts +++ b/src/scripts/settings.ts @@ -3,6 +3,7 @@ import { IPartialTheme, loadTheme } from "@fluentui/react" import locales from "./i18n/_locales" import { ThemeSettings } from "../schema-types" import intl from "react-intl-universal" +import { SourceTextDirection } from "./models/source" const lightTheme: IPartialTheme = { defaultFontStyle: { @@ -119,6 +120,7 @@ export async function importAll() { } else { const sRows = configs.lovefield.sources.map(s => { s.lastFetched = new Date(s.lastFetched) + if (!s.textDir) s.textDir = SourceTextDirection.LTR return db.sources.createRow(s) }) const iRows = configs.lovefield.items.map(i => { From bba895a95e0ccef9153ed96ef2132c0a9584d0f0 Mon Sep 17 00:00:00 2001 From: Bruce Liu Date: Thu, 16 Dec 2021 15:00:48 +0800 Subject: [PATCH 4/6] add font customization --- build/resignAndPackage.sh | 20 +- dist/article/article.css | 5 + dist/article/article.html | 4 +- dist/article/article.js | 2 + dist/fontlist | Bin 0 -> 132272 bytes dist/fonts.vbs | 29 ++ electron-builder-mas.yml | 3 + electron-builder.yml | 1 + package-lock.json | 948 +++++++++++------------------------- package.json | 1 + src/bridges/settings.ts | 7 + src/bridges/utils.ts | 5 + src/components/article.tsx | 36 +- src/index.tsx | 5 + src/main/settings.ts | 8 + src/main/utils.ts | 7 + src/schema-types.ts | 1 + src/scripts/i18n/en-US.json | 4 +- src/scripts/i18n/zh-CN.json | 4 +- src/scripts/i18n/zh-TW.json | 4 +- webpack.config.js | 3 + 21 files changed, 426 insertions(+), 671 deletions(-) create mode 100755 dist/fontlist create mode 100644 dist/fonts.vbs diff --git a/build/resignAndPackage.sh b/build/resignAndPackage.sh index 61298fe..2c31b37 100644 --- a/build/resignAndPackage.sh +++ b/build/resignAndPackage.sh @@ -1,10 +1,3 @@ -# Build the MAS app -CSC_IDENTITY_AUTO_DISCOVERY=false npx electron-builder -c electron-builder-mas.yml --mac mas:universal -# Add ElectronTeamID to Info.plist -sed -i '' -e 's/<\/dict>/ElectronTeamID<\/key>EM8VE646TZ<\/string><\/dict>/g' "bin/darwin/universal/mas-universal/Fluent Reader.app/Contents/Info.plist" - -printf "......................\nresignAndPackage start\n\n" - # Name of your app. APP="Fluent Reader" # Your Certificate name. @@ -21,6 +14,17 @@ PARENT_PLIST="build/entitlements.mas.plist" CHILD_PLIST="build/entitlements.mas.inherit.plist" LOGINHELPER_PLIST="build/entitlements.mas.loginhelper.plist" FRAMEWORKS_PATH="$APP_PATH/Contents/Frameworks" + +# Build universal binary for font-list +# FONTLIST_PATH="node_modules/font-list/libs/darwin/fontlist.m" +# clang -arch arm64 -arch x86_64 "$FONTLIST_PATH" -fmodules -o "dist/fontlist" +# Build the MAS app +CSC_IDENTITY_AUTO_DISCOVERY=false npx electron-builder -c electron-builder-mas.yml --mac mas:universal +# Add ElectronTeamID to Info.plist +sed -i '' -e 's/<\/dict>/ElectronTeamID<\/key>EM8VE646TZ<\/string><\/dict>/g' "bin/darwin/universal/mas-universal/Fluent Reader.app/Contents/Info.plist" + +printf "......................\nresignAndPackage start\n\n" +codesign --deep --force --verify --verbose=4 --timestamp --options runtime --entitlements "$CHILD_PLIST" -s "$APP_KEY" "$APP_PATH/Contents/Resources/app.asar.unpacked/dist/fontlist" codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Electron Framework" codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libEGL.dylib" codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libGLESv2.dylib" @@ -44,4 +48,4 @@ codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$APP_PATH/Contents/MacO codesign -s "$APP_KEY" -f --entitlements "$PARENT_PLIST" "$APP_PATH" productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY" "$RESULT_PATH" -printf "\nresignAndPackage end\n......................\n" \ No newline at end of file +printf "\nresignAndPackage end\n......................\n" diff --git a/dist/article/article.css b/dist/article/article.css index ff336e4..68e4977 100644 --- a/dist/article/article.css +++ b/dist/article/article.css @@ -128,6 +128,11 @@ article code { font-size: 0.875rem; line-height: 1; } +article pre { + word-break: normal; + overflow-wrap: normal; + white-space: pre-wrap; +} article blockquote { border-left: 2px solid var(--gray); margin: 1em 0; diff --git a/dist/article/article.html b/dist/article/article.html index 24e76e7..c8725f6 100644 --- a/dist/article/article.html +++ b/dist/article/article.html @@ -3,14 +3,14 @@ + content="default-src 'none'; script-src-elem 'sha256-sLDWrq1tUAO8IyyqmUckFqxbXYfZ2/3TEUmtxH8Unf0=' 'sha256-iOdZeo0zvgcSuiH/7/dXCOHo7s0cn2XtsidqVOcHBjo='; img-src http: https: data:; style-src 'self' 'unsafe-inline'; frame-src http: https:; media-src http: https:; connect-src https: http:"> Article
- + \ No newline at end of file diff --git a/dist/article/article.js b/dist/article/article.js index 0a31fa8..0d8520a 100644 --- a/dist/article/article.js +++ b/dist/article/article.js @@ -20,6 +20,8 @@ async function getArticle(url) { } } document.documentElement.style.fontSize = get("s") + "px" +let font = get("f") +if (font) document.body.style.fontFamily = `"${font}"` let url = get("u") getArticle(url).then(article => { let domParser = new DOMParser() diff --git a/dist/fontlist b/dist/fontlist new file mode 100755 index 0000000000000000000000000000000000000000..3de42ab71d32a333194c80292ff25031105920dd GIT binary patch literal 132272 zcmeI*e{9_383*w9E^P^I(_R^%qQY`ef(n#efdXM#i?7$DX`8lb6Ho@)UVJ$xckP{> z*}k@+FmCJ6C>2w>6~x5YU?2?!Xc-{UF>RzjM60P1Fl`KNY=hBFDFSI4(nLDi?0M|h ziO)&X3AVrZzS3*^dEeKM?a%8Zf4$DHPrdXjAw)bT#96ej5kjNgfrn@_huUV-UWk}R zn?r-NnL`x?0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZaf&a0O$WMIAh^Fi|7JUb~bl)RuA{i z*Q(pR&k#`4bX8}lZYf=3yE{HMnr~=1Jq&f1)ew%SjSuIb5)P$w+;Y|#Yl`N({w6=) zIch`@2Pf33eB<}W`DETG_8B$}isoxo`5ILMj@f;zOt`;p$F&P)uNn}|w^ili`QyTI zxK!n)4k@kd=5ARs+`Ormj0yMGuktNbNjMIdiTTRrwt|_H1+&MZfzkULRQdQF;=*w> zhu`CG`8{c(36yeWx-%^^8`gLDZ;R&7gP^@vB71)RpeE>8%3dq;faXeUqbWmFUfI6qm2b=~l8;hE^5t|_r&d*> z`I;)#^T2WV{(|#@{rK<8w$luKylmT)lSzXP?j zuTU72dxwN*r{GQ6^Egh!bCTFE#7x@1M*AbQpGB3&aS5)$WBD0)u1;45>HNSjJcd62 zlcdTYhDntjJ5?-XQ@Q?Pj$$qgsPcWhwP5den`T{oY;f_WmmmAn$a&XLTaqf@gMapH z@7T9I9KV8E6JDRcSwxS^dHDBtxbStGsB)iAS5L1S2hP+lRH5$l6f<;_^O(PEWNdhsaRWckyn>M`m%w@-squc5zuNT} zwN|_GUyjCfSXGG2XcW&|t$JTBS24ebC=h@E1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_@Yxl(xpmjy zT6eymJly;-Bka2Cqt;#Je+=_->DFD%!>zlQtx412?(43k-ROCBF>XIh@j@>?>5b!f zffs+^#jmv9zwARg8Wh9laKrAqhKJ|U!PP^pI}atld~jg2;gCk@8eZ|XM`+u2|3$}X zm+lyC_?Zx5AYVt@<9{C=9nCN1qqq2o4#e@_&{2aXoV;!uxfaWG*XbrL0=9*|RWB6v zY>^fRnr@3;DijNbBXWk*Z5R4@sUV+D_b)Ew11jM?uZ85bl1pjNmDj0r;bUH7$*V0B z-r3wbe&9uuY>ueKp~3ocf32lIP@7~tnjioH2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0ucD*0!8)z*}K#}tMwqbS~!cGjF zr%5Zjxm%W;-VVdeiOTS(DzO3Y)*NxJM%mk}UNIn?+F-n1b}ic|8oFb&TUN2%>f`Rj z>AK5Kp8CBKlVZAv%Tit%+l}tBYskEz^J86H(hH_&h|{PVF?5$ddhFnNis#e`(Nqy4 zM#nsCZY)7tKR(}!g&11y#~1qT)3~3@LaKBgpXL?%Yy!tMDipdOPY>cdBJtix{3Ac+ zTk#4fnnCp}s>SVJxnG-ipc>d=P-+a0%z;cBvN68*bjzOU4Ahohsi_m4xGPnV7F^ zZlmuz$b#8p(ZJ~Q?o;`A&be?L&Efa>Tb|b@Z(diXJJT|=VSR@`yPA5bXz!KCo}WLc z{B;E>d#%v4QapLSB#rfo7W$|HHSjkP#y-M8$21Q;;faXmOVar~uSu$0I1c8-Ylv*r zJQPaw;R~jV=F{kW&d1+m;KFg-JDPmMZo^dlJfSg_h#SRT(fnOt7UWj<HP3>avaV_X{z##|NdxOy?$-;%GLhc zK_AeFJSW9m2Gu0;HMjB^AG6YZZv4N0o}^PVa@cB)v&ruh366mwZXmG5Im>ES1qzO%gRr?aLV?R@cf zhp(ZwB-I#I|Lob`v2S-ceg(CL;TF;JaUTBt6)t?;CaT=$zXSC&g|YE_q5J9RcU+^? zxT2BntC022=JUEj=gq9UftaomDSvRPt&p{KyFb-p({Gt=mc7MErThBU7Tm_3pe1#S zVLJu-&`T<#`Y0dg&4=;|v5fwDJUCU}41Lk1#VVUQ-KA`kZq(5QYi~<1& zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0ucDj2#nUmUO%~`=Bbkh#hzMG+4SVW&+mKrVEw*Fch>KF ztfu~>dLj0{Jxh$x+R8yur+NEWOdFy9;l7vKV$-z|TCeIKpRJA1TKK)gHR2}(I7sVe z_Z+VgdltpS2rY1=JlY5?pxpcD!LRH)xg+xwU38{gFT3&1meXCw5>e(VKlQi8Hy;LX`3`gV)r`s;{@uEq89V!3s zc`o5SFEQjbqqJVus~gpNaE^JcDX%(BP*p{(woO$0mPEy0qL`@o>rxXHe?YQwgdUnp zuwFg9lu`3~uz>&sAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2teSI3i$soJ|Q0P zz7voTPpdusQ)w<0Z;K5CAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=|962T zT_I1kLUjh!7}cPt?*Mq=eA+Hi9egY_8m*}Y+VOc~?Um~GX>lQ@C#bHVx>bmp?+6ip zgT~199c@;xkXCkcx75q7WgA69cZ_z+Dz;mFr|Bp=dDT;LdOHj=C!~~_mW*XOu5P*= zu3a#DGezBTHW@vJZJ6DLkQ-L4$;eDwx}!s0N|$Z1On04b>b-_d_Ysp~x`@kCUK-nt z?y_shyrJi)>*A7LFhv91zo-#M?^2Hy9B}j87(Eyje*W{R&ZUE+%l-I5zkM3*yt0tC z)Xk@Pg+I4Iag7Rv?#E;7cSPd7k(d+lV4kU zp6jw+Io>lg?f0+0z9qh)Yx?M&FWh;@J%9M+?$%w4e|)C?(xIP^YG)sgy|CcvdC#AE z;J!uKuU0O<_x(*b-M1qfdu{diPJZLr$MgGF?fm2YO$VR2;Ojs5;sYm^-1ys7&)qh7 z?2&I*)_m&gpXvT?`|!D!UKo9;vtdo$J9BT|B98R#7=32xWp`hH-PM1|uO8WWrt?2- q|HG9x4m>-n^!~@?o$mLa`r0G^y59c6KkuB;n{3*6{Mg2$H~a@y)X_}< literal 0 HcmV?d00001 diff --git a/dist/fonts.vbs b/dist/fonts.vbs new file mode 100644 index 0000000..3126578 --- /dev/null +++ b/dist/fonts.vbs @@ -0,0 +1,29 @@ +Option Explicit + +Dim objShell, objFSO, objFile, objFolder +Dim objFolderItem, colItems, objFont +Dim strFileName + + +Const FONTS = &H14& ' Fonts Folder + +' Instantiate Objects +Set objShell = CreateObject("Shell.Application") +Set objFolder = objShell.Namespace(FONTS) +Set objFolderItem = objFolder.Self +Set colItems = objFolder.Items +Set objFSO = CreateObject("Scripting.FileSystemObject") + +For Each objFont in colItems + WScript.StdOut.WriteLine(objFont.Path & vbtab & objFont.Name) +Next + +Set objShell = nothing +Set objFile = nothing +Set objFolder = nothing +Set objFolderItem = nothing +Set colItems = nothing +Set objFont = nothing +Set objFSO = nothing + +wscript.quit diff --git a/electron-builder-mas.yml b/electron-builder-mas.yml index de4586a..a8ca139 100644 --- a/electron-builder-mas.yml +++ b/electron-builder-mas.yml @@ -4,7 +4,10 @@ productName: Fluent Reader copyright: Copyright © 2020 Haoyuan Liu files: - "./dist/**/*" + - "!./dist/fonts.vbs" - "!**/*.js.map" +asarUnpack: + - "./dist/fontlist" directories: output: "./bin/${platform}/${arch}/" mac: diff --git a/electron-builder.yml b/electron-builder.yml index 74e3788..c4a389f 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -3,6 +3,7 @@ productName: Fluent Reader copyright: Copyright © 2020 Haoyuan Liu files: - "./dist/**/*" + - "!./dist/fontlist" - "!**/*.js.map" directories: output: "./bin/${platform}/${arch}/" diff --git a/package-lock.json b/package-lock.json index c07bd04..69ad249 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,8 +6,11 @@ "packages": { "": { "name": "fluent-reader", - "version": "1.0.2", + "version": "1.1.0", "license": "BSD-3-Clause", + "dependencies": { + "font-list": "^1.4.2" + }, "devDependencies": { "@fluentui/react": "^7.126.2", "@types/lovefield": "^2.1.3", @@ -907,12 +910,12 @@ "dev": true }, "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "dependencies": { - "string-width": "^3.0.0" + "string-width": "^4.1.0" } }, "node_modules/ansi-regex": { @@ -1404,9 +1407,9 @@ } }, "node_modules/boxen/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" @@ -1473,12 +1476,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/boxen/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1488,29 +1485,6 @@ "node": ">=8" } }, - "node_modules/boxen/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/boxen/node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -2206,6 +2180,26 @@ "node": ">=6" } }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/cliui/node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -3124,9 +3118,9 @@ } }, "node_modules/electron-builder/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" @@ -3192,12 +3186,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/electron-builder/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/electron-builder/node_modules/fs-extra": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", @@ -3221,15 +3209,6 @@ "node": ">=8" } }, - "node_modules/electron-builder/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/electron-builder/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -3242,20 +3221,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/electron-builder/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/electron-builder/node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -3570,9 +3535,9 @@ "dev": true }, "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/emojis-list": { @@ -3789,24 +3754,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -4242,6 +4189,11 @@ "readable-stream": "^2.3.6" } }, + "node_modules/font-list": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/font-list/-/font-list-1.4.2.tgz", + "integrity": "sha512-vPekA+sinAymEkNHwnOse0D75phwNvH/E0z/mJSgGoCBVKy+rLZzd3HziYVwlII34bb0ZYOKBbM36s2bfCaR1A==" + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4966,9 +4918,9 @@ "dev": true }, "node_modules/interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, "engines": { "node": ">= 0.10" @@ -5004,15 +4956,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -5266,15 +5209,6 @@ "node": ">= 0.4" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -5486,18 +5420,6 @@ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", "dev": true }, - "node_modules/lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "dependencies": { - "invert-kv": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/lie": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", @@ -5692,18 +5614,6 @@ "semver": "bin/semver" } }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -5749,20 +5659,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", @@ -6108,22 +6004,10 @@ "node": ">=4" } }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "dependencies": { "boolbase": "^1.0.0" @@ -6294,20 +6178,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "node_modules/os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "dependencies": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -6317,33 +6187,6 @@ "node": ">=6" } }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -6588,14 +6431,13 @@ } }, "node_modules/plist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.3.tgz", - "integrity": "sha512-ghdOKN99hh1oEmAlwBmPYo4L+tSQ7O3jRpkhWqOrMz86CWotpVzMevvQ+czo7oPDpOZyA6K06Ci7QVHpoh9gaA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", + "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", "dev": true, "dependencies": { "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.6.0" + "xmlbuilder": "^9.0.7" }, "engines": { "node": ">=6" @@ -7806,38 +7648,47 @@ } }, "node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/string.prototype.trimend": { @@ -7900,15 +7751,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -8609,9 +8451,9 @@ "dev": true }, "node_modules/v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "node_modules/verror": { @@ -8951,75 +8793,31 @@ } }, "node_modules/webpack-cli": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", - "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "dependencies": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { "node": ">=6.11.5" - } - }, - "node_modules/webpack-cli/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/webpack-cli/node_modules/enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/webpack-cli/node_modules/loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack-cli/node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "peerDependencies": { + "webpack": "4.x.x" } }, "node_modules/webpack-cli/node_modules/supports-color": { @@ -9205,56 +9003,6 @@ "node": ">=8" } }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/widest-line/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -9287,6 +9035,26 @@ "node": ">=6" } }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -9388,15 +9156,6 @@ "node": ">=4.0" } }, - "node_modules/xmldom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", - "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9419,22 +9178,21 @@ "dev": true }, "node_modules/yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" + "yargs-parser": "^13.1.2" } }, "node_modules/yargs-parser": { @@ -9447,6 +9205,47 @@ "decamelize": "^1.2.0" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -10253,12 +10052,12 @@ "dev": true }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" + "string-width": "^4.1.0" } }, "ansi-regex": { @@ -10660,9 +10459,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -10705,35 +10504,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -11326,6 +11102,23 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -12067,9 +11860,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -12117,12 +11910,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "fs-extra": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", @@ -12140,12 +11927,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -12156,17 +11937,6 @@ "universalify": "^2.0.0" } }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -12422,9 +12192,9 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "emojis-list": { @@ -12593,21 +12363,6 @@ "safe-buffer": "^5.1.1" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -12981,6 +12736,11 @@ "readable-stream": "^2.3.6" } }, + "font-list": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/font-list/-/font-list-1.4.2.tgz", + "integrity": "sha512-vPekA+sinAymEkNHwnOse0D75phwNvH/E0z/mJSgGoCBVKy+rLZzd3HziYVwlII34bb0ZYOKBbM36s2bfCaR1A==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -13568,9 +13328,9 @@ "dev": true }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "intl": { @@ -13603,12 +13363,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -13796,12 +13550,6 @@ "has": "^1.0.3" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -13979,15 +13727,6 @@ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "lie": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", @@ -14146,15 +13885,6 @@ } } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -14191,17 +13921,6 @@ "safe-buffer": "^5.1.2" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", @@ -14499,19 +14218,10 @@ "pify": "^3.0.0" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, "nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "requires": { "boolbase": "^1.0.0" @@ -14651,41 +14361,12 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -14884,14 +14565,13 @@ } }, "plist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.3.tgz", - "integrity": "sha512-ghdOKN99hh1oEmAlwBmPYo4L+tSQ7O3jRpkhWqOrMz86CWotpVzMevvQ+czo7oPDpOZyA6K06Ci7QVHpoh9gaA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", + "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", "dev": true, "requires": { "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.6.0" + "xmlbuilder": "^9.0.7" }, "dependencies": { "xmlbuilder": { @@ -15933,29 +15613,35 @@ } }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -16011,12 +15697,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -16592,9 +16272,9 @@ "dev": true }, "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "verror": { @@ -17004,62 +16684,24 @@ } }, "webpack-cli": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", - "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" }, "dependencies": { - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -17103,46 +16745,6 @@ "dev": true, "requires": { "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "worker-farm": { @@ -17171,6 +16773,23 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -17258,12 +16877,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, - "xmldom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", - "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -17283,22 +16896,55 @@ "dev": true }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "yargs-parser": { diff --git a/package.json b/package.json index 0f852cb..d740729 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "electron-react-devtools": "^0.5.3", "electron-store": "^5.2.0", "electron-window-state": "^5.0.3", + "font-list": "^1.4.2", "hard-source-webpack-plugin": "^0.13.1", "html-webpack-plugin": "^4.3.0", "js-md5": "^0.7.3", diff --git a/src/bridges/settings.ts b/src/bridges/settings.ts index 0fbb636..c20c459 100644 --- a/src/bridges/settings.ts +++ b/src/bridges/settings.ts @@ -75,6 +75,13 @@ const settingsBridge = { ipcRenderer.invoke("set-font-size", size) }, + getFont: (): string => { + return ipcRenderer.sendSync("get-font") + }, + setFont: (font: string) => { + ipcRenderer.invoke("set-font", font) + }, + getFetchInterval: (): number => { return ipcRenderer.sendSync("get-fetch-interval") }, diff --git a/src/bridges/utils.ts b/src/bridges/utils.ts index 35349bf..4c43502 100644 --- a/src/bridges/utils.ts +++ b/src/bridges/utils.ts @@ -170,11 +170,16 @@ const utilsBridge = { destroyTouchBar: () => { ipcRenderer.invoke("touchbar-destroy") }, + + initFontList: (): Promise> => { + return ipcRenderer.invoke("init-font-list") + }, } declare global { interface Window { utils: typeof utilsBridge + fontList: Array } } diff --git a/src/components/article.tsx b/src/components/article.tsx index ce35f39..69ec69a 100644 --- a/src/components/article.tsx +++ b/src/components/article.tsx @@ -38,6 +38,7 @@ type ArticleProps = { } type ArticleState = { + fontFamily: string fontSize: number loadWebpage: boolean loadFull: boolean @@ -53,7 +54,8 @@ class Article extends React.Component { constructor(props: ArticleProps) { super(props) this.state = { - fontSize: this.getFontSize(), + fontFamily: window.settings.getFont(), + fontSize: window.settings.getFontSize(), loadWebpage: props.source.openTarget === SourceOpenTarget.Webpage, loadFull: props.source.openTarget === SourceOpenTarget.FullContent, fullContent: "", @@ -68,15 +70,16 @@ class Article extends React.Component { this.loadFull() } - getFontSize = () => { - return window.settings.getFontSize() - } setFontSize = (size: number) => { window.settings.setFontSize(size) this.setState({ fontSize: size }) } + setFont = (font: string) => { + window.settings.setFont(font) + this.setState({ fontFamily: font }) + } - fontMenuProps = (): IContextualMenuProps => ({ + fontSizeMenuProps = (): IContextualMenuProps => ({ items: FONT_SIZE_OPTIONS.map(size => ({ key: String(size), text: String(size), @@ -86,6 +89,16 @@ class Article extends React.Component { })), }) + fontFamilyMenuProps = (): IContextualMenuProps => ({ + items: window.fontList.map((font, idx) => ({ + key: String(idx), + text: font === "" ? intl.get("default") : font, + canCheck: true, + checked: this.state.fontFamily === font, + onClick: () => this.setFont(font) + })) + }) + updateTextDirection = (direction: SourceTextDirection) => { this.props.updateSourceTextDirection(this.props.source, direction) } @@ -154,10 +167,17 @@ class Article extends React.Component { }, { key: "fontMenu", + text: intl.get("article.font"), + iconProps: { iconName: "Font" }, + disabled: this.state.loadWebpage, + subMenuProps: this.fontFamilyMenuProps(), + }, + { + key: "fontSizeMenu", text: intl.get("article.fontSize"), iconProps: { iconName: "FontSize" }, disabled: this.state.loadWebpage, - subMenuProps: this.fontMenuProps(), + subMenuProps: this.fontSizeMenuProps(), }, { key: "directionMenu", @@ -334,7 +354,9 @@ class Article extends React.Component { ) ) - return `article/article.html?a=${a}&h=${h}&s=${ + return `article/article.html?a=${a}&h=${h}&f=${ + encodeURIComponent(this.state.fontFamily) + }&s=${ this.state.fontSize }&d=${ this.props.source.textDir diff --git a/src/index.tsx b/src/index.tsx index 2cdbd2f..cce7bfb 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -26,6 +26,11 @@ window.utils.addMainContextListener((pos, text) => { store.dispatch(openTextMenu(pos, text)) }) +window.fontList = [""] +window.utils.initFontList().then((fonts) => { + window.fontList.push(...fonts) +}) + ReactDOM.render( diff --git a/src/main/settings.ts b/src/main/settings.ts index 66e9b66..e6e6a02 100644 --- a/src/main/settings.ts +++ b/src/main/settings.ts @@ -122,6 +122,14 @@ ipcMain.handle("set-font-size", (_, size: number) => { store.set(FONT_SIZE_STORE_KEY, size) }) +const FONT_STORE_KEY = "fontFamily" +ipcMain.on("get-font", event => { + event.returnValue = store.get(FONT_STORE_KEY, "") +}) +ipcMain.handle("set-font", (_, font: string) => { + store.set(FONT_STORE_KEY, font) +}) + ipcMain.on("get-all-settings", event => { let output = {} for (let [key, value] of store) { diff --git a/src/main/utils.ts b/src/main/utils.ts index 6d38a12..bd50ece 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -10,6 +10,7 @@ import { WindowManager } from "./window" import fs = require("fs") import { ImageCallbackTypes, TouchBarTexts } from "../schema-types" import { initMainTouchBar } from "./touchbar" +import fontList = require('font-list') export function setUtilsListeners(manager: WindowManager) { async function openExternal(url: string, background = false) { @@ -283,4 +284,10 @@ export function setUtilsListeners(manager: WindowManager) { ipcMain.handle("touchbar-destroy", () => { if (manager.hasWindow()) manager.mainWindow.setTouchBar(null) }) + + ipcMain.handle("init-font-list", () => { + return fontList.getFonts({ + disableQuoting: true, + }) + }) } diff --git a/src/schema-types.ts b/src/schema-types.ts index d9c2b4e..45dcc77 100644 --- a/src/schema-types.ts +++ b/src/schema-types.ts @@ -88,6 +88,7 @@ export type SchemaTypes = { locale: string sourceGroups: SourceGroup[] fontSize: number + fontFamily: string menuOn: boolean fetchInterval: number searchEngine: SearchEngines diff --git a/src/scripts/i18n/en-US.json b/src/scripts/i18n/en-US.json index 8c5b1c3..76f0442 100644 --- a/src/scripts/i18n/en-US.json +++ b/src/scripts/i18n/en-US.json @@ -18,6 +18,7 @@ "confirmMarkAll": "Do you really want to mark all articles on this page as read?", "confirm": "Confirm", "cancel": "Cancel", + "default": "Default", "time": { "now": "now", "m": "m", @@ -70,7 +71,8 @@ "textDir": "Text direction", "LTR": "Left-to-right", "RTL": "Right-to-left", - "Vertical": "Vertical" + "Vertical": "Vertical", + "font": "Font" }, "context": { "share": "Share", diff --git a/src/scripts/i18n/zh-CN.json b/src/scripts/i18n/zh-CN.json index 067903a..81c16cb 100644 --- a/src/scripts/i18n/zh-CN.json +++ b/src/scripts/i18n/zh-CN.json @@ -18,6 +18,7 @@ "confirmMarkAll": "确认将本页所有文章标为已读?", "confirm": "确认", "cancel": "取消", + "default": "默认", "time": { "now": "now", "m": "m", @@ -70,7 +71,8 @@ "textDir": "文本方向", "LTR": "从左到右", "RTL": "从右到左", - "Vertical": "纵书" + "Vertical": "纵书", + "font": "字体" }, "context": { "share": "分享", diff --git a/src/scripts/i18n/zh-TW.json b/src/scripts/i18n/zh-TW.json index 08bce4f..10adf00 100644 --- a/src/scripts/i18n/zh-TW.json +++ b/src/scripts/i18n/zh-TW.json @@ -18,6 +18,7 @@ "confirmMarkAll": "確認將本頁所有文章標為已讀?", "confirm": "確認", "cancel": "取消", + "default": "預設", "time": { "now": "now", "m": "m", @@ -70,7 +71,8 @@ "textDir": "文本方向", "LTR": "從左到右", "RTL": "從右到左", - "Vertical": "縱書" + "Vertical": "縱書", + "font": "字體" }, "context": { "share": "分享", diff --git a/webpack.config.js b/webpack.config.js index 978f39f..5492a13 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -23,6 +23,9 @@ module.exports = [ path: __dirname + "/dist", filename: "electron.js", }, + node: { + __dirname: false + }, plugins: [new HardSourceWebpackPlugin()], }, { From 7092a57b2c3003e95a36fc05176bc6691ff08603 Mon Sep 17 00:00:00 2001 From: Bruce Liu Date: Thu, 16 Dec 2021 16:49:21 +0800 Subject: [PATCH 5/6] update locales and context menu --- dist/styles/global.css | 4 ++++ electron-builder-mas.yml | 1 + electron-builder.yml | 2 ++ src/components/settings/app.tsx | 1 + src/scripts/i18n/_locales.ts | 2 ++ src/scripts/i18n/{ko-KR.json => ko.json} | 0 src/scripts/i18n/sv.json | 2 +- 7 files changed, 11 insertions(+), 1 deletion(-) rename src/scripts/i18n/{ko-KR.json => ko.json} (100%) diff --git a/dist/styles/global.css b/dist/styles/global.css index 07bb233..fa934eb 100644 --- a/dist/styles/global.css +++ b/dist/styles/global.css @@ -138,6 +138,10 @@ i.ms-Nav-chevron { color: var(--neutralPrimary); } +.ms-Callout-main { + border-radius: 5px; +} + #root > nav { height: var(--navHeight); -webkit-app-region: drag; diff --git a/electron-builder-mas.yml b/electron-builder-mas.yml index a8ca139..48018d0 100644 --- a/electron-builder-mas.yml +++ b/electron-builder-mas.yml @@ -28,6 +28,7 @@ mac: - uk - it - nl + - ko minimumSystemVersion: 10.14.0 mas: entitlements: build/entitlements.mas.plist diff --git a/electron-builder.yml b/electron-builder.yml index c4a389f..047ed1d 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -25,6 +25,7 @@ mac: - uk - it - nl + - ko win: target: - nsis @@ -47,6 +48,7 @@ appx: - uk - it - nl + - ko showNameOnTiles: true setBuildNumber: true nsis: diff --git a/src/components/settings/app.tsx b/src/components/settings/app.tsx index 1d0cf95..4279698 100644 --- a/src/components/settings/app.tsx +++ b/src/components/settings/app.tsx @@ -140,6 +140,7 @@ class AppTab extends React.Component { { key: "sv", text: "Svenska" }, { key: "tr", text: "Türkçe" }, { key: "uk", text: "Українська" }, + { key: "ko", text: "한글" }, { key: "ja", text: "日本語" }, { key: "zh-CN", text: "中文(简体)" }, { key: "zh-TW", text: "中文(繁體)" }, diff --git a/src/scripts/i18n/_locales.ts b/src/scripts/i18n/_locales.ts index 9aa9de0..187ca82 100644 --- a/src/scripts/i18n/_locales.ts +++ b/src/scripts/i18n/_locales.ts @@ -12,6 +12,7 @@ import it from "./it.json" import uk from "./uk.json" import pt_BR from "./pt-BR.json" import fi_FI from "./fi-FI.json" +import ko from "./ko.json" const locales = { "en-US": en_US, @@ -28,6 +29,7 @@ const locales = { "uk": uk, "pt-BR": pt_BR, "fi-FI": fi_FI, + "ko": ko, } export default locales diff --git a/src/scripts/i18n/ko-KR.json b/src/scripts/i18n/ko.json similarity index 100% rename from src/scripts/i18n/ko-KR.json rename to src/scripts/i18n/ko.json diff --git a/src/scripts/i18n/sv.json b/src/scripts/i18n/sv.json index 1887d74..b3e8e0e 100644 --- a/src/scripts/i18n/sv.json +++ b/src/scripts/i18n/sv.json @@ -211,7 +211,7 @@ "cacheSize": "Cache-lagra {size} data", "deleteChoices": "Ta bort artiklar från ... dagar sedan", "confirmDelete": "Ta bort", - "daysAgo": "{day, plural, =1 {# dag} other {# dagar}} sedan", + "daysAgo": "{days, plural, =1 {# dag} other {# dagar}} sedan", "deleteAll": "Ta bort alla artiklar", "calculatingSize": "Beräknar storlek...", "itemSize": "Omkring {size} lokal datalagring upptas av artiklar", From dea293683a054e2861cc1c3cf26f67bd2db4d524 Mon Sep 17 00:00:00 2001 From: Bruce Liu Date: Thu, 16 Dec 2021 17:26:30 +0800 Subject: [PATCH 6/6] release build 1.1.0 --- src/components/article.tsx | 34 ++++++++++++++++------------ src/components/settings/app.tsx | 1 - src/containers/article-container.tsx | 6 ++++- src/index.tsx | 2 +- src/main/utils.ts | 18 ++++++--------- src/scripts/i18n/README.md | 1 + src/scripts/models/source.ts | 2 +- webpack.config.js | 2 +- 8 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/components/article.tsx b/src/components/article.tsx index 69ec69a..e779fc2 100644 --- a/src/components/article.tsx +++ b/src/components/article.tsx @@ -12,7 +12,11 @@ import { Icon, Link, } from "@fluentui/react" -import { RSSSource, SourceOpenTarget, SourceTextDirection } from "../scripts/models/source" +import { + RSSSource, + SourceOpenTarget, + SourceTextDirection, +} from "../scripts/models/source" import { shareSubmenu } from "./context-menu" import { platformCtrl, decodeFetchResponse } from "../scripts/utils" @@ -95,8 +99,8 @@ class Article extends React.Component { text: font === "" ? intl.get("default") : font, canCheck: true, checked: this.state.fontFamily === font, - onClick: () => this.setFont(font) - })) + onClick: () => this.setFont(font), + })), }) updateTextDirection = (direction: SourceTextDirection) => { @@ -111,7 +115,8 @@ class Article extends React.Component { iconProps: { iconName: "Forward" }, canCheck: true, checked: this.props.source.textDir === SourceTextDirection.LTR, - onClick: () => this.updateTextDirection(SourceTextDirection.LTR), + onClick: () => + this.updateTextDirection(SourceTextDirection.LTR), }, { key: "RTL", @@ -119,17 +124,20 @@ class Article extends React.Component { iconProps: { iconName: "Back" }, canCheck: true, checked: this.props.source.textDir === SourceTextDirection.RTL, - onClick: () => this.updateTextDirection(SourceTextDirection.RTL), + onClick: () => + this.updateTextDirection(SourceTextDirection.RTL), }, { key: "Vertical", text: intl.get("article.Vertical"), iconProps: { iconName: "Down" }, canCheck: true, - checked: this.props.source.textDir === SourceTextDirection.Vertical, - onClick: () => this.updateTextDirection(SourceTextDirection.Vertical), + checked: + this.props.source.textDir === SourceTextDirection.Vertical, + onClick: () => + this.updateTextDirection(SourceTextDirection.Vertical), }, - ] + ], }) moreMenuProps = (): IContextualMenuProps => ({ @@ -354,13 +362,9 @@ class Article extends React.Component { ) ) - return `article/article.html?a=${a}&h=${h}&f=${ - encodeURIComponent(this.state.fontFamily) - }&s=${ - this.state.fontSize - }&d=${ - this.props.source.textDir - }&u=${ + return `article/article.html?a=${a}&h=${h}&f=${encodeURIComponent( + this.state.fontFamily + )}&s=${this.state.fontSize}&d=${this.props.source.textDir}&u=${ this.props.item.link }&m=${this.state.loadFull ? 1 : 0}` } diff --git a/src/components/settings/app.tsx b/src/components/settings/app.tsx index 4279698..a5c6f68 100644 --- a/src/components/settings/app.tsx +++ b/src/components/settings/app.tsx @@ -20,7 +20,6 @@ import { DefaultButton, ChoiceGroup, IChoiceGroupOption, - loadTheme, Dropdown, IDropdownOption, PrimaryButton, diff --git a/src/containers/article-container.tsx b/src/containers/article-container.tsx index c09d7df..0a7ae8b 100644 --- a/src/containers/article-container.tsx +++ b/src/containers/article-container.tsx @@ -17,7 +17,11 @@ import { closeContextMenu, openImageMenu, } from "../scripts/models/app" -import { RSSSource, SourceTextDirection, updateSource } from "../scripts/models/source" +import { + RSSSource, + SourceTextDirection, + updateSource, +} from "../scripts/models/source" type ArticleContainerProps = { itemId: number diff --git a/src/index.tsx b/src/index.tsx index cce7bfb..cb98426 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -27,7 +27,7 @@ window.utils.addMainContextListener((pos, text) => { }) window.fontList = [""] -window.utils.initFontList().then((fonts) => { +window.utils.initFontList().then(fonts => { window.fontList.push(...fonts) }) diff --git a/src/main/utils.ts b/src/main/utils.ts index bd50ece..bcd1715 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -1,16 +1,9 @@ -import { - ipcMain, - shell, - dialog, - app, - session, - clipboard, -} from "electron" +import { ipcMain, shell, dialog, app, session, clipboard } from "electron" import { WindowManager } from "./window" import fs = require("fs") import { ImageCallbackTypes, TouchBarTexts } from "../schema-types" import { initMainTouchBar } from "./touchbar" -import fontList = require('font-list') +import fontList = require("font-list") export function setUtilsListeners(manager: WindowManager) { async function openExternal(url: string, background = false) { @@ -28,9 +21,12 @@ export function setUtilsListeners(manager: WindowManager) { } app.on("web-contents-created", (_, contents) => { - contents.setWindowOpenHandler((details) => { + contents.setWindowOpenHandler(details => { if (contents.getType() === "webview") - openExternal(details.url, details.disposition === "background-tab") + openExternal( + details.url, + details.disposition === "background-tab" + ) return { action: manager.hasWindow() ? "deny" : "allow", } diff --git a/src/scripts/i18n/README.md b/src/scripts/i18n/README.md index 97813ad..5cf0889 100644 --- a/src/scripts/i18n/README.md +++ b/src/scripts/i18n/README.md @@ -18,5 +18,6 @@ Currently, Fluent Reader supports the following languages. | nl | Nederlands | [@Vistaus](https://github.com/Vistaus) | | it | Italiano | [@andrewasd](https://github.com/andrewasd) | | pt-BR | Português do Brasil | [@fabianski7](https://github.com/fabianski7) | +| ko | 한글 | [@1drive](https://github.com/1drive) | Refer to the repo of [react-intl-universal](https://github.com/alibaba/react-intl-universal) to get started on internationalization. diff --git a/src/scripts/models/source.ts b/src/scripts/models/source.ts index 583cf7a..66ed585 100644 --- a/src/scripts/models/source.ts +++ b/src/scripts/models/source.ts @@ -491,7 +491,7 @@ export function sourceReducer( } case MARK_ALL_READ: { let nextState = { ...state } - action.sids.forEach((sid) => { + action.sids.forEach(sid => { nextState[sid] = { ...state[sid], unreadCount: action.time ? state[sid].unreadCount : 0, diff --git a/webpack.config.js b/webpack.config.js index 5492a13..0b995a3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -24,7 +24,7 @@ module.exports = [ filename: "electron.js", }, node: { - __dirname: false + __dirname: false, }, plugins: [new HardSourceWebpackPlugin()], },