diff --git a/.eslintrc.js b/.eslintrc.js
index 8cc33f62ab94a..2729411b7e10b 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -47,7 +47,7 @@ module.exports = {
'plugin:vue/recommended',
'standard',
'plugin:jsonc/recommended-with-json',
- // 'plugin:vuejs-accessibility/recommended' // uncomment once issues are fixed
+ 'plugin:vuejs-accessibility/recommended'
],
// https://eslint.org/docs/user-guide/configuring#configuring-plugins
@@ -70,6 +70,7 @@ module.exports = {
some: ['nesting', 'id']
}
}],
+ 'vuejs-accessibility/no-static-element-interactions': 'off',
'n/no-callback-literal': 'warn',
'n/no-path-concat': 'warn',
'unicorn/better-regex': 'error',
diff --git a/.github/workflows/autoMerge.yml b/.github/workflows/autoMerge.yml
index a5391e7245551..c979c741475ad 100644
--- a/.github/workflows/autoMerge.yml
+++ b/.github/workflows/autoMerge.yml
@@ -9,7 +9,7 @@ jobs:
steps:
- name: Auto Merge PR
- if: github.event.pull_request.draft == false && (contains(${{ github.event.pull_request.base.ref }}, 'development') || contains(${{ github.event.pull_request.base.ref }}, 'RC'))
+ if: ${{ !github.event.pull_request.draft && (contains(github.event.pull_request.base.ref, 'development') || contains(github.event.pull_request.base.ref, 'RC')) }}
run: |
echo ${{ secrets.PUSH_TOKEN }} >> auth.txt
gh auth login --with-token < auth.txt
diff --git a/package.json b/package.json
index 02e6b398259ef..fb0de3ae41601 100644
--- a/package.json
+++ b/package.json
@@ -54,16 +54,16 @@
"ci": "yarn install --silent --frozen-lockfile"
},
"dependencies": {
- "@fortawesome/fontawesome-svg-core": "^6.4.0",
- "@fortawesome/free-brands-svg-icons": "^6.4.0",
- "@fortawesome/free-solid-svg-icons": "^6.4.0",
+ "@fortawesome/fontawesome-svg-core": "^6.4.2",
+ "@fortawesome/free-brands-svg-icons": "^6.4.2",
+ "@fortawesome/free-solid-svg-icons": "^6.4.2",
"@fortawesome/vue-fontawesome": "^2.0.10",
+ "@seald-io/nedb": "^4.0.2",
"@silvermine/videojs-quality-selector": "^1.3.0",
"autolinker": "^4.0.0",
"electron-context-menu": "^3.6.1",
"lodash.debounce": "^4.0.8",
- "marked": "^4.3.0",
- "nedb-promises": "^6.2.1",
+ "marked": "^7.0.2",
"path-browserify": "^1.0.1",
"process": "^0.11.10",
"video.js": "7.21.5",
@@ -81,10 +81,10 @@
"youtubei.js": "^5.8.0"
},
"devDependencies": {
- "@babel/core": "^7.22.9",
- "@babel/eslint-parser": "^7.22.9",
+ "@babel/core": "^7.22.10",
+ "@babel/eslint-parser": "^7.22.10",
"@babel/plugin-proposal-class-properties": "^7.18.6",
- "@babel/preset-env": "^7.22.9",
+ "@babel/preset-env": "^7.22.10",
"@double-great/stylelint-a11y": "^2.0.2",
"babel-loader": "^9.1.3",
"copy-webpack-plugin": "^11.0.0",
@@ -92,8 +92,8 @@
"css-minimizer-webpack-plugin": "^5.0.1",
"electron": "^22.3.18",
"electron-builder": "^24.6.3",
- "eslint": "^8.46.0",
- "eslint-config-prettier": "^8.9.0",
+ "eslint": "^8.47.0",
+ "eslint-config-prettier": "^9.0.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.28.0",
"eslint-plugin-jsonc": "^2.9.0",
@@ -101,25 +101,25 @@
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-unicorn": "^48.0.1",
- "eslint-plugin-vue": "^9.16.1",
- "eslint-plugin-vuejs-accessibility": "^2.1.0",
+ "eslint-plugin-vue": "^9.17.0",
+ "eslint-plugin-vuejs-accessibility": "^2.2.0",
"eslint-plugin-yml": "^1.8.0",
"html-webpack-plugin": "^5.5.3",
"js-yaml": "^4.1.0",
"json-minimizer-webpack-plugin": "^4.0.0",
- "lefthook": "^1.4.7",
+ "lefthook": "^1.4.8",
"mini-css-extract-plugin": "^2.7.6",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.26",
"postcss-scss": "^4.0.6",
"prettier": "^2.8.8",
"rimraf": "^5.0.1",
- "sass": "^1.64.1",
+ "sass": "^1.65.1",
"sass-loader": "^13.3.2",
"stylelint": "^15.10.2",
"stylelint-config-sass-guidelines": "^10.0.0",
"stylelint-config-standard": "^34.0.0",
- "stylelint-high-performance-animation": "^1.8.0",
+ "stylelint-high-performance-animation": "^1.9.0",
"tree-kill": "1.2.2",
"vue-devtools": "^5.1.4",
"vue-eslint-parser": "^9.3.1",
diff --git a/src/constants.js b/src/constants.js
index cc82cdcce9cf0..f4286c205e0de 100644
--- a/src/constants.js
+++ b/src/constants.js
@@ -71,6 +71,11 @@ const SyncEvents = {
}
}
+// https://v2.vuejs.org/v2/api/#provide-inject
+const Injectables = {
+ SHOW_OUTLINES: 'showOutlines'
+}
+
// Utils
const MAIN_PROFILE_ID = 'allChannels'
@@ -78,5 +83,6 @@ export {
IpcChannels,
DBActions,
SyncEvents,
+ Injectables,
MAIN_PROFILE_ID
}
diff --git a/src/datastores/handlers/base.js b/src/datastores/handlers/base.js
index 89300feb9d740..466c970a8b4c5 100644
--- a/src/datastores/handlers/base.js
+++ b/src/datastores/handlers/base.js
@@ -2,17 +2,21 @@ import db from '../index'
class Settings {
static find() {
- return db.settings.find({ _id: { $ne: 'bounds' } })
+ return db.settings.findAsync({ _id: { $ne: 'bounds' } })
}
static upsert(_id, value) {
- return db.settings.update({ _id }, { _id, value }, { upsert: true })
+ return db.settings.updateAsync({ _id }, { _id, value }, { upsert: true })
+ }
+
+ static persist() {
+ return db.settings.compactDatafileAsync()
}
// ******************** //
// Unique Electron main process handlers
static _findAppReadyRelatedSettings() {
- return db.settings.find({
+ return db.settings.findAsync({
$or: [
{ _id: 'disableSmoothScrolling' },
{ _id: 'useProxy' },
@@ -24,96 +28,96 @@ class Settings {
}
static _findBounds() {
- return db.settings.findOne({ _id: 'bounds' })
+ return db.settings.findOneAsync({ _id: 'bounds' })
}
static _findTheme() {
- return db.settings.findOne({ _id: 'baseTheme' })
+ return db.settings.findOneAsync({ _id: 'baseTheme' })
}
static _findSidenavSettings() {
return {
- hideTrendingVideos: db.settings.findOne({ _id: 'hideTrendingVideos' }),
- hidePopularVideos: db.settings.findOne({ _id: 'hidePopularVideos' }),
- backendFallback: db.settings.findOne({ _id: 'backendFallback' }),
- backendPreference: db.settings.findOne({ _id: 'backendPreference' }),
- hidePlaylists: db.settings.findOne({ _id: 'hidePlaylists' }),
+ hideTrendingVideos: db.settings.findOneAsync({ _id: 'hideTrendingVideos' }),
+ hidePopularVideos: db.settings.findOneAsync({ _id: 'hidePopularVideos' }),
+ backendFallback: db.settings.findOneAsync({ _id: 'backendFallback' }),
+ backendPreference: db.settings.findOneAsync({ _id: 'backendPreference' }),
+ hidePlaylists: db.settings.findOneAsync({ _id: 'hidePlaylists' }),
}
}
static _updateBounds(value) {
- return db.settings.update({ _id: 'bounds' }, { _id: 'bounds', value }, { upsert: true })
+ return db.settings.updateAsync({ _id: 'bounds' }, { _id: 'bounds', value }, { upsert: true })
}
// ******************** //
}
class History {
static find() {
- return db.history.find({}).sort({ timeWatched: -1 })
+ return db.history.findAsync({}).sort({ timeWatched: -1 })
}
static upsert(record) {
- return db.history.update({ videoId: record.videoId }, record, { upsert: true })
+ return db.history.updateAsync({ videoId: record.videoId }, record, { upsert: true })
}
static updateWatchProgress(videoId, watchProgress) {
- return db.history.update({ videoId }, { $set: { watchProgress } }, { upsert: true })
+ return db.history.updateAsync({ videoId }, { $set: { watchProgress } }, { upsert: true })
}
static updateLastViewedPlaylist(videoId, lastViewedPlaylistId, lastViewedPlaylistType) {
- return db.history.update({ videoId }, { $set: { lastViewedPlaylistId, lastViewedPlaylistType } }, { upsert: true })
+ return db.history.updateAsync({ videoId }, { $set: { lastViewedPlaylistId, lastViewedPlaylistType } }, { upsert: true })
}
static delete(videoId) {
- return db.history.remove({ videoId })
+ return db.history.removeAsync({ videoId })
}
static deleteAll() {
- return db.history.remove({}, { multi: true })
+ return db.history.removeAsync({}, { multi: true })
}
static persist() {
- db.history.persistence.compactDatafile()
+ return db.history.compactDatafileAsync()
}
}
class Profiles {
static create(profile) {
- return db.profiles.insert(profile)
+ return db.profiles.insertAsync(profile)
}
static find() {
- return db.profiles.find({})
+ return db.profiles.findAsync({})
}
static upsert(profile) {
- return db.profiles.update({ _id: profile._id }, profile, { upsert: true })
+ return db.profiles.updateAsync({ _id: profile._id }, profile, { upsert: true })
}
static delete(id) {
- return db.profiles.remove({ _id: id })
+ return db.profiles.removeAsync({ _id: id })
}
static persist() {
- db.profiles.persistence.compactDatafile()
+ return db.profiles.compactDatafileAsync()
}
}
class Playlists {
static create(playlists) {
- return db.playlists.insert(playlists)
+ return db.playlists.insertAsync(playlists)
}
static find() {
- return db.playlists.find({})
+ return db.playlists.findAsync({})
}
static upsert(playlist) {
- return db.playlists.update({ _id: playlist._id }, playlist, { upsert: true })
+ return db.playlists.updateAsync({ _id: playlist._id }, playlist, { upsert: true })
}
static upsertVideoByPlaylistId(_id, videoData) {
- return db.playlists.update(
+ return db.playlists.updateAsync(
{ _id },
{ $push: { videos: videoData } },
{ upsert: true }
@@ -121,7 +125,7 @@ class Playlists {
}
static upsertVideoIdsByPlaylistId(_id, videoIds) {
- return db.playlists.update(
+ return db.playlists.updateAsync(
{ _id },
{ $push: { videos: { $each: videoIds } } },
{ upsert: true }
@@ -129,11 +133,11 @@ class Playlists {
}
static delete(_id) {
- return db.playlists.remove({ _id, protected: { $ne: true } })
+ return db.playlists.removeAsync({ _id, protected: { $ne: true } })
}
static deleteVideoIdByPlaylistId(_id, videoId) {
- return db.playlists.update(
+ return db.playlists.updateAsync(
{ _id },
{ $pull: { videos: { videoId } } },
{ upsert: true }
@@ -141,7 +145,7 @@ class Playlists {
}
static deleteVideoIdsByPlaylistId(_id, videoIds) {
- return db.playlists.update(
+ return db.playlists.updateAsync(
{ _id },
{ $pull: { videos: { $in: videoIds } } },
{ upsert: true }
@@ -149,7 +153,7 @@ class Playlists {
}
static deleteAllVideosByPlaylistId(_id) {
- return db.playlists.update(
+ return db.playlists.updateAsync(
{ _id },
{ $set: { videos: [] } },
{ upsert: true }
@@ -157,19 +161,34 @@ class Playlists {
}
static deleteMultiple(ids) {
- return db.playlists.remove({ _id: { $in: ids }, protected: { $ne: true } })
+ return db.playlists.removeAsync({ _id: { $in: ids }, protected: { $ne: true } })
}
static deleteAll() {
- return db.playlists.removeMany()
+ return db.playlists.removeAsync({}, { multi: true })
}
+
+ static persist() {
+ return db.playlists.compactDatafileAsync()
+ }
+}
+
+function compactAllDatastores() {
+ return Promise.allSettled([
+ Settings.persist(),
+ History.persist(),
+ Profiles.persist(),
+ Playlists.persist(),
+ ])
}
const baseHandlers = {
settings: Settings,
history: History,
profiles: Profiles,
- playlists: Playlists
+ playlists: Playlists,
+
+ compactAllDatastores,
}
export default baseHandlers
diff --git a/src/datastores/index.js b/src/datastores/index.js
index 644981634e4c0..a7038fec96651 100644
--- a/src/datastores/index.js
+++ b/src/datastores/index.js
@@ -1,4 +1,4 @@
-import Datastore from 'nedb-promises'
+import Datastore from '@seald-io/nedb'
let dbPath = null
@@ -23,9 +23,9 @@ if (process.env.IS_ELECTRON_MAIN) {
}
const db = {}
-db.settings = Datastore.create({ filename: dbPath('settings'), autoload: true })
-db.profiles = Datastore.create({ filename: dbPath('profiles'), autoload: true })
-db.playlists = Datastore.create({ filename: dbPath('playlists'), autoload: true })
-db.history = Datastore.create({ filename: dbPath('history'), autoload: true })
+db.settings = new Datastore({ filename: dbPath('settings'), autoload: true })
+db.profiles = new Datastore({ filename: dbPath('profiles'), autoload: true })
+db.playlists = new Datastore({ filename: dbPath('playlists'), autoload: true })
+db.history = new Datastore({ filename: dbPath('history'), autoload: true })
export default db
diff --git a/src/main/index.js b/src/main/index.js
index 0dc9d920d6f6e..d5ddbc79144e3 100644
--- a/src/main/index.js
+++ b/src/main/index.js
@@ -289,7 +289,7 @@ function runApp() {
// InnerTube rejects requests if the referer isn't YouTube or empty
const innertubeAndMediaRequestFilter = { urls: ['https://www.youtube.com/youtubei/*', 'https://*.googlevideo.com/videoplayback?*'] }
- session.defaultSession.webRequest.onBeforeSendHeaders(innertubeAndMediaRequestFilter, ({ requestHeaders, url }, callback) => {
+ session.defaultSession.webRequest.onBeforeSendHeaders(innertubeAndMediaRequestFilter, ({ requestHeaders, url, resourceType }, callback) => {
requestHeaders.Referer = 'https://www.youtube.com/'
requestHeaders.Origin = 'https://www.youtube.com'
@@ -300,6 +300,38 @@ function runApp() {
delete requestHeaders['Content-Type']
}
+ // YouTube throttles the adaptive formats if you request a chunk larger than 10MiB.
+ // For the DASH formats we are fine as video.js doesn't seem to ever request chunks that big.
+ // The legacy formats don't have any chunk size limits.
+ // For the audio formats we need to handle it ourselves, as the browser requests the entire audio file,
+ // which means that for most videos that are loger than 10 mins, we get throttled, as the audio track file sizes surpass that 10MiB limit.
+
+ // This code checks if the file is larger than the limit, by checking the `clen` query param,
+ // which YouTube helpfully populates with the content length for us.
+ // If it does surpass that limit, it then checks if the requested range is larger than the limit
+ // (seeking right at the end of the video, would result in a small enough range to be under the chunk limit)
+ // if that surpasses the limit too, it then limits the requested range to 10MiB, by setting the range to `start-${start + 10MiB}`.
+ if (resourceType === 'media' && url.includes('&mime=audio') && requestHeaders.Range) {
+ const TEN_MIB = 10 * 1024 * 1024
+
+ const contentLength = parseInt(new URL(url).searchParams.get('clen'))
+
+ if (contentLength > TEN_MIB) {
+ const [startStr, endStr] = requestHeaders.Range.split('=')[1].split('-')
+
+ const start = parseInt(startStr)
+
+ // handle open ended ranges like `0-` and `1234-`
+ const end = endStr.length === 0 ? contentLength : parseInt(endStr)
+
+ if (end - start > TEN_MIB) {
+ const newEnd = start + TEN_MIB
+
+ requestHeaders.Range = `bytes=${start}-${newEnd}`
+ }
+ }
+ }
+
// eslint-disable-next-line n/no-callback-literal
callback({ requestHeaders })
})
@@ -1008,28 +1040,33 @@ function runApp() {
// ************************************************* //
app.on('window-all-closed', () => {
- // Clear cache and storage if it's the last window
- session.defaultSession.clearCache()
- session.defaultSession.clearStorageData({
- storages: [
- 'appcache',
- 'cookies',
- 'filesystem',
- 'indexdb',
- 'shadercache',
- 'websql',
- 'serviceworkers',
- 'cachestorage'
- ]
+ // Clean up resources (datastores' compaction + Electron cache and storage data clearing)
+ cleanUpResources().finally(() => {
+ if (process.platform !== 'darwin') {
+ app.quit()
+ }
})
-
- // For MacOS the app would still "run in background"
- // and create new window on event `activate`
- if (process.platform !== 'darwin') {
- app.quit()
- }
})
+ function cleanUpResources() {
+ return Promise.allSettled([
+ baseHandlers.compactAllDatastores(),
+ session.defaultSession.clearCache(),
+ session.defaultSession.clearStorageData({
+ storages: [
+ 'appcache',
+ 'cookies',
+ 'filesystem',
+ 'indexdb',
+ 'shadercache',
+ 'websql',
+ 'serviceworkers',
+ 'cachestorage'
+ ]
+ })
+ ])
+ }
+
// MacOS event
// https://www.electronjs.org/docs/latest/api/app#event-activate-macos
app.on('activate', () => {
diff --git a/src/renderer/App.js b/src/renderer/App.js
index b480b92d04a11..58c566ab83366 100644
--- a/src/renderer/App.js
+++ b/src/renderer/App.js
@@ -12,7 +12,7 @@ import FtProgressBar from './components/ft-progress-bar/ft-progress-bar.vue'
import FtPlaylistAddVideoPrompt from './components/ft-playlist-add-video-prompt/ft-playlist-add-video-prompt.vue'
import FtCreatePlaylistPrompt from './components/ft-create-playlist-prompt/ft-create-playlist-prompt.vue'
import { marked } from 'marked'
-import { IpcChannels } from '../constants'
+import { Injectables, IpcChannels } from '../constants'
import packageDetails from '../../package.json'
import { openExternalLink, openInternalPath, showToast } from './helpers/utils'
@@ -34,6 +34,11 @@ export default defineComponent({
FtPlaylistAddVideoPrompt,
FtCreatePlaylistPrompt,
},
+ provide: function () {
+ return {
+ [Injectables.SHOW_OUTLINES]: this.showOutlines
+ }
+ },
data: function () {
return {
dataReady: false,
@@ -505,6 +510,15 @@ export default defineComponent({
}
},
+ /**
+ * provided to all child components, see `provide` near the top of this file
+ * after injecting it, they can show outlines during keyboard navigation
+ * e.g. cycling through tabs with the arrow keys
+ */
+ showOutlines: function () {
+ this.hideOutlines = false
+ },
+
...mapMutations([
'setInvidiousInstancesList'
]),
diff --git a/src/renderer/App.vue b/src/renderer/App.vue
index 2e7ae23b9340c..791b771ceaf42 100644
--- a/src/renderer/App.vue
+++ b/src/renderer/App.vue
@@ -40,7 +40,6 @@
diff --git a/src/renderer/components/data-settings/data-settings.js b/src/renderer/components/data-settings/data-settings.js
index 48ede5c6247d6..9c12f33aa9b3e 100644
--- a/src/renderer/components/data-settings/data-settings.js
+++ b/src/renderer/components/data-settings/data-settings.js
@@ -1162,10 +1162,8 @@ export default defineComponent({
...mapActions([
'updateProfile',
- 'compactProfiles',
'updateShowProgressBar',
'updateHistory',
- 'compactHistory',
'addPlaylist',
'addVideo'
]),
diff --git a/src/renderer/components/ft-list-channel/ft-list-channel.vue b/src/renderer/components/ft-list-channel/ft-list-channel.vue
index cfc85205005e1..cd034322cbae0 100644
--- a/src/renderer/components/ft-list-channel/ft-list-channel.vue
+++ b/src/renderer/components/ft-list-channel/ft-list-channel.vue
@@ -10,10 +10,12 @@
diff --git a/src/renderer/components/ft-list-video/ft-list-video.vue b/src/renderer/components/ft-list-video/ft-list-video.vue
index 6baef0bd8888c..6ae9894ea266d 100644
--- a/src/renderer/components/ft-list-video/ft-list-video.vue
+++ b/src/renderer/components/ft-list-video/ft-list-video.vue
@@ -23,6 +23,7 @@
0 ? Array.from(this.profileName)[0].toUpperCase() : ''
}
},
methods: {
- goToProfile: function () {
+ goToProfile: function (event) {
+ if (event instanceof KeyboardEvent) {
+ if (event.target.getAttribute('role') === 'link' && event.key !== 'Enter') {
+ return
+ }
+ }
this.$router.push({
path: `/settings/profile/edit/${this.profileId}`
})
diff --git a/src/renderer/components/ft-profile-bubble/ft-profile-bubble.vue b/src/renderer/components/ft-profile-bubble/ft-profile-bubble.vue
index 6879570dd057d..cfed977e68996 100644
--- a/src/renderer/components/ft-profile-bubble/ft-profile-bubble.vue
+++ b/src/renderer/components/ft-profile-bubble/ft-profile-bubble.vue
@@ -1,7 +1,11 @@
-
diff --git a/src/renderer/components/ft-profile-channel-list/ft-profile-channel-list.vue b/src/renderer/components/ft-profile-channel-list/ft-profile-channel-list.vue
index d19827b566e7f..bb77bfcb1751e 100644
--- a/src/renderer/components/ft-profile-channel-list/ft-profile-channel-list.vue
+++ b/src/renderer/components/ft-profile-channel-list/ft-profile-channel-list.vue
@@ -15,6 +15,7 @@
:channel-name="channel.name"
:channel-thumbnail="channel.thumbnail"
:show-selected="true"
+ role="button"
@click="handleChannelClick(index)"
/>
diff --git a/src/renderer/components/ft-profile-edit/ft-profile-edit.vue b/src/renderer/components/ft-profile-edit/ft-profile-edit.vue
index 700d54c3da4e6..d0824574f4b6e 100644
--- a/src/renderer/components/ft-profile-edit/ft-profile-edit.vue
+++ b/src/renderer/components/ft-profile-edit/ft-profile-edit.vue
@@ -19,8 +19,12 @@
v-for="(color, index) in colorValues"
:key="index"
class="colorOption"
+ :title="color + ' ' + $t('Profile.Custom Color')"
:style="{ background: color }"
+ tabindex="0"
@click="profileBgColor = color"
+ @keydown.space.prevent="profileBgColor = color"
+ @keydown.enter.prevent="profileBgColor = color"
/>
diff --git a/src/renderer/components/ft-profile-selector/ft-profile-selector.vue b/src/renderer/components/ft-profile-selector/ft-profile-selector.vue
index d1d0ee0c6dc91..f9696ad46a31a 100644
--- a/src/renderer/components/ft-profile-selector/ft-profile-selector.vue
+++ b/src/renderer/components/ft-profile-selector/ft-profile-selector.vue
@@ -2,9 +2,14 @@
{{ $t("Profile.Profile Select") }}
@@ -31,12 +37,20 @@
/>
{{ profile.name }}
diff --git a/src/renderer/components/ft-prompt/ft-prompt.js b/src/renderer/components/ft-prompt/ft-prompt.js
index c6ac3ad911798..7d87c4c671679 100644
--- a/src/renderer/components/ft-prompt/ft-prompt.js
+++ b/src/renderer/components/ft-prompt/ft-prompt.js
@@ -2,6 +2,7 @@ import { defineComponent } from 'vue'
import FtCard from '../../components/ft-card/ft-card.vue'
import FtFlexBox from '../../components/ft-flex-box/ft-flex-box.vue'
import FtButton from '../../components/ft-button/ft-button.vue'
+import { Injectables } from '../../../constants'
import { sanitizeForHtmlId } from '../../helpers/accessibility'
export default defineComponent({
@@ -11,6 +12,9 @@ export default defineComponent({
'ft-flex-box': FtFlexBox,
'ft-button': FtButton
},
+ inject: {
+ showOutlines: Injectables.SHOW_OUTLINES
+ },
props: {
label: {
type: String,
@@ -85,7 +89,8 @@ export default defineComponent({
index = 0
}
if (index >= 0 && index < this.promptButtons.length) {
- this.promptButtons[index].focus({ focusVisible: true })
+ this.promptButtons[index].focus()
+ this.showOutlines()
}
},
// close on escape key and unfocus
diff --git a/src/renderer/store/modules/history.js b/src/renderer/store/modules/history.js
index 390386cf5b70a..f60413ad61c06 100644
--- a/src/renderer/store/modules/history.js
+++ b/src/renderer/store/modules/history.js
@@ -63,10 +63,6 @@ const actions = {
} catch (errMessage) {
console.error(errMessage)
}
- },
-
- compactHistory(_) {
- DBHistoryHandlers.persist()
}
}
diff --git a/src/renderer/store/modules/playlists.js b/src/renderer/store/modules/playlists.js
index e52e1a1ce3f54..91b43c6137109 100644
--- a/src/renderer/store/modules/playlists.js
+++ b/src/renderer/store/modules/playlists.js
@@ -143,7 +143,10 @@ const actions = {
try {
const payload = (await DBPlaylistHandlers.find()).filter((e) => e != null)
if (payload.length === 0) {
- dispatch('addPlaylists', state.defaultPlaylists)
+ // Not using `addPlaylists` to ensure required attributes with dynamic values added
+ state.defaultPlaylists.forEach(playlist => {
+ dispatch('addPlaylist', playlist)
+ })
} else {
payload.forEach((playlist) => {
let anythingUpdated = false
diff --git a/src/renderer/store/modules/profiles.js b/src/renderer/store/modules/profiles.js
index e330be2848095..55069a19a5717 100644
--- a/src/renderer/store/modules/profiles.js
+++ b/src/renderer/store/modules/profiles.js
@@ -142,10 +142,6 @@ const actions = {
}
},
- compactProfiles(_) {
- DBProfileHandlers.persist()
- },
-
updateActiveProfile({ commit }, id) {
commit('setActiveProfile', id)
}
diff --git a/src/renderer/store/modules/utils.js b/src/renderer/store/modules/utils.js
index 99d877d938766..da403249fb243 100644
--- a/src/renderer/store/modules/utils.js
+++ b/src/renderer/store/modules/utils.js
@@ -418,7 +418,7 @@ const actions = {
const typePatterns = new Map([
['playlist', /^(\/playlist\/?|\/embed(\/?videoseries)?)$/],
- ['search', /^\/results\/?$/],
+ ['search', /^\/results|search\/?$/],
['hashtag', hashtagPattern],
['channel', channelPattern]
])
@@ -453,13 +453,21 @@ const actions = {
}
case 'search': {
- if (!url.searchParams.has('search_query')) {
+ let searchQuery = null
+ if (url.searchParams.has('search_query')) {
+ // https://www.youtube.com/results?search_query={QUERY}
+ searchQuery = url.searchParams.get('search_query')
+ url.searchParams.delete('search_query')
+ }
+ if (url.searchParams.has('q')) {
+ // https://redirect.invidious.io/search?q={QUERY}
+ searchQuery = url.searchParams.get('q')
+ url.searchParams.delete('q')
+ }
+ if (searchQuery == null) {
throw new Error('Search: "search_query" field not found')
}
- const searchQuery = url.searchParams.get('search_query')
- url.searchParams.delete('search_query')
-
const searchSettings = state.searchSettings
const query = {
sortBy: searchSettings.sortBy,
diff --git a/src/renderer/views/Channel/Channel.js b/src/renderer/views/Channel/Channel.js
index 0242bca06a50a..7d1e1c084e03d 100644
--- a/src/renderer/views/Channel/Channel.js
+++ b/src/renderer/views/Channel/Channel.js
@@ -32,6 +32,7 @@ import {
parseLocalListVideo,
parseLocalSubscriberCount
} from '../../helpers/api/local'
+import { Injectables } from '../../../constants'
export default defineComponent({
name: 'Channel',
@@ -47,6 +48,9 @@ export default defineComponent({
'ft-subscribe-button': FtSubscribeButton,
'channel-about': ChannelAbout
},
+ inject: {
+ showOutlines: Injectables.SHOW_OUTLINES
+ },
data: function () {
return {
isLoading: false,
@@ -1724,7 +1728,8 @@ export default defineComponent({
: this.tabInfoValues[(index + 1) % this.tabInfoValues.length]
const tabNode = document.getElementById(`${tab}Tab`)
- tabNode.focus({ focusVisible: true })
+ tabNode.focus()
+ this.showOutlines()
return
}
}
@@ -1732,7 +1737,8 @@ export default defineComponent({
// `newTabNode` can be `null` when `tab` === "search"
const newTabNode = document.getElementById(`${tab}Tab`)
this.currentTab = tab
- newTabNode?.focus({ focusVisible: true })
+ newTabNode?.focus()
+ this.showOutlines()
},
newSearch: function (query) {
diff --git a/src/renderer/views/Channel/Channel.vue b/src/renderer/views/Channel/Channel.vue
index 5c5af74c74907..114aaa16ab487 100644
--- a/src/renderer/views/Channel/Channel.vue
+++ b/src/renderer/views/Channel/Channel.vue
@@ -85,6 +85,7 @@
role="tablist"
:aria-label="$t('Channel.Channel Tabs')"
>
+
{{ $t("Channel.Videos.Videos").toUpperCase() }}
+
{{ $t("Global.Shorts").toUpperCase() }}
+
{{ $t("Channel.Live.Live").toUpperCase() }}
+
{{ $t("Channel.Releases.Releases").toUpperCase() }}
+
{{ $t("Channel.Podcasts.Podcasts").toUpperCase() }}
+
{{ $t("Channel.Playlists.Playlists").toUpperCase() }}
+
+
+
{{ $t("Global.Videos").toUpperCase() }}
+
{{ $t("Global.Shorts").toUpperCase() }}
+
+
{{ $t("Trending.Default").toUpperCase() }}
+
{{ $t("Trending.Music").toUpperCase() }}
+
{{ $t("Trending.Gaming").toUpperCase() }}
+
=5.0.0:
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e"
- integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==
+aria-query@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e"
+ integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
dependencies:
- deep-equal "^2.0.5"
+ dequal "^2.0.3"
array-buffer-byte-length@^1.0.0:
version "1.0.0"
@@ -2221,29 +2225,29 @@ babel-loader@^9.1.3:
find-cache-dir "^4.0.0"
schema-utils "^4.0.0"
-babel-plugin-polyfill-corejs2@^0.4.4:
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz#9f9a0e1cd9d645cc246a5e094db5c3aa913ccd2b"
- integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==
+babel-plugin-polyfill-corejs2@^0.4.5:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c"
+ integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==
dependencies:
"@babel/compat-data" "^7.22.6"
- "@babel/helper-define-polyfill-provider" "^0.4.1"
- "@nicolo-ribaudo/semver-v6" "^6.3.3"
+ "@babel/helper-define-polyfill-provider" "^0.4.2"
+ semver "^6.3.1"
-babel-plugin-polyfill-corejs3@^0.8.2:
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz#d406c5738d298cd9c66f64a94cf8d5904ce4cc5e"
- integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==
+babel-plugin-polyfill-corejs3@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52"
+ integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.4.1"
+ "@babel/helper-define-polyfill-provider" "^0.4.2"
core-js-compat "^3.31.0"
-babel-plugin-polyfill-regenerator@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz#ace7a5eced6dff7d5060c335c52064778216afd3"
- integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==
+babel-plugin-polyfill-regenerator@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326"
+ integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.4.1"
+ "@babel/helper-define-polyfill-provider" "^0.4.2"
balanced-match@^1.0.0:
version "1.0.2"
@@ -2525,7 +2529,7 @@ caseless@~0.12.0:
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
-chalk@^2.0.0, chalk@^2.4.1:
+chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -3042,27 +3046,6 @@ decompress-response@^6.0.0:
dependencies:
mimic-response "^3.1.0"
-deep-equal@^2.0.5:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd"
- integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==
- dependencies:
- call-bind "^1.0.2"
- es-get-iterator "^1.1.2"
- get-intrinsic "^1.1.3"
- is-arguments "^1.1.1"
- is-date-object "^1.0.5"
- is-regex "^1.1.4"
- isarray "^2.0.5"
- object-is "^1.1.5"
- object-keys "^1.1.1"
- object.assign "^4.1.4"
- regexp.prototype.flags "^1.4.3"
- side-channel "^1.0.4"
- which-boxed-primitive "^1.0.2"
- which-collection "^1.0.1"
- which-typed-array "^1.1.8"
-
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -3116,6 +3099,11 @@ depd@~1.1.2:
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+dequal@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
+ integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+
destroy@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
@@ -3582,20 +3570,6 @@ es-abstract@^1.21.2:
unbox-primitive "^1.0.2"
which-typed-array "^1.1.10"
-es-get-iterator@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7"
- integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==
- dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.1.0"
- has-symbols "^1.0.1"
- is-arguments "^1.1.0"
- is-map "^2.0.2"
- is-set "^2.0.2"
- is-string "^1.0.5"
- isarray "^2.0.5"
-
es-module-lexer@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527"
@@ -3656,10 +3630,10 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-eslint-config-prettier@^8.9.0:
- version "8.9.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.9.0.tgz#094b6254b2804b0544f7cee535f802b6d29ee10b"
- integrity sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==
+eslint-config-prettier@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f"
+ integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==
eslint-config-standard@^17.1.0:
version "17.1.0"
@@ -3770,10 +3744,10 @@ eslint-plugin-unicorn@^48.0.1:
semver "^7.5.4"
strip-indent "^3.0.0"
-eslint-plugin-vue@^9.16.1:
- version "9.16.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.16.1.tgz#3508d9279d797b40889db76da2fd26524e9144e6"
- integrity sha512-2FtnTqazA6aYONfDuOZTk0QzwhAwi7Z4+uJ7+GHeGxcKapjqWlDsRWDenvyG/utyOfAS5bVRmAG3cEWiYEz2bA==
+eslint-plugin-vue@^9.17.0:
+ version "9.17.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz#4501547373f246547083482838b4c8f4b28e5932"
+ integrity sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
natural-compare "^1.4.0"
@@ -3783,12 +3757,12 @@ eslint-plugin-vue@^9.16.1:
vue-eslint-parser "^9.3.1"
xml-name-validator "^4.0.0"
-eslint-plugin-vuejs-accessibility@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-vuejs-accessibility/-/eslint-plugin-vuejs-accessibility-2.1.0.tgz#4ea331d509b84f68f161a66ff03c0dbddd79bd4a"
- integrity sha512-TM0JWrpOUOmka3v83QkH5uYkwUUNWg2RPa6imnBU1El2kRv0Ws1e9N84VPW2HLLTW+Fo+XsdKmiKLXwtIhCqsg==
+eslint-plugin-vuejs-accessibility@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vuejs-accessibility/-/eslint-plugin-vuejs-accessibility-2.2.0.tgz#7880e5dd3fa8e707f9170e698427894e92d6ac36"
+ integrity sha512-/Dr02rkrBU/mDE4+xO8/9Y230mC9ZTkh2U5tJHEFHxw/CldccmVCWgWs4NM1lq+Bbu9bJzwJPHOsZ+o5wIQuOA==
dependencies:
- aria-query ">=5.0.0"
+ aria-query "^5.3.0"
emoji-regex "^10.0.0"
vue-eslint-parser "^9.0.1"
@@ -3823,20 +3797,20 @@ eslint-visitor-keys@^2.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.2:
- version "3.4.2"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f"
- integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==
+eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
-eslint@^8.46.0:
- version "8.46.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.46.0.tgz#a06a0ff6974e53e643acc42d1dcf2e7f797b3552"
- integrity sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==
+eslint@^8.47.0:
+ version "8.47.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.47.0.tgz#c95f9b935463fb4fad7005e626c7621052e90806"
+ integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.6.1"
- "@eslint/eslintrc" "^2.1.1"
- "@eslint/js" "^8.46.0"
+ "@eslint/eslintrc" "^2.1.2"
+ "@eslint/js" "^8.47.0"
"@humanwhocodes/config-array" "^0.11.10"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
@@ -3847,7 +3821,7 @@ eslint@^8.46.0:
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
eslint-scope "^7.2.2"
- eslint-visitor-keys "^3.4.2"
+ eslint-visitor-keys "^3.4.3"
espree "^9.6.1"
esquery "^1.4.2"
esutils "^2.0.2"
@@ -4908,7 +4882,7 @@ ipaddr.js@^2.0.1:
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0"
integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==
-is-arguments@^1.0.4, is-arguments@^1.1.0, is-arguments@^1.1.1:
+is-arguments@^1.0.4:
version "1.1.1"
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
@@ -4992,7 +4966,7 @@ is-core-module@^2.11.0, is-core-module@^2.12.0, is-core-module@^2.12.1, is-core-
dependencies:
has "^1.0.3"
-is-date-object@^1.0.1, is-date-object@^1.0.5:
+is-date-object@^1.0.1:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
@@ -5033,11 +5007,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
dependencies:
is-extglob "^2.1.1"
-is-map@^2.0.1, is-map@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
- integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
-
is-negative-zero@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
@@ -5090,11 +5059,6 @@ is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
-is-set@^2.0.1, is-set@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
- integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
-
is-shared-array-buffer@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
@@ -5148,11 +5112,6 @@ is-typedarray@~1.0.0:
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
-is-weakmap@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
- integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
-
is-weakref@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
@@ -5160,14 +5119,6 @@ is-weakref@^1.0.2:
dependencies:
call-bind "^1.0.2"
-is-weakset@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d"
- integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
- dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.1.1"
-
is-wsl@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
@@ -5429,59 +5380,59 @@ lazy-val@^1.0.4, lazy-val@^1.0.5:
resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
-lefthook-darwin-arm64@1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.4.7.tgz#26e5a78d73cb761a48914535d3f13908cad6bf02"
- integrity sha512-26zPoDw9gUXCroqf8OIb3qHjIq7XWrRQKdwFz2RgCfOphY22XNEucq0W+5on5s4LeqI9GieKeYQ+R0UBTjQ5LA==
-
-lefthook-darwin-x64@1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/lefthook-darwin-x64/-/lefthook-darwin-x64-1.4.7.tgz#6afb0ff683127b9e24d01a32c6b249854b1ac0dd"
- integrity sha512-LSPiHTGEYqcABYuKqK+5+4SW6tmDXRUhSmZqcd7VSFsGa/9HU7imzqcbreiVPEO7ahKUDFYOB0riPV4g/Qys7w==
-
-lefthook-freebsd-arm64@1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.4.7.tgz#0bd3f4d61339aee7155c7e9631b8310b56e2b89d"
- integrity sha512-b7LJdWwnrkh3uuWKqNfrlvau8/9N78IoxPz1z/xo468WcwroCYORRGpM+lKvgmKjrVFOJZQ6lFIYvVe8212wZg==
-
-lefthook-freebsd-x64@1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.4.7.tgz#5780bb7c2397ce35387677d2aafb80ed4a13cf90"
- integrity sha512-+sOYtxlyB9iwVHZLyoD0P7qg/8Guqjk5wmslXQrM89ilEQmDL+gnPRaqfEZrByjNEi/ltPTZ0YlOXeK/qxM0mg==
-
-lefthook-linux-arm64@1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/lefthook-linux-arm64/-/lefthook-linux-arm64-1.4.7.tgz#e798759e64a7097377894876a36375b10ba4bc3a"
- integrity sha512-Gli+cAqnBX0bCwv0mON8PM7SY/aIaM4H+nbqad5HlDHZ3ovoQBPxCmEvMxug7/Ssa3v3zdZ1cR2FkRrgzA1w+w==
-
-lefthook-linux-x64@1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/lefthook-linux-x64/-/lefthook-linux-x64-1.4.7.tgz#34bbc4440b253ac58a350b46f0367b4dcb054bbb"
- integrity sha512-XVN686RdGB8UB/zguDeY+Nx6ikN1I9g3QBGBOGPE3aj9waB86+FotPhat/c9wfb9T0gkhKnxMiQ9kO8nvDuQxw==
-
-lefthook-windows-arm64@1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/lefthook-windows-arm64/-/lefthook-windows-arm64-1.4.7.tgz#a6232062f7d616ea0c74c95b759d86466fe972c9"
- integrity sha512-CxZwmsIV9h1N2NPZ08a2V9jXzvaDMPwmyByDJZNOkWW1Z3Dx/Q76VK4X7aS3HhyLpudzwYEYScWhQ+SIOmx6IA==
-
-lefthook-windows-x64@1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/lefthook-windows-x64/-/lefthook-windows-x64-1.4.7.tgz#369dc2404f32d098c44ecd944e144f4aa86c2e0a"
- integrity sha512-Hu/GoPrJviM9gbys11ZJEIgTXyQ4btifUn6WBFW4M7NpA8rxx1bbLfXdDlcl6W28BGDb1aFIXVdnJIupK01hUw==
-
-lefthook@^1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/lefthook/-/lefthook-1.4.7.tgz#9cf46aa7dff3fab00e571af6019b44e51a4d5279"
- integrity sha512-0fCJ1ekbGG+Pi+xK9bnBF4B5eXHf/FRSiuLRP0ofYYs8LO7p1f7qbYQTCj3qjGBs6mvv/wq4UIR8e+Gi+L06TA==
+lefthook-darwin-arm64@1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.4.8.tgz#4d1a425b5aad9cf598dcf3ed5a65078dc90d56c6"
+ integrity sha512-wUaasRq7P1BNAlGwu/vONVHrwlrTwQGEhyn0leciEcnQCUN8aTeEC4hkxHmxisgQVQTdidYkCSWcsaEFn84xzw==
+
+lefthook-darwin-x64@1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/lefthook-darwin-x64/-/lefthook-darwin-x64-1.4.8.tgz#a5f25db8411b8d9f0e5a26a1f49e150dfdd780e4"
+ integrity sha512-uUkQeU08szL4IpKVQSlhzNObZ79YkwmZ3fZDmF+jjP69LMESEVY7Y+cuQI0RG4YOTXHGBqZs3MPUZ7ZygBrhcQ==
+
+lefthook-freebsd-arm64@1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.4.8.tgz#c31b4d7f74ce29eeb27a9bde238d52d5526dd554"
+ integrity sha512-X4rWxsmxfyMRgfIOqAnk2zrMzlJV0fANEDYNuUYBVbgH8IYAy1cyVQlolgeC8NhFW8VaJ3AztbWpnR1M8zEByA==
+
+lefthook-freebsd-x64@1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.4.8.tgz#1d1382f35e0da9d5d5efc90bbc2581e1425c5924"
+ integrity sha512-ijenlZtEZpbnLFWTZdsIDmVdLzkaTkeEQVjjHEXdo2GBjLmdLYk8hRQiY/7oUxFe/JO1RLuhfIlPkKLtYz1iTQ==
+
+lefthook-linux-arm64@1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/lefthook-linux-arm64/-/lefthook-linux-arm64-1.4.8.tgz#21aa8db2591ea772869885f5e9fc6b0e4ffefd32"
+ integrity sha512-lOsJymblZ8nIpgm2lLfWx33tXtkdamK0lZThbSK4uwZQWFzSjr9qx21qZlJZ/mG8jZ5EY5Twhjqrt131CUXtMw==
+
+lefthook-linux-x64@1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/lefthook-linux-x64/-/lefthook-linux-x64-1.4.8.tgz#dcedf19c6633867e43aec7455a3a3e04312e1f59"
+ integrity sha512-tF/iQFZu9iR++C3UXvpeTQS50CtTdZWmeMJ49uAovu9qe3qpPdKoguorZSFDC2+OGYbd7wbulldpWhvgxarniA==
+
+lefthook-windows-arm64@1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/lefthook-windows-arm64/-/lefthook-windows-arm64-1.4.8.tgz#9c259243943197bf7479538e934e9e692476285b"
+ integrity sha512-ykqX5rm5UI6244cF6anf92p+JXNvuA/Ah3bpQKYSA5JoMG2vJmPZ9nIThq5ky/F90jXySBxcdZRdrridtagAbw==
+
+lefthook-windows-x64@1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/lefthook-windows-x64/-/lefthook-windows-x64-1.4.8.tgz#9226edf148e66fbf583f4438cdeea5d810fee3c4"
+ integrity sha512-wv8in0vku5eDpjNtri4s02kXbowEa6t/h8pHHUnCedmJJ2ImwwqGQJ1kwDVQL0U3bgdNWCfC2mUxVmtXoLQkBg==
+
+lefthook@^1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/lefthook/-/lefthook-1.4.8.tgz#8028217992d58657ec6eb96235d04ecd61fcabd3"
+ integrity sha512-SALO6nIy0aizM3FJdy4cNdUy9qKJyGZo6f8gZdzhBuKLMrwnm9YeMdJmQKeEPZA9E2mDSqdHGJjvMlKrm+04Pg==
optionalDependencies:
- lefthook-darwin-arm64 "1.4.7"
- lefthook-darwin-x64 "1.4.7"
- lefthook-freebsd-arm64 "1.4.7"
- lefthook-freebsd-x64 "1.4.7"
- lefthook-linux-arm64 "1.4.7"
- lefthook-linux-x64 "1.4.7"
- lefthook-windows-arm64 "1.4.7"
- lefthook-windows-x64 "1.4.7"
+ lefthook-darwin-arm64 "1.4.8"
+ lefthook-darwin-x64 "1.4.8"
+ lefthook-freebsd-arm64 "1.4.8"
+ lefthook-freebsd-x64 "1.4.8"
+ lefthook-linux-arm64 "1.4.8"
+ lefthook-linux-x64 "1.4.8"
+ lefthook-windows-arm64 "1.4.8"
+ lefthook-windows-x64 "1.4.8"
levn@^0.4.1:
version "0.4.1"
@@ -5659,10 +5610,10 @@ map-obj@^4.1.0:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
-marked@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
- integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==
+marked@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-7.0.2.tgz#7df34d9393bce63d175bcbdbe1de7b6727b3088d"
+ integrity sha512-ADEBjnCHOrsLoV7JPvUNWtELZ0b4SeIALhrfxuA9uhS3hw2PCezROoFduIqMOjeagBPto732+YC5tZHBMQRdqg==
matcher@^3.0.0:
version "3.0.0"
@@ -5938,13 +5889,6 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-nedb-promises@^6.2.1:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/nedb-promises/-/nedb-promises-6.2.1.tgz#5280a32fb9c9996e77a93195f595860f88e8454a"
- integrity sha512-vurL/Hfsk37mbsjYTu+MKnMUytboKBjWWEA0N35ArCBMdDW5x2BAE7Xny4qnlpR90ZuaI8gdWbbGQ2ZoJSp/FQ==
- dependencies:
- "@seald-io/nedb" "^3.1.0"
-
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
@@ -6062,14 +6006,6 @@ object-inspect@^1.12.3:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
-object-is@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
- integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
-
object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
@@ -6942,10 +6878,10 @@ regenerator-runtime@^0.13.4:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
-regenerator-transform@^0.15.1:
- version "0.15.1"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56"
- integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==
+regenerator-transform@^0.15.2:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
+ integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
dependencies:
"@babel/runtime" "^7.8.4"
@@ -7222,10 +7158,10 @@ sass-loader@^13.3.2:
dependencies:
neo-async "^2.6.2"
-sass@^1.64.1:
- version "1.64.1"
- resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.1.tgz#6a46f6d68e0fa5ad90aa59ce025673ddaa8441cf"
- integrity sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==
+sass@^1.65.1:
+ version "1.65.1"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.65.1.tgz#8f283b0c26335a88246a448d22e1342ba2ea1432"
+ integrity sha512-9DINwtHmA41SEd36eVPQ9BJKpn7eKDQmUHmpI0y5Zv2Rcorrh0zS+cFrt050hdNbmmCNKTW3hV5mWfuegNRsEA==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@@ -7747,10 +7683,10 @@ stylelint-config-standard@^34.0.0:
dependencies:
stylelint-config-recommended "^13.0.0"
-stylelint-high-performance-animation@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/stylelint-high-performance-animation/-/stylelint-high-performance-animation-1.8.0.tgz#f118fbc232206f1da6a471d62ac227939d43a479"
- integrity sha512-wxHt+F7Z54mtGZpbdMwUtpfQwr81uiml39EFCCdZAbVnEO7Wl0Mh5ncmgbxH42xpB5z79eIgHI62qtKfUmWzhg==
+stylelint-high-performance-animation@^1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/stylelint-high-performance-animation/-/stylelint-high-performance-animation-1.9.0.tgz#7859f4b33fccb5ddf2d6d41b1b796bf1800bf37c"
+ integrity sha512-tUN8YqIRFRCsMLLI1wnyODP6+H5Lc63NEaUcOt1lqNaEEgd0tGgA4miY2JuL8eSHvgmGkmZPZTn1Dgek05O3uQ==
dependencies:
postcss-value-parser "^4.2.0"
@@ -8599,16 +8535,6 @@ which-boxed-primitive@^1.0.2:
is-string "^1.0.5"
is-symbol "^1.0.3"
-which-collection@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
- integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
- dependencies:
- is-map "^2.0.1"
- is-set "^2.0.1"
- is-weakmap "^2.0.1"
- is-weakset "^2.0.1"
-
which-typed-array@^1.1.10:
version "1.1.11"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a"
@@ -8632,7 +8558,7 @@ which-typed-array@^1.1.2:
has-tostringtag "^1.0.0"
is-typed-array "^1.1.9"
-which-typed-array@^1.1.8, which-typed-array@^1.1.9:
+which-typed-array@^1.1.9:
version "1.1.9"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==