diff --git a/.vscode/settings.json b/.vscode/settings.json index da17ce1..25d9778 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ ".command": true, ".babelrc": true }, - "files.autoSave": "onFocusChange", - "prettier.singleQuote": true + "files.autoSave": "afterDelay", + "prettier.singleQuote": true, + "typescript.tsdk": "node_modules/typescript/lib" } diff --git a/extension/src/background/index.ts b/extension/src/background/index.ts index 27dc459..cbff5ad 100644 --- a/extension/src/background/index.ts +++ b/extension/src/background/index.ts @@ -4,8 +4,3 @@ export type OptionProps = { en: boolean; jp: boolean; }; - -export interface BGWindow extends Window { - setOptions(key: K, val: OptionProps[K]): void; - getOptions(): OptionProps; -} diff --git a/extension/src/background/main.ts b/extension/src/background/main.ts index 1b9cb37..caef5d1 100644 --- a/extension/src/background/main.ts +++ b/extension/src/background/main.ts @@ -1,27 +1,18 @@ -import { BackgroundAction } from '../shared/enums'; import { PageScriptAction } from '../shared/enums'; import getOptions from './options'; import notify from './notifics'; import { host } from '../fetch'; import Fetch from '../fetch'; -import play from './player'; type Message = { action: PageScriptAction; data: any }; + chrome.runtime.onMessage.addListener( - ({ action, data }: Message, sender, sendRes) => { + ({ action, data }: Message, _, sendRes: (worddata: any[]) => void) => { const { on, jp } = getOptions(); if (!on) { return false; } switch (action) { - case PageScriptAction.PLAY_SOUND: - play(data, data => { - chrome.tabs.sendMessage(sender.tab!.id!, { - action: BackgroundAction.PLAY_ERROR, - data, - }); - }); - return false; case PageScriptAction.SEARCH_TEXT: Fetch.search(data).then(worddata => { if (!jp && data.lang === 'zh') { @@ -51,7 +42,13 @@ chrome.runtime.onMessage.addListener( case PageScriptAction.WORD_VIEWED: return false; default: - throw `Unknown action: ${action}`; + return false; } } ); + +chrome.offscreen.createDocument({ + url: 'offscreen.html', + reasons: [chrome.offscreen.Reason.AUDIO_PLAYBACK], + justification: 'play audio', // details for using the API +}); diff --git a/extension/src/background/notifics.ts b/extension/src/background/notifics.ts index cf4af6d..2903482 100644 --- a/extension/src/background/notifics.ts +++ b/extension/src/background/notifics.ts @@ -11,7 +11,7 @@ export default (title: string, message: string, buttons: Button[] = []) => { listeners[notificationId] = buttons.map(({ onClick }) => onClick); } chrome.notifications.create(notificationId, { - iconUrl: chrome.extension.getURL('enabled/icon32.png'), + iconUrl: chrome.runtime.getURL('enabled/icon32.png'), buttons: buttons.map(({ title }) => ({ title })), type: 'basic', silent: true, diff --git a/extension/src/background/options.ts b/extension/src/background/options.ts index 47f72bd..e06cea3 100644 --- a/extension/src/background/options.ts +++ b/extension/src/background/options.ts @@ -1,6 +1,4 @@ -import { BGWindow, OptionProps } from '.'; - -declare const window: BGWindow; +import { OptionProps } from '.'; let options: OptionProps = { on: true, @@ -19,22 +17,20 @@ const dIcons = { const { icons: eIcons } = chrome.runtime.getManifest(); function setIcon(enabled: boolean) { - chrome.browserAction.setIcon({ + chrome.action.setIcon({ path: enabled ? eIcons : dIcons, }); } -chrome.browserAction.onClicked.addListener(() => { - window.setOptions('on', !options.on); +chrome.action.onClicked.addListener(() => { + setOptions('on', !options.on); }); export default function getOptions() { return options; } -window.getOptions = getOptions; - -window.setOptions = (key, val) => { +const setOptions = (key, val) => { if (key === 'on') { setIcon(val); } diff --git a/extension/src/background/player.ts b/extension/src/background/player.ts deleted file mode 100644 index df6c386..0000000 --- a/extension/src/background/player.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { PageScriptData } from '../shared/types'; -import { Cache } from './cache'; -import { host } from '../fetch'; -const URLXD = { - zh: [`${host}/static/pron/zh/`, `.ogg`], - uk: [`${host}/static/pron/uk/`, `.mp3`], - us: [`${host}/static/pron/us/`, `.mp3`], - jp: [`${host}/static/pron/jp/`, `.wav`], -}; - -const cache = new Cache(128); -/** - * `code` formats: - * - * 1. `zh:pin1` - * 2. `uk:C7IZLO-RJ` - * 3. `us:F7I-NLO-KJ` - * 3. `jp:sik6` - * - * `onerror` when playing failed. - */ -export default function play( - { code }: PageScriptData.Playme, - onerror: (data: PageScriptData.Playme) => void -) { - const oldAudio = cache.get(code); - if (oldAudio) { - if (oldAudio.getAttribute('disabled')) { - if (onerror) onerror({ code }); - } else { - oldAudio.play(); - } - } else { - const [lang, file] = code.split(':'); - if (URLXD[lang]) { - const newAudio = document.createElement('audio'); - cache.add(code, newAudio); - newAudio.preload = 'auto'; - newAudio.autoplay = true; - const [dir, ext] = URLXD[lang]; - newAudio.src = dir + file + ext; - newAudio.onerror = (event: ErrorEvent) => { - event.stopPropagation(); - newAudio.setAttribute('disabled', 'disabled'); - if (onerror) onerror({ code }); - }; - } - } -} diff --git a/extension/src/content/handler.ts b/extension/src/content/handler.ts index b76a1b5..5103703 100644 --- a/extension/src/content/handler.ts +++ b/extension/src/content/handler.ts @@ -1,6 +1,6 @@ -import { BackgroundData, Fetcher, Entry, Rect } from '../shared/types'; -import { dePinv, dePron, deJyut } from './decoder'; +import { Fetcher, Entry, Rect } from '../shared/types'; import { DICTDOM, ensureDomAttached } from './dictdom'; +import { dePinv, dePron, deJyut } from './decoder'; import postitle from '../shared/postitle'; import SECRET from '../shared/common'; import cookup from './cookup'; @@ -216,9 +216,14 @@ export default function(fetcher: Fetcher) { : '粤语'; button.addEventListener('mouseup', event => { event.stopPropagation(); - fetcher.playme({ - code: button.dataset.code!, - }); + fetcher + .playme({ + code: button.dataset.code!, + }) + .catch(() => { + button.setAttribute('disabled', 'disabled'); + button.setAttribute('title', '播放失败'); + }); }); button.setAttribute('title', `播放${mark} » [${button.innerText}]`); }); @@ -405,13 +410,5 @@ export default function(fetcher: Fetcher) { return { hideDict, tryToShowDict, - onPlayError({ code }: BackgroundData.OnPlayError) { - for (const target of View.querySelectorAll(`[data-code="${code}"]`)) { - if (target) { - target.setAttribute('disabled', 'disabled'); - target.setAttribute('title', '播放失败'); - } - } - }, }; } diff --git a/extension/src/content/main.ts b/extension/src/content/main.ts index 6f91606..4006bc3 100644 --- a/extension/src/content/main.ts +++ b/extension/src/content/main.ts @@ -1,17 +1,22 @@ import { PageScriptAction, BackgroundAction } from '../shared/enums'; import trigger from './trigger'; + type Message = { action: BackgroundAction; data: any }; -const { onPlayError } = trigger({ +trigger({ playme(data) { const action = PageScriptAction.PLAY_SOUND; - chrome.runtime.sendMessage({ action, data }); + return chrome.runtime + .sendMessage({ action, data }) + .then(({ action, data }: Message) => { + if (action === BackgroundAction.PLAY_ERROR) { + throw new Error(); + } + }); }, search(data) { const action = PageScriptAction.SEARCH_TEXT; - return new Promise(resolve => - chrome.runtime.sendMessage({ action, data }, resolve) - ); + return chrome.runtime.sendMessage({ action, data }); }, define(data) { const action = PageScriptAction.DEFINE_WORD; @@ -22,9 +27,3 @@ const { onPlayError } = trigger({ chrome.runtime.sendMessage({ action, data }); }, }); - -chrome.runtime.onMessage.addListener(({ action, data }: Message) => { - if (action === BackgroundAction.PLAY_ERROR) { - onPlayError(data); - } -}); diff --git a/extension/src/content/trigger.ts b/extension/src/content/trigger.ts index a0d12bf..92ff57f 100644 --- a/extension/src/content/trigger.ts +++ b/extension/src/content/trigger.ts @@ -3,7 +3,7 @@ import { shorten, staticText } from './utility'; import handler from './handler'; export default function(fetcher: Fetcher) { - const { tryToShowDict, hideDict, onPlayError } = handler(fetcher); + const { tryToShowDict, hideDict } = handler(fetcher); let mousedownTargetIsNotLanxEdit = true; let mouseupEnabled = true; let dictEnabled = true; @@ -65,7 +65,6 @@ export default function(fetcher: Fetcher) { }); return { - onPlayError, toggleDictEnabled() { return (dictEnabled = !dictEnabled); }, diff --git a/extension/src/copy/manifest.json b/extension/src/copy/manifest.json index 8381eea..3f2b535 100644 --- a/extension/src/copy/manifest.json +++ b/extension/src/copy/manifest.json @@ -1,23 +1,18 @@ { - "manifest_version": 2, + "manifest_version": 3, "name": "__MSG_name__", "description": "__MSG_description__", "version": "1.2.0", "author": "李鸿章", "default_locale": "en", - "browser_action": { + "action": { "default_icon": "static/icon19.png" }, "background": { - "page": "background.html" + "service_worker": "background.js" }, - "permissions": [ - "notifications", - "https://*/*", - "http://*/*", - "", - "tabs" - ], + "host_permissions": ["https://*/*", "http://*/*", ""], + "permissions": ["notifications", "offscreen", "tabs"], "icons": { "16": "enabled/icon16.png", "32": "enabled/icon32.png", diff --git a/extension/src/copy/background.html b/extension/src/copy/offscreen.html similarity index 54% rename from extension/src/copy/background.html rename to extension/src/copy/offscreen.html index be3ebc1..d6f706c 100644 --- a/extension/src/copy/background.html +++ b/extension/src/copy/offscreen.html @@ -2,6 +2,6 @@ - + diff --git a/extension/src/background/cache.ts b/extension/src/offscreen/cache.ts similarity index 100% rename from extension/src/background/cache.ts rename to extension/src/offscreen/cache.ts diff --git a/extension/src/offscreen/main.ts b/extension/src/offscreen/main.ts new file mode 100644 index 0000000..5045b83 --- /dev/null +++ b/extension/src/offscreen/main.ts @@ -0,0 +1,19 @@ +import { PageScriptAction } from '../shared/enums'; +import play from './player'; + +type Message = { action: PageScriptAction; data: any }; + +chrome.runtime.onMessage.addListener( + ({ action, data }: Message, _, sendRes) => { + if (action === PageScriptAction.PLAY_SOUND) { + play(data).then(action => + sendRes({ + action, + data, + }) + ); + return true; + } + return false; + } +); diff --git a/extension/src/offscreen/player.ts b/extension/src/offscreen/player.ts new file mode 100644 index 0000000..9b92330 --- /dev/null +++ b/extension/src/offscreen/player.ts @@ -0,0 +1,55 @@ +import { PageScriptData } from '../shared/types'; +import { BackgroundAction } from '../shared/enums'; + +import { Cache } from './cache'; +import { host } from '../fetch'; + +const URLXD = { + zh: [`${host}/static/pron/zh/`, `.ogg`], + uk: [`${host}/static/pron/uk/`, `.mp3`], + us: [`${host}/static/pron/us/`, `.mp3`], + jp: [`${host}/static/pron/jp/`, `.wav`], +}; + +const cache = new Cache(128); +/** + * `code` formats: + * + * 1. `zh:pin1` + * 2. `uk:C7IZLO-RJ` + * 3. `us:F7I-NLO-KJ` + * 3. `jp:sik6` + * + * `onerror` when playing failed. + */ +export default function play({ code }: PageScriptData.Playme) { + return new Promise(resolve => { + const oldAudio = cache.get(code); + if (oldAudio) { + if (!oldAudio.getAttribute('disabled')) { + oldAudio.play(); + resolve(BackgroundAction.PLAY_OKAY); + } else { + resolve(BackgroundAction.PLAY_ERROR); + } + } else { + const [lang, file] = code.split(':'); + if (URLXD[lang]) { + const newAudio = document.createElement('audio'); + cache.add(code, newAudio); + newAudio.preload = 'auto'; + newAudio.autoplay = true; + const [dir, ext] = URLXD[lang]; + newAudio.src = dir + file + ext; + newAudio.onerror = (event: ErrorEvent) => { + event.stopPropagation(); + newAudio.setAttribute('disabled', 'disabled'); + resolve(BackgroundAction.PLAY_ERROR); + }; + newAudio.oncanplay = () => { + resolve(BackgroundAction.PLAY_OKAY); + }; + } + } + }); +} diff --git a/extension/src/shared/enums.ts b/extension/src/shared/enums.ts index 3d2e9c7..03f2697 100644 --- a/extension/src/shared/enums.ts +++ b/extension/src/shared/enums.ts @@ -8,14 +8,5 @@ export const enum PageScriptAction { // Note: set `string` initializers using as `string` key as well. export const enum BackgroundAction { PLAY_ERROR = 'PLAY_ERROR', -} - -/** 语言代号,用于请求_查词接口_等 */ -export const enum LanguageCode { - /** 汉语代号 */ - ZH = 'zh', - /** 英语代号 */ - EN = 'en', - /** 粤语代号 */ - JP = 'jp', + PLAY_OKAY = 'PLAY_OKAY', } diff --git a/extension/src/shared/runtime.ts b/extension/src/shared/runtime.ts deleted file mode 100644 index 95d2a57..0000000 --- a/extension/src/shared/runtime.ts +++ /dev/null @@ -1,33 +0,0 @@ -const enum Action { - StopFind, -} - -interface Message { - action: Action; -} -type Response = (res: any) => void; - -type Sender = chrome.runtime.MessageSender; - -namespace Runtime { - export function addEventListener( - callback: (msg: Message, sender: Sender, sendRes: Response) => void - ) { - chrome.runtime.onMessage.addListener(callback); - } - - export function sendMessageToTab( - tabId: number, - message: Message, - sendRes?: Response - ) { - if (sendRes) chrome.tabs.sendMessage(tabId, message, sendRes); - else chrome.tabs.sendMessage(tabId, message); - } - export function sendMessage(message: Message, sendRes?: Response) { - if (sendRes) chrome.runtime.sendMessage(message, sendRes); - else chrome.runtime.sendMessage(message); - } -} - -export default Runtime; diff --git a/extension/src/shared/types.ts b/extension/src/shared/types.ts index 8bc592f..86f21f4 100644 --- a/extension/src/shared/types.ts +++ b/extension/src/shared/types.ts @@ -29,9 +29,6 @@ export namespace PageScriptData { export type Define = { word: string; data: any; type: 'all' | 'own' }; export type Playme = { code: string }; export type Viewed = Entry; - export namespace Search { - export type Callback = (entries: WordData[]) => void; - } } export namespace BackgroundData { @@ -40,7 +37,7 @@ export namespace BackgroundData { export interface Fetcher { search(data: PageScriptData.Search): Promise; + playme(data: PageScriptData.Playme): Promise; define(data: PageScriptData.Define): void; - playme(data: PageScriptData.Playme): void; viewed(data: PageScriptData.Viewed): void; } diff --git a/package-lock.json b/package-lock.json index 0eb58d0..a6e2fe6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "lodash": "^4.17.11" }, "devDependencies": { - "@types/chrome": "^0.0.73", + "@types/chrome": "^0.0.263", "@types/lodash": "^4.14.117", "@types/node": "^10.10.1", "babel-core": "^6.26.3", @@ -35,8 +35,8 @@ "sass": "^1.38.0", "sass-loader": "^7.1.0", "style-loader": "^0.23.1", - "ts-loader": "^5.1.1", - "typescript": "^3.0.3", + "ts-loader": "^8.4.0", + "typescript": "^4.9.5", "webpack": "^4.19.0", "webpack-cli": "^3.1.0", "webpack-dev-server": "^3.8.2" @@ -99,12 +99,13 @@ } }, "node_modules/@types/chrome": { - "version": "0.0.73", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.73.tgz", - "integrity": "sha512-w5aFubIZGmCeWyy7qFU4UFFOlTjqMtG0m8CU/v5RbMbcIk0aritvAeKVO7i5iorccIOOJfm3ZVU7enuIPDQ/jA==", + "version": "0.0.263", + "resolved": "https://bnpm.byted.org/@types/chrome/-/chrome-0.0.263.tgz", + "integrity": "sha512-As0vzv99ov3M6ZR7R6VzhMWFZXkPMrFrCEXXVrMN576Cm70fTkj7Df2CF+qEo170JepX50pd11cX6O4DSAtl2Q==", "dev": true, "dependencies": { - "@types/filesystem": "*" + "@types/filesystem": "*", + "@types/har-format": "*" } }, "node_modules/@types/events": { @@ -114,18 +115,18 @@ "dev": true }, "node_modules/@types/filesystem": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.29.tgz", - "integrity": "sha512-85/1KfRedmfPGsbK8YzeaQUyV1FQAvMPMTuWFQ5EkLd2w7szhNO96bk3Rh/SKmOfd9co2rCLf0Voy4o7ECBOvw==", + "version": "0.0.35", + "resolved": "https://bnpm.byted.org/@types/filesystem/-/filesystem-0.0.35.tgz", + "integrity": "sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==", "dev": true, "dependencies": { "@types/filewriter": "*" } }, "node_modules/@types/filewriter": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.28.tgz", - "integrity": "sha1-wFTor02d11205jq8dviFFocU1LM=", + "version": "0.0.33", + "resolved": "https://bnpm.byted.org/@types/filewriter/-/filewriter-0.0.33.tgz", + "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==", "dev": true }, "node_modules/@types/glob": { @@ -139,6 +140,12 @@ "@types/node": "*" } }, + "node_modules/@types/har-format": { + "version": "1.2.15", + "resolved": "https://bnpm.byted.org/@types/har-format/-/har-format-1.2.15.tgz", + "integrity": "sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==", + "dev": true + }, "node_modules/@types/lodash": { "version": "4.14.142", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.142.tgz", @@ -5294,9 +5301,9 @@ } }, "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", "dev": true }, "node_modules/ip-regex": { @@ -9364,59 +9371,215 @@ } }, "node_modules/ts-loader": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", - "integrity": "sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw==", + "version": "8.4.0", + "resolved": "https://bnpm.byted.org/ts-loader/-/ts-loader-8.4.0.tgz", + "integrity": "sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw==", "dev": true, "dependencies": { - "chalk": "^2.3.0", + "chalk": "^4.1.0", "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" + "loader-utils": "^2.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" }, "engines": { - "node": ">=6.11.5" + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "*" } }, "node_modules/ts-loader/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://bnpm.byted.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://bnpm.byted.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/ts-loader/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://bnpm.byted.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://bnpm.byted.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://bnpm.byted.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://bnpm.byted.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ts-loader/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://bnpm.byted.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://bnpm.byted.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://bnpm.byted.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/ts-loader/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://bnpm.byted.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://bnpm.byted.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/ts-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://bnpm.byted.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://bnpm.byted.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://bnpm.byted.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/ts-loader/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://bnpm.byted.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, + "node_modules/ts-loader/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://bnpm.byted.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://bnpm.byted.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -9449,9 +9612,9 @@ "dev": true }, "node_modules/typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.3.tgz", - "integrity": "sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==", + "version": "4.9.5", + "resolved": "https://bnpm.byted.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -10785,12 +10948,13 @@ } }, "@types/chrome": { - "version": "0.0.73", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.73.tgz", - "integrity": "sha512-w5aFubIZGmCeWyy7qFU4UFFOlTjqMtG0m8CU/v5RbMbcIk0aritvAeKVO7i5iorccIOOJfm3ZVU7enuIPDQ/jA==", + "version": "0.0.263", + "resolved": "https://bnpm.byted.org/@types/chrome/-/chrome-0.0.263.tgz", + "integrity": "sha512-As0vzv99ov3M6ZR7R6VzhMWFZXkPMrFrCEXXVrMN576Cm70fTkj7Df2CF+qEo170JepX50pd11cX6O4DSAtl2Q==", "dev": true, "requires": { - "@types/filesystem": "*" + "@types/filesystem": "*", + "@types/har-format": "*" } }, "@types/events": { @@ -10800,18 +10964,18 @@ "dev": true }, "@types/filesystem": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.29.tgz", - "integrity": "sha512-85/1KfRedmfPGsbK8YzeaQUyV1FQAvMPMTuWFQ5EkLd2w7szhNO96bk3Rh/SKmOfd9co2rCLf0Voy4o7ECBOvw==", + "version": "0.0.35", + "resolved": "https://bnpm.byted.org/@types/filesystem/-/filesystem-0.0.35.tgz", + "integrity": "sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==", "dev": true, "requires": { "@types/filewriter": "*" } }, "@types/filewriter": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.28.tgz", - "integrity": "sha1-wFTor02d11205jq8dviFFocU1LM=", + "version": "0.0.33", + "resolved": "https://bnpm.byted.org/@types/filewriter/-/filewriter-0.0.33.tgz", + "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==", "dev": true }, "@types/glob": { @@ -10825,6 +10989,12 @@ "@types/node": "*" } }, + "@types/har-format": { + "version": "1.2.15", + "resolved": "https://bnpm.byted.org/@types/har-format/-/har-format-1.2.15.tgz", + "integrity": "sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==", + "dev": true + }, "@types/lodash": { "version": "4.14.142", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.142.tgz", @@ -15320,9 +15490,9 @@ } }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", "dev": true }, "ip-regex": { @@ -18669,46 +18839,156 @@ "dev": true }, "ts-loader": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", - "integrity": "sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw==", + "version": "8.4.0", + "resolved": "https://bnpm.byted.org/ts-loader/-/ts-loader-8.4.0.tgz", + "integrity": "sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw==", "dev": true, "requires": { - "chalk": "^2.3.0", + "chalk": "^4.1.0", "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" + "loader-utils": "^2.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" }, "dependencies": { "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://bnpm.byted.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://bnpm.byted.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" } }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://bnpm.byted.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://bnpm.byted.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://bnpm.byted.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://bnpm.byted.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://bnpm.byted.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://bnpm.byted.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://bnpm.byted.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://bnpm.byted.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://bnpm.byted.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://bnpm.byted.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://bnpm.byted.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://bnpm.byted.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://bnpm.byted.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://bnpm.byted.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://bnpm.byted.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -18741,9 +19021,9 @@ "dev": true }, "typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.3.tgz", - "integrity": "sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==", + "version": "4.9.5", + "resolved": "https://bnpm.byted.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index e1c50dc..517bf9d 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ ] }, "devDependencies": { - "@types/chrome": "^0.0.73", + "@types/chrome": "^0.0.263", "@types/lodash": "^4.14.117", "@types/node": "^10.10.1", "babel-core": "^6.26.3", @@ -38,12 +38,12 @@ "husky": "^1.3.1", "lint-staged": "^8.1.0", "mini-css-extract-plugin": "^0.4.2", - "sass": "^1.38.0", "prettier": "^1.15.3", + "sass": "^1.38.0", "sass-loader": "^7.1.0", "style-loader": "^0.23.1", - "ts-loader": "^5.1.1", - "typescript": "^3.0.3", + "ts-loader": "^8.4.0", + "typescript": "^4.9.5", "webpack": "^4.19.0", "webpack-cli": "^3.1.0", "webpack-dev-server": "^3.8.2"