diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index a878a1428..f516c3a74 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -21,13 +21,26 @@ jobs: # "selenium/standalone-${e2e_docker_image_fragment}" # Why fragment? These short names are more readable in GitHub UI - e2e_docker_image_fragment: chrome:108.0 + e2e_service_worker_disable: false + e2e_block_popup: false - e2e_docker_image_fragment: chrome:84.0 + e2e_service_worker_disable: false + e2e_block_popup: false - e2e_docker_image_fragment: firefox:108.0 + e2e_service_worker_disable: false + e2e_block_popup: false - e2e_docker_image_fragment: firefox:78.0 + e2e_service_worker_disable: false + e2e_block_popup: false - e2e_docker_image_fragment: firefox:108.0 e2e_service_worker_disable: true + e2e_block_popup: false - e2e_docker_image_fragment: firefox:78.0 e2e_service_worker_disable: true + e2e_block_popup: false + - e2e_docker_image_fragment: firefox:108.0 + e2e_service_worker_disable: false + e2e_block_popup: true runs-on: ubuntu-20.04 timeout-minutes: 10 @@ -47,4 +60,4 @@ jobs: (cd e2e-test && npm ci) & wait - name: E2E test (${{ matrix.e2e_docker_image_fragment }}) - run: cd e2e-test && E2E_DOCKER_IMAGE=selenium/standalone-${{ matrix.e2e_docker_image_fragment }} E2E_DISABLE_SERVICE_WORKER=${{ matrix.e2e_service_worker_disable }} npm start + run: cd e2e-test && E2E_DOCKER_IMAGE=selenium/standalone-${{ matrix.e2e_docker_image_fragment }} E2E_DISABLE_SERVICE_WORKER=${{ matrix.e2e_service_worker_disable }} E2E_BLOCK_POPUP=${{ matrix.e2e_block_popup }} npm start diff --git a/CHANGELOG.md b/CHANGELOG.md index e09dfc8ca..443c0c7ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) ## [Unreleased] +## [0.14.0] - 2022-01-03 +### Changed +- Improve retry-download +- Make UI height shorter to be the send button visible without scrolling for mobile users +- Update dependencies +- Remove from public server URLs + ## [0.13.0] - 2022-12-31 ### Changed - Passwordless protection by default @@ -443,7 +450,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) ### Added - First release -[Unreleased]: https://github.com/nwtgck/piping-ui-web/compare/v0.13.0...HEAD +[Unreleased]: https://github.com/nwtgck/piping-ui-web/compare/v0.14.0...HEAD +[0.14.0]: https://github.com/nwtgck/piping-ui-web/compare/v0.13.0...v0.14.0 [0.13.0]: https://github.com/nwtgck/piping-ui-web/compare/v0.12.1...v0.13.0 [0.12.1]: https://github.com/nwtgck/piping-ui-web/compare/v0.12.0...v0.12.1 [0.12.0]: https://github.com/nwtgck/piping-ui-web/compare/v0.11.0...v0.12.0 diff --git a/e2e-test/src/index.test.ts b/e2e-test/src/index.test.ts index f09aed532..8bcf8cd90 100644 --- a/e2e-test/src/index.test.ts +++ b/e2e-test/src/index.test.ts @@ -22,6 +22,7 @@ const PIPING_UI_URL = `http://localhost:${PIPING_UI_PORT}`; const driverFactoryPromise = createDriverFactory({ dockerBaseImage: process.env["E2E_DOCKER_IMAGE"] || (() => {throw new Error("$E2E_DOCKER_IMAGE not found")})(), disablesServiceWorker: process.env["E2E_DISABLE_SERVICE_WORKER"] === "true", + blockPopup: process.env["E2E_BLOCK_POPUP"] === "true", forwardingTcpPorts: [PIPING_UI_PORT], }); @@ -58,6 +59,33 @@ function getActions(driver: WebDriver) { await (await elements.secretPathClearButton()).click(); await (await elements.secretPathInput()).sendKeys(path); }, + retryDownloadButtonIfNeed(): () => void { + let done = false; + (async () => { + let retryDownloadButton: webdriver.WebElement; + while (true) { + try { + retryDownloadButton = await driver.findElement(webdriver.By.css("[data-testid=retry_download_button]")); + const href = await retryDownloadButton.getAttribute("href"); + if (href.includes("/sw-download/")) { + break; + } + } catch (e) { + } + await new Promise(resolve => setTimeout(resolve, 500)); + if (done) { + return; + } + } + await driver.executeScript((button: HTMLElement) => { + window.scrollTo(0, button.offsetTop) + }, retryDownloadButton); + // GitHub Actions frequently fails in 2 seconds. + await new Promise(resolve => setTimeout(resolve, 5000)); + await retryDownloadButton.click(); + })().catch(e => console.error("failed to run retryDownloadButtonIfNeed()", e)); + return () => { done = true }; + }, }; } @@ -73,8 +101,8 @@ describe('Piping UI', () => { afterCallbacks.push(f); } - it('should send and download a file', async () => { - const {sharePath, sharePathInDocker, downloadPath, createDriver} = await driverFactoryPromise; + it('should send and download a file', async function () { + const {sharePath, sharePathInDocker, downloadPath, createDriver, blockPopup} = await driverFactoryPromise; const secretPath = crypto.randomBytes(8).toString("hex"); const transferContent = randomBytesAvoidingMimeTypeDetection(1024 * 1024); @@ -110,6 +138,8 @@ describe('Piping UI', () => { await nativeClick(driver, await elements.passwordlessSwitch()); await new Promise(resolve => setTimeout(resolve, 1000)); await (await elements.downloadButton()).click(); + const finishRetryDownload = actions.retryDownloadButtonIfNeed(); + defer(() => finishRetryDownload()); const downloadedFilePath = path.join(downloadPath, secretPath); await waitForDownload(downloadedFilePath); @@ -121,8 +151,9 @@ describe('Piping UI', () => { } }); - it('should send and show a file', async () => { - const {sharePath, sharePathInDocker, downloadPath, createDriver} = await driverFactoryPromise; + it('should send and show a file', async function () { + const {sharePath, sharePathInDocker, downloadPath, createDriver, blockPopup} = await driverFactoryPromise; + // NOTE: Skip because GitHub Actions frequently failed. In local Intel Mac, it succeeds. const secretPath = crypto.randomBytes(8).toString("hex"); { @@ -165,8 +196,8 @@ describe('Piping UI', () => { } }); - it('should send and download an E2E encrypted file with password', async () => { - const {sharePath, sharePathInDocker, downloadPath, createDriver} = await driverFactoryPromise; + it('should send and download an E2E encrypted file with password', async function () { + const {sharePath, sharePathInDocker, downloadPath, createDriver, blockPopup} = await driverFactoryPromise; const secretPath = crypto.randomBytes(8).toString("hex"); const transferContent = randomBytesAvoidingMimeTypeDetection(1024 * 1024); @@ -207,6 +238,8 @@ describe('Piping UI', () => { await (await elements.passwordInput()).sendKeys(filePassword); await new Promise(resolve => setTimeout(resolve, 1000)); await (await elements.downloadButton()).click(); + const finishRetryDownload = actions.retryDownloadButtonIfNeed(); + defer(() => finishRetryDownload()); const downloadedFilePath = path.join(downloadPath, secretPath); await waitForDownload(downloadedFilePath); @@ -218,8 +251,8 @@ describe('Piping UI', () => { } }); - it('should send and show an E2E encrypted file with password', async () => { - const {sharePath, sharePathInDocker, downloadPath, createDriver} = await driverFactoryPromise; + it('should send and show an E2E encrypted file with password', async function () { + const {sharePath, sharePathInDocker, downloadPath, createDriver, blockPopup} = await driverFactoryPromise; const secretPath = crypto.randomBytes(8).toString("hex"); const filePassword = crypto.randomBytes(32).toString("binary"); @@ -268,8 +301,8 @@ describe('Piping UI', () => { } }); - it('should send and download a file by passwordless E2E encryption', async () => { - const {sharePath, sharePathInDocker, downloadPath, createDriver} = await driverFactoryPromise; + it('should send and download a file by passwordless E2E encryption', async function () { + const {sharePath, sharePathInDocker, downloadPath, createDriver, blockPopup} = await driverFactoryPromise; const secretPath = crypto.randomBytes(8).toString("hex"); const transferContent = randomBytesAvoidingMimeTypeDetection(1024 * 1024); @@ -304,6 +337,9 @@ describe('Piping UI', () => { await new Promise(resolve => setTimeout(resolve, 2000)); await (await senderElements.passwordlessVerifiedButton0()).click(); + const finishRetryDownload = receiverActions.retryDownloadButtonIfNeed(); + defer(() => finishRetryDownload()); + const downloadedFilePath = path.join(downloadPath, secretPath); await waitForDownload(downloadedFilePath); const downloadedFileContent = fs.readFileSync(downloadedFilePath); @@ -313,8 +349,8 @@ describe('Piping UI', () => { fs.rmSync(downloadedFilePath); }); - it('should send and show a file by passwordless E2E encryption', async () => { - const {sharePath, sharePathInDocker, downloadPath, createDriver} = await driverFactoryPromise; + it('should send and show a file by passwordless E2E encryption', async function () { + const {sharePath, sharePathInDocker, downloadPath, createDriver, blockPopup} = await driverFactoryPromise; const secretPath = crypto.randomBytes(8).toString("hex"); diff --git a/e2e-test/src/util.ts b/e2e-test/src/util.ts index dc80e0672..eb977d58e 100644 --- a/e2e-test/src/util.ts +++ b/e2e-test/src/util.ts @@ -50,20 +50,29 @@ export async function servePipingUiIfNotServed(port: number) { } } +// NOTE: e.click() causes "Element is not clickable at point because another element
obscures it" export async function nativeClick(driver: webdriver.WebDriver, element: webdriver.WebElement) { await driver.executeScript((e: any) => e.click(), element); } export async function getBufferByBlobUrl(driver: webdriver.WebDriver, blobUrl: string): Promise { - const array: number[] = await driver.executeAsyncScript(async function (blobUrl: string) { + const base64String: string = await driver.executeAsyncScript(async function (blobUrl: string) { // eslint-disable-next-line prefer-rest-params const callback = arguments[arguments.length - 1]; const res = await window.fetch(blobUrl); const arrayBuffer = await res.arrayBuffer(); // NOTE: transferring raw Uint8Array causes "Error: Accessing TypedArray data over Xrays is slow, and forbidden in order to encourage performant code. To copy TypedArrays across origin boundaries, consider using Components.utils.cloneInto()." - callback([...new Uint8Array(arrayBuffer)]); + // NOTE: Transferring Base64 string is faster than transferring number[] especially in Firefox + const array = [...new Uint8Array(arrayBuffer)]; + // NOTE: chunking avoids an error "RangeError: too many function arguments" + const chunkSize = 65536; + let str = ''; + while (array.length > 0) { + str += String.fromCharCode.apply(null, array.splice(0, chunkSize)); + } + callback(btoa(str)); }, blobUrl); - return Buffer.from(array); + return Buffer.from(base64String, "base64"); } export function randomBytesAvoidingMimeTypeDetection(size: number): Buffer { @@ -94,7 +103,7 @@ export async function waitFor(f: () => T | Promise, { intervalMillis = 100 export const rayTracingPngImage: Buffer = fs.readFileSync("./resources/ray-tracing-iow-1280x720.png"); -export async function createDriverFactory({dockerBaseImage, disablesServiceWorker, forwardingTcpPorts}: {dockerBaseImage: string, disablesServiceWorker: boolean, forwardingTcpPorts: readonly number[]}) { +export async function createDriverFactory({dockerBaseImage, disablesServiceWorker, blockPopup, forwardingTcpPorts}: {dockerBaseImage: string, disablesServiceWorker: boolean, blockPopup: boolean, forwardingTcpPorts: readonly number[]}) { const sharePath = fs.mkdtempSync(path.join(os.tmpdir(), "selenium-docker-share-")); const sharePathInDocker = "/home/seluser/tmp"; const downloadPath = fs.mkdtempSync(path.join(os.tmpdir(), "selenium-docker-downloads-share-")); @@ -122,6 +131,8 @@ export async function createDriverFactory({dockerBaseImage, disablesServiceWorke new firefox.Options() .setPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream;application/x-unknown-content-type") .setPreference("dom.serviceWorkers.enabled", !disablesServiceWorker) + // 20 is default value in Firefox 108 + .setPreference("dom.popup_maximum", blockPopup ? 0 : 20) ) .usingServer("http://localhost:4444/wd/hub").build(); } @@ -130,6 +141,9 @@ export async function createDriverFactory({dockerBaseImage, disablesServiceWorke if (disablesServiceWorker) { throw new Error(`can not disable Service Worker on Chrome/Chromium`); } + if (blockPopup) { + throw new Error(`can not block popup on Chrome/Chromium`); + } return () => { return new webdriver.Builder().forBrowser(webdriver.Browser.CHROME) .usingServer("http://localhost:4444/wd/hub").build(); @@ -144,5 +158,6 @@ export async function createDriverFactory({dockerBaseImage, disablesServiceWorke downloadPath, downloadPathInDocker, createDriver, + blockPopup, }; } diff --git a/package-lock.json b/package-lock.json index b7176f3a1..e25896f30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "piping-ui", - "version": "0.13.0", + "version": "0.14.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "piping-ui", - "version": "0.13.0", + "version": "0.14.0", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -24,7 +24,8 @@ "io-ts": "^2.2.18", "jszip": "^3.10.1", "jwk-thumbprint": "^0.1.4", - "linkifyjs": "^3.0.5", + "linkify-string": "^4.0.2", + "linkifyjs": "^4.0.2", "openpgp": "^5.5.0", "register-service-worker": "^1.7.2", "sanitize-html": "^2.8.1", @@ -45,21 +46,21 @@ "@types/sanitize-html": "^2.6.2", "@types/smoothscroll-polyfill": "^0.3.1", "@types/url-join": "^4.0.0", - "@typescript-eslint/eslint-plugin": "^5.47.1", - "@typescript-eslint/parser": "^5.47.1", + "@typescript-eslint/eslint-plugin": "^5.48.0", + "@typescript-eslint/parser": "^5.48.0", "@vue/cli-plugin-babel": "^5.0.8", "@vue/cli-plugin-eslint": "^5.0.8", "@vue/cli-plugin-typescript": "^5.0.8", "@vue/cli-plugin-unit-mocha": "^5.0.8", "@vue/cli-service": "^5.0.8", - "@vue/eslint-config-typescript": "^9.1.0", + "@vue/eslint-config-typescript": "^10.0.0", "@vue/test-utils": "^1.3.0", "babel-eslint": "^10.1.0", "buffer": "^6.0.3", "chai": "^4.3.6", "concurrently": "^7.4.0", "cross-var": "^1.1.0", - "eslint": "^8.30.0", + "eslint": "^8.31.0", "eslint-plugin-vue": "^8.0.3", "license-checker": "^25.0.1", "material-design-icons-iconfont": "^6.7.0", @@ -1844,9 +1845,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", - "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2379,9 +2380,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "version": "4.17.32", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", + "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", "dev": true, "dependencies": { "@types/node": "*", @@ -2589,14 +2590,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.1.tgz", - "integrity": "sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz", + "integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/type-utils": "5.47.1", - "@typescript-eslint/utils": "5.47.1", + "@typescript-eslint/scope-manager": "5.48.0", + "@typescript-eslint/type-utils": "5.48.0", + "@typescript-eslint/utils": "5.48.0", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -2622,14 +2623,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.1.tgz", - "integrity": "sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz", + "integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/typescript-estree": "5.47.1", + "@typescript-eslint/scope-manager": "5.48.0", + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/typescript-estree": "5.48.0", "debug": "^4.3.4" }, "engines": { @@ -2649,13 +2650,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", - "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz", + "integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1" + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/visitor-keys": "5.48.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2666,13 +2667,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.1.tgz", - "integrity": "sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz", + "integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.47.1", - "@typescript-eslint/utils": "5.47.1", + "@typescript-eslint/typescript-estree": "5.48.0", + "@typescript-eslint/utils": "5.48.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2693,9 +2694,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", - "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz", + "integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2706,13 +2707,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", - "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz", + "integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1", + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/visitor-keys": "5.48.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2733,16 +2734,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.1.tgz", - "integrity": "sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz", + "integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/typescript-estree": "5.47.1", + "@typescript-eslint/scope-manager": "5.48.0", + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/typescript-estree": "5.48.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -2759,12 +2760,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", - "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz", + "integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/types": "5.48.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3395,19 +3396,19 @@ "dev": true }, "node_modules/@vue/eslint-config-typescript": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-9.1.0.tgz", - "integrity": "sha512-j/852/ZYQ5wDvCD3HE2q4uqJwJAceer2FwoEch1nFo+zTOsPrbzbE3cuWIs3kvu5hdFsGTMYwRwjI6fqZKDMxQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-10.0.0.tgz", + "integrity": "sha512-F94cL8ug3FaYXlCfU5/wiGjk1qeadmoBpRGAOBq+qre3Smdupa59dd6ZJrsfRODpsMPyTG7330juMDsUvpZ3Rw==", "dev": true, "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", "vue-eslint-parser": "^8.0.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", "eslint-plugin-vue": "^8.0.1" } @@ -7505,12 +7506,12 @@ } }, "node_modules/eslint": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", - "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", + "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.0", + "@eslint/eslintrc": "^1.4.1", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -8251,9 +8252,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -9884,9 +9885,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -10042,10 +10043,18 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/linkify-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/linkify-string/-/linkify-string-4.0.2.tgz", + "integrity": "sha512-+HoBme50rPaKxh5TrEJqRLq4gphks1zj3cz6gMBKIHwJCFYVwHig8ii9aCzqGUz8DxF2otbq+Z3AJmKUnfOtKg==", + "peerDependencies": { + "linkifyjs": "^4.0.0" + } + }, "node_modules/linkifyjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-3.0.5.tgz", - "integrity": "sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz", + "integrity": "sha512-/VSoCZiglX0VMsXmL5PN3lRg45M86lrD9PskdkA2abWaTKap1bIcJ11LS4EE55bcUl9ZOR4eZ792UtQ9E/5xLA==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -10071,9 +10080,9 @@ } }, "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -17483,9 +17492,9 @@ } }, "@eslint/eslintrc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", - "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -17923,9 +17932,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "version": "4.17.32", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", + "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", "dev": true, "requires": { "@types/node": "*", @@ -18133,14 +18142,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.1.tgz", - "integrity": "sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz", + "integrity": "sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/type-utils": "5.47.1", - "@typescript-eslint/utils": "5.47.1", + "@typescript-eslint/scope-manager": "5.48.0", + "@typescript-eslint/type-utils": "5.48.0", + "@typescript-eslint/utils": "5.48.0", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -18150,53 +18159,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.1.tgz", - "integrity": "sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.0.tgz", + "integrity": "sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/typescript-estree": "5.47.1", + "@typescript-eslint/scope-manager": "5.48.0", + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/typescript-estree": "5.48.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz", - "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz", + "integrity": "sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1" + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/visitor-keys": "5.48.0" } }, "@typescript-eslint/type-utils": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.1.tgz", - "integrity": "sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz", + "integrity": "sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.47.1", - "@typescript-eslint/utils": "5.47.1", + "@typescript-eslint/typescript-estree": "5.48.0", + "@typescript-eslint/utils": "5.48.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz", - "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.0.tgz", + "integrity": "sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz", - "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz", + "integrity": "sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/visitor-keys": "5.47.1", + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/visitor-keys": "5.48.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -18205,28 +18214,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.1.tgz", - "integrity": "sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.0.tgz", + "integrity": "sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.1", - "@typescript-eslint/types": "5.47.1", - "@typescript-eslint/typescript-estree": "5.47.1", + "@typescript-eslint/scope-manager": "5.48.0", + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/typescript-estree": "5.48.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.47.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz", - "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz", + "integrity": "sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.47.1", + "@typescript-eslint/types": "5.48.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -18706,11 +18715,13 @@ } }, "@vue/eslint-config-typescript": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-9.1.0.tgz", - "integrity": "sha512-j/852/ZYQ5wDvCD3HE2q4uqJwJAceer2FwoEch1nFo+zTOsPrbzbE3cuWIs3kvu5hdFsGTMYwRwjI6fqZKDMxQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-10.0.0.tgz", + "integrity": "sha512-F94cL8ug3FaYXlCfU5/wiGjk1qeadmoBpRGAOBq+qre3Smdupa59dd6ZJrsfRODpsMPyTG7330juMDsUvpZ3Rw==", "dev": true, "requires": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", "vue-eslint-parser": "^8.0.0" } }, @@ -22027,12 +22038,12 @@ } }, "eslint": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", - "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", + "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.0", + "@eslint/eslintrc": "^1.4.1", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -22578,9 +22589,9 @@ "dev": true }, "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -23770,9 +23781,9 @@ "dev": true }, "json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonfile": { @@ -23904,10 +23915,16 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "linkify-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/linkify-string/-/linkify-string-4.0.2.tgz", + "integrity": "sha512-+HoBme50rPaKxh5TrEJqRLq4gphks1zj3cz6gMBKIHwJCFYVwHig8ii9aCzqGUz8DxF2otbq+Z3AJmKUnfOtKg==", + "requires": {} + }, "linkifyjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-3.0.5.tgz", - "integrity": "sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz", + "integrity": "sha512-/VSoCZiglX0VMsXmL5PN3lRg45M86lrD9PskdkA2abWaTKap1bIcJ11LS4EE55bcUl9ZOR4eZ792UtQ9E/5xLA==" }, "loader-runner": { "version": "4.3.0", @@ -23927,9 +23944,9 @@ }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" diff --git a/package.json b/package.json index 95774d22f..d5502b848 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "piping-ui", - "version": "0.13.0", + "version": "0.14.0", "private": true, "author": "Ryo Ota (https://github.com/nwtgck)", "scripts": { @@ -31,7 +31,8 @@ "io-ts": "^2.2.18", "jszip": "^3.10.1", "jwk-thumbprint": "^0.1.4", - "linkifyjs": "^3.0.5", + "linkify-string": "^4.0.2", + "linkifyjs": "^4.0.2", "openpgp": "^5.5.0", "register-service-worker": "^1.7.2", "sanitize-html": "^2.8.1", @@ -52,21 +53,21 @@ "@types/sanitize-html": "^2.6.2", "@types/smoothscroll-polyfill": "^0.3.1", "@types/url-join": "^4.0.0", - "@typescript-eslint/eslint-plugin": "^5.47.1", - "@typescript-eslint/parser": "^5.47.1", + "@typescript-eslint/eslint-plugin": "^5.48.0", + "@typescript-eslint/parser": "^5.48.0", "@vue/cli-plugin-babel": "^5.0.8", "@vue/cli-plugin-eslint": "^5.0.8", "@vue/cli-plugin-typescript": "^5.0.8", "@vue/cli-plugin-unit-mocha": "^5.0.8", "@vue/cli-service": "^5.0.8", - "@vue/eslint-config-typescript": "^9.1.0", + "@vue/eslint-config-typescript": "^10.0.0", "@vue/test-utils": "^1.3.0", "babel-eslint": "^10.1.0", "buffer": "^6.0.3", "chai": "^4.3.6", "concurrently": "^7.4.0", "cross-var": "^1.1.0", - "eslint": "^8.30.0", + "eslint": "^8.31.0", "eslint-plugin-vue": "^8.0.3", "license-checker": "^25.0.1", "material-design-icons-iconfont": "^6.7.0", diff --git a/src/App.vue b/src/App.vue index 690611a9a..86d202854 100644 --- a/src/App.vue +++ b/src/App.vue @@ -16,6 +16,32 @@ + + + + + +