diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 1359e36f..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true - }, - "overrides": [ - { - "files": ["*.json", "*.json5"], - "extends": [ - "eslint:recommended", - "airbnb-base", - "plugin:@intlify/vue-i18n/recommended", - "prettier" - ] - }, - { - "files": ["*.ts", "*.js", "*.vue"], - "extends": [ - "airbnb-base", - "airbnb-typescript/base", - "@nuxtjs/eslint-config-typescript", - "plugin:promise/recommended", - "plugin:@intlify/vue-i18n/recommended", - "plugin:@vitest/legacy-recommended", - "prettier" - ], - "rules": { - "no-bitwise": "off", - "no-plusplus": "off", - "@intlify/vue-i18n/no-raw-text": [ - "warn", - { - "attributes": { - "/.+/": [ - "title", - "aria-label", - "aria-placeholder", - "aria-roledescription", - "aria-valuetext" - ], - "input": ["placeholder"], - "img": ["alt"] - } - } - ], - "no-param-reassign": ["error", { "props": false }], - "@typescript-eslint/consistent-type-assertions": [ - "warn", - { "assertionStyle": "never" } - ], - "import/consistent-type-specifier-style": ["error", "prefer-top-level"], - "promise/always-return": "off" - } - }, - { - "files": ["*.spec.ts"], - "rules": { - // Sometimes its too much of a hassle to implement the full type, so we want to cast and object having a subset of it. - "@typescript-eslint/consistent-type-assertions": "off", - - // If I want an element to exist and the system to throw if not found. Useful when searching for UI elements to act on. - "@typescript-eslint/no-non-null-assertion": "off", - - // If it doesn't exist or has the wrong type, the test should fail. Added to support calling methods of ".vue" files. - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-unsafe-member-access": "off" - } - }, - { - "files": ["vitest.config.ts", "cypress.config.ts", "cypress/**/*.ts"], - "rules": { - "@vitest/expect-expect": "off", - "import/no-extraneous-dependencies": [ - "error", - { "devDependencies": true } - ] - } - }, - { - "files": ["stores/**/*.ts", "composables/**/*.ts"], - "rules": { - "import/prefer-default-export": "off" - } - }, - { - "files": ["electron/**/*.ts"], - "rules": { - "import/no-extraneous-dependencies": "off" - } - } - ], - "parser": "vue-eslint-parser", - "parserOptions": { - "parser": "@typescript-eslint/parser", - "ecmaVersion": "latest", - "project": ["tsconfig.json"], - "extraFileExtensions": [".vue"] - }, - "plugins": ["vue", "@typescript-eslint", "@vitest"], - "rules": { - "@intlify/vue-i18n/valid-message-syntax": "warn", - "@intlify/vue-i18n/no-duplicate-keys-in-locale": "warn", - "@intlify/vue-i18n/no-missing-keys-in-other-locales": "warn", - "@intlify/vue-i18n/no-raw-text": "warn", - "@intlify/vue-i18n/no-dynamic-keys": "warn", - "@intlify/vue-i18n/no-unused-keys": [ - "warn", - { "extensions": [".vue", ".ts"] } - ], - "vue/no-v-html": "off" - }, - "settings": { - "import/core-modules": ["#app"], - "vue-i18n": { - "localeDir": "./locales/*.json" - } - } -} diff --git a/.gitignore b/.gitignore index 4c8c05ec..cd732743 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ -node_modules +node_modules/ *.log* -.nuxt +.nuxt/ .nitro .cache .output @@ -9,6 +9,9 @@ dist dist-electron dist-app coverage +package-lock.json +pnpm-lock.yaml + cypress.env.json cypress/videos/* diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 1efb3ee4..00000000 --- a/.npmrc +++ /dev/null @@ -1,3 +0,0 @@ -shamefully-hoist=true -strict-peer-dependencies=false -auto-install-peers=true diff --git a/.nuxtrc b/.nuxtrc new file mode 100644 index 00000000..1e1fe833 --- /dev/null +++ b/.nuxtrc @@ -0,0 +1 @@ +setups.@nuxt/test-utils="4.0.0" \ No newline at end of file diff --git a/.stylelintrc.json b/.stylelintrc.json index a22e3fdb..e03ab62f 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -1,5 +1,4 @@ { - "processors": ["stylelint-processor-html"], "extends": [ "stylelint-config-recommended-scss", "stylelint-config-recommended-vue/scss" diff --git a/.vscode/extensions.json b/.vscode/extensions.json index fef105e5..cc4c44d9 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,7 @@ { "recommendations": [ "Vue.volar", - "ZixuanChen.vitest-explorer", + "vitest.explorer", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "stylelint.vscode-stylelint", diff --git a/.vscode/settings.json b/.vscode/settings.json index 4874052d..f9388a1a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, + "editor.formatOnSave": false, "stylelint.validate": ["css", "less", "postcss", "vue"], "tailwindCSS.experimental.classRegex": [ ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"] diff --git a/README.md b/README.md index 6330c58f..de900c85 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has a 1. Disable the built-in TypeScript Extension 1. Run `Extensions: Show Built-in Extensions` from VSCode's command palette - 2. Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)` + 2. Find `JavaScript and TypeScript Language Features`, right click and select `Disable (Workspace)` 2. Reload the VSCode window by running `Developer: Reload Window` from the command palette. ## Creating a new electron build diff --git a/app/app.config.ts b/app/app.config.ts new file mode 100644 index 00000000..b2d0682c --- /dev/null +++ b/app/app.config.ts @@ -0,0 +1 @@ +export default defineAppConfig({}); diff --git a/app.vue b/app/app.vue similarity index 97% rename from app.vue rename to app/app.vue index b167e651..77b7f1a7 100644 --- a/app.vue +++ b/app/app.vue @@ -124,7 +124,7 @@ useHead({
-
+
- +
{{ $t("login.redirect-message.redirect-info") }}
- +
{{ $t("login.error-message.logout-and-redirect-info") }}
{{ error }}
{ style="-webkit-app-region: drag" >
-
+
+ />
+ />
diff --git a/components/EndlessDocumentList.vue b/app/components/EndlessDocumentList.vue similarity index 100% rename from components/EndlessDocumentList.vue rename to app/components/EndlessDocumentList.vue diff --git a/components/ErrorMsg.vue b/app/components/ErrorMsg.vue similarity index 100% rename from components/ErrorMsg.vue rename to app/components/ErrorMsg.vue diff --git a/components/FadeInImage.vue b/app/components/FadeInImage.vue similarity index 100% rename from components/FadeInImage.vue rename to app/components/FadeInImage.vue diff --git a/components/GenericListItem.vue b/app/components/GenericListItem.vue similarity index 100% rename from components/GenericListItem.vue rename to app/components/GenericListItem.vue diff --git a/components/I18nText.vue b/app/components/I18nText.vue similarity index 100% rename from components/I18nText.vue rename to app/components/I18nText.vue diff --git a/components/InfoMessageItem.vue b/app/components/InfoMessageItem.vue similarity index 100% rename from components/InfoMessageItem.vue rename to app/components/InfoMessageItem.vue diff --git a/components/ItemCard.vue b/app/components/ItemCard.vue similarity index 100% rename from components/ItemCard.vue rename to app/components/ItemCard.vue diff --git a/components/KeyboardShortcut.vue b/app/components/KeyboardShortcut.vue similarity index 100% rename from components/KeyboardShortcut.vue rename to app/components/KeyboardShortcut.vue diff --git a/components/LyricsEditor.vue b/app/components/LyricsEditor.vue similarity index 100% rename from components/LyricsEditor.vue rename to app/components/LyricsEditor.vue diff --git a/components/PageHeading.vue b/app/components/PageHeading.vue similarity index 100% rename from components/PageHeading.vue rename to app/components/PageHeading.vue diff --git a/components/PrivatePlaylistMenu.vue b/app/components/PrivatePlaylistMenu.vue similarity index 100% rename from components/PrivatePlaylistMenu.vue rename to app/components/PrivatePlaylistMenu.vue diff --git a/components/ProfileMenu.vue b/app/components/ProfileMenu.vue similarity index 100% rename from components/ProfileMenu.vue rename to app/components/ProfileMenu.vue diff --git a/components/ProjectBoxItem.vue b/app/components/ProjectBoxItem.vue similarity index 100% rename from components/ProjectBoxItem.vue rename to app/components/ProjectBoxItem.vue diff --git a/components/ProtectedImage.spec.ts b/app/components/ProtectedImage.spec.ts similarity index 100% rename from components/ProtectedImage.spec.ts rename to app/components/ProtectedImage.spec.ts diff --git a/components/ProtectedImage.vue b/app/components/ProtectedImage.vue similarity index 100% rename from components/ProtectedImage.vue rename to app/components/ProtectedImage.vue diff --git a/components/RecommendationItem.vue b/app/components/RecommendationItem.vue similarity index 100% rename from components/RecommendationItem.vue rename to app/components/RecommendationItem.vue diff --git a/components/SiteLogo.vue b/app/components/SiteLogo.vue similarity index 100% rename from components/SiteLogo.vue rename to app/components/SiteLogo.vue diff --git a/components/TextMarquee.vue b/app/components/TextMarquee.vue similarity index 100% rename from components/TextMarquee.vue rename to app/components/TextMarquee.vue diff --git a/components/TileItem.vue b/app/components/TileItem.vue similarity index 100% rename from components/TileItem.vue rename to app/components/TileItem.vue diff --git a/components/TimeDuration.vue b/app/components/TimeDuration.vue similarity index 100% rename from components/TimeDuration.vue rename to app/components/TimeDuration.vue diff --git a/components/TooltipBase.vue b/app/components/TooltipBase.vue similarity index 100% rename from components/TooltipBase.vue rename to app/components/TooltipBase.vue diff --git a/components/TrackCollectionHeader.vue b/app/components/TrackCollectionHeader.vue similarity index 100% rename from components/TrackCollectionHeader.vue rename to app/components/TrackCollectionHeader.vue diff --git a/components/TrackCountAndDuration.vue b/app/components/TrackCountAndDuration.vue similarity index 100% rename from components/TrackCountAndDuration.vue rename to app/components/TrackCountAndDuration.vue diff --git a/components/album/SubAlbum.vue b/app/components/album/SubAlbum.vue similarity index 100% rename from components/album/SubAlbum.vue rename to app/components/album/SubAlbum.vue diff --git a/components/dashboard/DashboardDataTable.vue b/app/components/dashboard/DashboardDataTable.vue similarity index 100% rename from components/dashboard/DashboardDataTable.vue rename to app/components/dashboard/DashboardDataTable.vue diff --git a/components/dashboard/DashboardStatistic.vue b/app/components/dashboard/DashboardStatistic.vue similarity index 100% rename from components/dashboard/DashboardStatistic.vue rename to app/components/dashboard/DashboardStatistic.vue diff --git a/components/dashboard/DashboardTimeSeriesChart.vue b/app/components/dashboard/DashboardTimeSeriesChart.vue similarity index 100% rename from components/dashboard/DashboardTimeSeriesChart.vue rename to app/components/dashboard/DashboardTimeSeriesChart.vue diff --git a/components/dialog/DialogBase.vue b/app/components/dialog/DialogBase.vue similarity index 100% rename from components/dialog/DialogBase.vue rename to app/components/dialog/DialogBase.vue diff --git a/components/dialog/DialogDownloadNotAllowed.vue b/app/components/dialog/DialogDownloadNotAllowed.vue similarity index 100% rename from components/dialog/DialogDownloadNotAllowed.vue rename to app/components/dialog/DialogDownloadNotAllowed.vue diff --git a/components/dialog/DialogPlain.vue b/app/components/dialog/DialogPlain.vue similarity index 100% rename from components/dialog/DialogPlain.vue rename to app/components/dialog/DialogPlain.vue diff --git a/components/dialog/ErrorDialog.vue b/app/components/dialog/ErrorDialog.vue similarity index 100% rename from components/dialog/ErrorDialog.vue rename to app/components/dialog/ErrorDialog.vue diff --git a/components/dropdown/DropdownMenu.vue b/app/components/dropdown/DropdownMenu.vue similarity index 100% rename from components/dropdown/DropdownMenu.vue rename to app/components/dropdown/DropdownMenu.vue diff --git a/components/dropdown/DropdownMenuGroup.vue b/app/components/dropdown/DropdownMenuGroup.vue similarity index 100% rename from components/dropdown/DropdownMenuGroup.vue rename to app/components/dropdown/DropdownMenuGroup.vue diff --git a/components/dropdown/DropdownMenuItem.vue b/app/components/dropdown/DropdownMenuItem.vue similarity index 100% rename from components/dropdown/DropdownMenuItem.vue rename to app/components/dropdown/DropdownMenuItem.vue diff --git a/components/media-player/MediaPlayer.vue b/app/components/media-player/MediaPlayer.vue similarity index 100% rename from components/media-player/MediaPlayer.vue rename to app/components/media-player/MediaPlayer.vue diff --git a/components/media-player/MediaPlayerClosed.vue b/app/components/media-player/MediaPlayerClosed.vue similarity index 100% rename from components/media-player/MediaPlayerClosed.vue rename to app/components/media-player/MediaPlayerClosed.vue diff --git a/components/media-player/MediaPlayerOpen.vue b/app/components/media-player/MediaPlayerOpen.vue similarity index 100% rename from components/media-player/MediaPlayerOpen.vue rename to app/components/media-player/MediaPlayerOpen.vue diff --git a/components/media-player/PositionSlider.vue b/app/components/media-player/PositionSlider.vue similarity index 100% rename from components/media-player/PositionSlider.vue rename to app/components/media-player/PositionSlider.vue diff --git a/components/media-player/VolumeSlider.vue b/app/components/media-player/VolumeSlider.vue similarity index 100% rename from components/media-player/VolumeSlider.vue rename to app/components/media-player/VolumeSlider.vue diff --git a/components/page-editor/PageEditorDatetimeInput.vue b/app/components/page-editor/PageEditorDatetimeInput.vue similarity index 100% rename from components/page-editor/PageEditorDatetimeInput.vue rename to app/components/page-editor/PageEditorDatetimeInput.vue diff --git a/components/page-editor/PageEditorElement.vue b/app/components/page-editor/PageEditorElement.vue similarity index 100% rename from components/page-editor/PageEditorElement.vue rename to app/components/page-editor/PageEditorElement.vue diff --git a/components/page-editor/PageEditorFieldset.vue b/app/components/page-editor/PageEditorFieldset.vue similarity index 100% rename from components/page-editor/PageEditorFieldset.vue rename to app/components/page-editor/PageEditorFieldset.vue diff --git a/components/page-editor/PageEditorInput.vue b/app/components/page-editor/PageEditorInput.vue similarity index 100% rename from components/page-editor/PageEditorInput.vue rename to app/components/page-editor/PageEditorInput.vue diff --git a/components/sidebar/AddPlaylist.vue b/app/components/sidebar/AddPlaylist.vue similarity index 100% rename from components/sidebar/AddPlaylist.vue rename to app/components/sidebar/AddPlaylist.vue diff --git a/components/sidebar/DesktopPromo.vue b/app/components/sidebar/DesktopPromo.vue similarity index 100% rename from components/sidebar/DesktopPromo.vue rename to app/components/sidebar/DesktopPromo.vue diff --git a/components/sidebar/SidebarElement.vue b/app/components/sidebar/SidebarElement.vue similarity index 97% rename from components/sidebar/SidebarElement.vue rename to app/components/sidebar/SidebarElement.vue index b517e32a..8bd24527 100644 --- a/components/sidebar/SidebarElement.vue +++ b/app/components/sidebar/SidebarElement.vue @@ -1,5 +1,5 @@ diff --git a/pages/year-in-review.vue b/app/pages/year-in-review.vue similarity index 100% rename from pages/year-in-review.vue rename to app/pages/year-in-review.vue diff --git a/plugins/00.sentry.client.ts b/app/plugins/00.sentry.client.ts similarity index 100% rename from plugins/00.sentry.client.ts rename to app/plugins/00.sentry.client.ts diff --git a/plugins/1.auth0.client.ts b/app/plugins/1.auth0.client.ts similarity index 100% rename from plugins/1.auth0.client.ts rename to app/plugins/1.auth0.client.ts diff --git a/plugins/1.auth0.server.ts b/app/plugins/1.auth0.server.ts similarity index 100% rename from plugins/1.auth0.server.ts rename to app/plugins/1.auth0.server.ts diff --git a/plugins/2.bmm-api.ts b/app/plugins/2.bmm-api.ts similarity index 100% rename from plugins/2.bmm-api.ts rename to app/plugins/2.bmm-api.ts diff --git a/plugins/2.userData.ts b/app/plugins/2.userData.ts similarity index 100% rename from plugins/2.userData.ts rename to app/plugins/2.userData.ts diff --git a/plugins/3.applicationInsights.ts b/app/plugins/3.applicationInsights.ts similarity index 98% rename from plugins/3.applicationInsights.ts rename to app/plugins/3.applicationInsights.ts index 7037b321..5798b9df 100644 --- a/plugins/3.applicationInsights.ts +++ b/app/plugins/3.applicationInsights.ts @@ -4,7 +4,7 @@ /* eslint-disable no-nested-ternary */ import { ApplicationInsights } from "@microsoft/applicationinsights-web"; -import { version } from "~/package.json"; +import { version } from "~~/package.json"; import type { IUserData } from "./2.userData"; export interface AppInsights { diff --git a/plugins/4.mediaPlayer.ts b/app/plugins/4.mediaPlayer.ts similarity index 100% rename from plugins/4.mediaPlayer.ts rename to app/plugins/4.mediaPlayer.ts diff --git a/plugins/5.mediaKeys.ts b/app/plugins/5.mediaKeys.ts similarity index 100% rename from plugins/5.mediaKeys.ts rename to app/plugins/5.mediaKeys.ts diff --git a/app/plugins/VueSanitize.ts b/app/plugins/VueSanitize.ts new file mode 100644 index 00000000..8a1e95c9 --- /dev/null +++ b/app/plugins/VueSanitize.ts @@ -0,0 +1,5 @@ +import VueSanitize from "vue-sanitize-directive"; + +export default defineNuxtPlugin((nuxtApp) => { + nuxtApp.vueApp.use(VueSanitize); +}); diff --git a/app/plugins/i18n.ts b/app/plugins/i18n.ts new file mode 100644 index 00000000..08956944 --- /dev/null +++ b/app/plugins/i18n.ts @@ -0,0 +1,49 @@ +import { createI18n } from "vue-i18n"; +import da from "../locales/da.json"; +import de from "../locales/de.json"; +import el from "../locales/el.json"; +import en from "../locales/en.json"; +import es from "../locales/es.json"; +import et from "../locales/et.json"; +import fi from "../locales/fi.json"; +import fr from "../locales/fr.json"; +import hu from "../locales/hu.json"; +import it from "../locales/it.json"; +import nb from "../locales/nb.json"; +import nl from "../locales/nl.json"; +import pl from "../locales/pl.json"; +import pt from "../locales/pt.json"; +import ro from "../locales/ro.json"; +import ru from "../locales/ru.json"; +import sl from "../locales/sl.json"; +import ta from "../locales/ta.json"; +import tr from "../locales/tr.json"; + +export default defineNuxtPlugin(({ vueApp }) => { + const i18n = createI18n({ + globalInjection: true, + locale: "en", + messages: { + da, + de, + el, + en, + es, + et, + fi, + fr, + hu, + it, + nb, + nl, + pl, + pt, + ro, + ru, + sl, + ta, + tr + }, + }); + vueApp.use(i18n); +}); diff --git a/plugins/mediaPlayer/EnrichedTrackModel.ts b/app/plugins/mediaPlayer/EnrichedTrackModel.ts similarity index 100% rename from plugins/mediaPlayer/EnrichedTrackModel.ts rename to app/plugins/mediaPlayer/EnrichedTrackModel.ts diff --git a/plugins/mediaPlayer/MediaTrack.spec.ts b/app/plugins/mediaPlayer/MediaTrack.spec.ts similarity index 95% rename from plugins/mediaPlayer/MediaTrack.spec.ts rename to app/plugins/mediaPlayer/MediaTrack.spec.ts index 86720398..9fdfc7ce 100644 --- a/plugins/mediaPlayer/MediaTrack.spec.ts +++ b/app/plugins/mediaPlayer/MediaTrack.spec.ts @@ -5,6 +5,7 @@ import { HTMLAudioElement, Event } from "happy-dom"; import { flushPromises } from "@vue/test-utils"; import MediaTrack from "./MediaTrack"; import type { AppInsights } from "../3.applicationInsights"; +import { ref } from "vue"; class MediaTrackMock extends MediaTrack { public get audioElementMock() { @@ -17,7 +18,7 @@ class MediaTrackMock extends MediaTrack { } const appInsights: AppInsights = { - event: (_: string, _2: any) => {}, + event: (_: string, _2: unknown) => {}, }; describe("plugin mediaPlayer MediaTrack", () => { @@ -57,11 +58,11 @@ describe("plugin mediaPlayer MediaTrack", () => { mT.registerEvents(); mT.registerSource(); mT.loading = true; - (audio as any).duration = 1000; + (audio as unknown).duration = 1000; audio.dispatchEvent( new Event("durationchange", { bubbles: false, cancelable: false }), ); - (audio as any).currentTime = 500; + (audio as unknown).currentTime = 500; audio.dispatchEvent( new Event("timeupdate", { bubbles: false, cancelable: false }), ); @@ -159,12 +160,12 @@ describe("plugin mediaPlayer MediaTrack", () => { // Act await flushPromises(); - (audio as any).duration = 500; + (audio as unknown).duration = 500; audio.dispatchEvent( new Event("durationchange", { bubbles: false, cancelable: false }), ); await flushPromises(); - (audio as any).duration = 800; + (audio as unknown).duration = 800; audio.dispatchEvent( new Event("durationchange", { bubbles: false, cancelable: false }), ); @@ -200,12 +201,12 @@ describe("plugin mediaPlayer MediaTrack", () => { // Act await flushPromises(); - (audio as any).duration = 500; + (audio as unknown).duration = 500; audio.dispatchEvent( new Event("durationchange", { bubbles: false, cancelable: false }), ); await flushPromises(); - (audio as any).duration = +Infinity; + (audio as unknown).duration = +Infinity; audio.dispatchEvent( new Event("durationchange", { bubbles: false, cancelable: false }), ); @@ -321,12 +322,12 @@ describe("plugin mediaPlayer MediaTrack", () => { // Act await flushPromises(); - (audio as any).currentTime = 500; + (audio as unknown).currentTime = 500; audio.dispatchEvent( new Event("timeupdate", { bubbles: false, cancelable: false }), ); await flushPromises(); - (audio as any).currentTime = 501; + (audio as unknown).currentTime = 501; audio.dispatchEvent( new Event("timeupdate", { bubbles: false, cancelable: false }), ); @@ -362,22 +363,22 @@ describe("plugin mediaPlayer MediaTrack", () => { // Act await flushPromises(); - (audio as any).currentTime = 500; + (audio as unknown).currentTime = 500; audio.dispatchEvent( new Event("timeupdate", { bubbles: false, cancelable: false }), ); await flushPromises(); - (audio as any).currentTime = 500; + (audio as unknown).currentTime = 500; audio.dispatchEvent( new Event("timeupdate", { bubbles: false, cancelable: false }), ); await flushPromises(); - (audio as any).currentTime = 500; + (audio as unknown).currentTime = 500; audio.dispatchEvent( new Event("timeupdate", { bubbles: false, cancelable: false }), ); await flushPromises(); - (audio as any).currentTime = 500; + (audio as unknown).currentTime = 500; audio.dispatchEvent( new Event("timeupdate", { bubbles: false, cancelable: false }), ); @@ -495,7 +496,7 @@ describe("plugin mediaPlayer MediaTrack", () => { describe("destroy", () => { it("resets the option `srcObject` to `null` (best practice)", () => { // Arrange - const audio: HTMLAudioElement & { srcObject?: {} | null } = + const audio: HTMLAudioElement & { srcObject?: object | null } = new HTMLAudioElement(); audio.srcObject = {}; const mT = new MediaTrackMock( diff --git a/plugins/mediaPlayer/MediaTrack.ts b/app/plugins/mediaPlayer/MediaTrack.ts similarity index 100% rename from plugins/mediaPlayer/MediaTrack.ts rename to app/plugins/mediaPlayer/MediaTrack.ts diff --git a/plugins/mediaPlayer/Queue.spec.ts b/app/plugins/mediaPlayer/Queue.spec.ts similarity index 99% rename from plugins/mediaPlayer/Queue.spec.ts rename to app/plugins/mediaPlayer/Queue.spec.ts index ad2c7c1a..27171f7b 100644 --- a/plugins/mediaPlayer/Queue.spec.ts +++ b/app/plugins/mediaPlayer/Queue.spec.ts @@ -5,6 +5,7 @@ import { flushPromises } from "@vue/test-utils"; import type { TrackModel } from "@bcc-code/bmm-sdk-fetch"; import Queue from "./Queue"; import EnrichedTrackModel from "./EnrichedTrackModel"; +import { ref } from "vue"; const now = new Date(); function track(id: number) { diff --git a/plugins/mediaPlayer/Queue.ts b/app/plugins/mediaPlayer/Queue.ts similarity index 100% rename from plugins/mediaPlayer/Queue.ts rename to app/plugins/mediaPlayer/Queue.ts diff --git a/plugins/mediaPlayer/mediaPlayer.spec.ts b/app/plugins/mediaPlayer/mediaPlayer.spec.ts similarity index 98% rename from plugins/mediaPlayer/mediaPlayer.spec.ts rename to app/plugins/mediaPlayer/mediaPlayer.spec.ts index 09d6f7ab..f1d7689e 100644 --- a/plugins/mediaPlayer/mediaPlayer.spec.ts +++ b/app/plugins/mediaPlayer/mediaPlayer.spec.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ // @vitest-environment happy-dom import { describe, it, expect, vi, afterEach } from "vitest"; @@ -15,6 +16,7 @@ import { RepeatStatus, } from "./mediaPlayer"; import EnrichedTrackModel from "./EnrichedTrackModel"; +import { ref } from "vue"; vi.mock("./Queue", async (importOriginal) => { const { default: Mod } = (await importOriginal()) as any; @@ -1022,7 +1024,7 @@ describe("plugin mediaPlayer MediaTrack", () => { mediaPlayer.value.setQueue([track(1)]); await flushPromises(); - const isLoadingValues: Boolean[] = []; + const isLoadingValues: boolean[] = []; watch( () => mediaPlayer.value.isLoading, (v) => { @@ -1047,7 +1049,7 @@ describe("plugin mediaPlayer MediaTrack", () => { MockedMediaTrack.mock.results[0]!.value.obj!.loading = true; await flushPromises(); - const isLoadingValues: Boolean[] = []; + const isLoadingValues: boolean[] = []; watch( () => mediaPlayer.value.isLoading, (v) => { @@ -1071,7 +1073,7 @@ describe("plugin mediaPlayer MediaTrack", () => { // Arrange const mediaPlayer = ref(setupPlayer()); - const hasNextValues: Boolean[] = []; + const hasNextValues: boolean[] = []; watch( () => mediaPlayer.value.hasNext, (v) => { @@ -1094,7 +1096,7 @@ describe("plugin mediaPlayer MediaTrack", () => { mediaPlayer.value.setQueue([track(1), track(2), track(3)]); await flushPromises(); - const hasNextValues: Boolean[] = []; + const hasNextValues: boolean[] = []; watch( () => mediaPlayer.value.hasNext, (v) => { @@ -1117,7 +1119,7 @@ describe("plugin mediaPlayer MediaTrack", () => { mediaPlayer.value.setQueue([track(1), track(2)]); await flushPromises(); - const hasNextValues: Boolean[] = []; + const hasNextValues: boolean[] = []; watch( () => mediaPlayer.value.hasNext, (v) => { @@ -1140,7 +1142,7 @@ describe("plugin mediaPlayer MediaTrack", () => { mediaPlayer.value.setQueue([track(1), track(2)], 1); await flushPromises(); - const hasNextValues: Boolean[] = []; + const hasNextValues: boolean[] = []; watch( () => mediaPlayer.value.hasNext, (v) => { @@ -1163,7 +1165,7 @@ describe("plugin mediaPlayer MediaTrack", () => { mediaPlayer.value.setQueue([track(1), track(2)]); await flushPromises(); - const hasNextValues: Boolean[] = []; + const hasNextValues: boolean[] = []; watch( () => mediaPlayer.value.hasNext, (v) => { @@ -1187,7 +1189,7 @@ describe("plugin mediaPlayer MediaTrack", () => { mediaPlayer.value.repeatStatus = RepeatStatus.RepeatQueue; await flushPromises(); - const hasNextValues: Boolean[] = []; + const hasNextValues: boolean[] = []; watch( () => mediaPlayer.value.hasNext, (v) => { @@ -1211,7 +1213,7 @@ describe("plugin mediaPlayer MediaTrack", () => { mediaPlayer.value.repeatStatus = RepeatStatus.RepeatQueue; await flushPromises(); - const hasNextValues: Boolean[] = []; + const hasNextValues: boolean[] = []; watch( () => mediaPlayer.value.hasNext, (v) => { @@ -1251,7 +1253,7 @@ describe("plugin mediaPlayer MediaTrack", () => { mediaPlayer.value.setQueue([track(1), track(2)], 1); await flushPromises(); - const hasPreviousValues: Boolean[] = []; + const hasPreviousValues: boolean[] = []; watch( () => mediaPlayer.value.hasPrevious, (v) => { @@ -1271,7 +1273,7 @@ describe("plugin mediaPlayer MediaTrack", () => { // Arrange const mediaPlayer = ref(setupPlayer()); - const hasPreviousValues: Boolean[] = []; + const hasPreviousValues: boolean[] = []; watch( () => mediaPlayer.value.hasPrevious, (v) => { diff --git a/plugins/mediaPlayer/mediaPlayer.ts b/app/plugins/mediaPlayer/mediaPlayer.ts similarity index 100% rename from plugins/mediaPlayer/mediaPlayer.ts rename to app/plugins/mediaPlayer/mediaPlayer.ts diff --git a/plugins/piniaPersistedState.ts b/app/plugins/piniaPersistedState.ts similarity index 100% rename from plugins/piniaPersistedState.ts rename to app/plugins/piniaPersistedState.ts diff --git a/plugins/updateRouterOnRouteChangeEvent.client.ts b/app/plugins/updateRouterOnRouteChangeEvent.client.ts similarity index 100% rename from plugins/updateRouterOnRouteChangeEvent.client.ts rename to app/plugins/updateRouterOnRouteChangeEvent.client.ts diff --git a/spa-loading-template.html b/app/spa-loading-template.html similarity index 100% rename from spa-loading-template.html rename to app/spa-loading-template.html diff --git a/stores/contentLanguage.ts b/app/stores/contentLanguage.ts similarity index 100% rename from stores/contentLanguage.ts rename to app/stores/contentLanguage.ts diff --git a/stores/profile.ts b/app/stores/profile.ts similarity index 100% rename from stores/profile.ts rename to app/stores/profile.ts diff --git a/stores/toolbarTitle.ts b/app/stores/toolbarTitle.ts similarity index 100% rename from stores/toolbarTitle.ts rename to app/stores/toolbarTitle.ts diff --git a/utils/DropdownMenuItem.ts b/app/utils/DropdownMenuItem.ts similarity index 100% rename from utils/DropdownMenuItem.ts rename to app/utils/DropdownMenuItem.ts diff --git a/utils/authorizedUrl.ts b/app/utils/authorizedUrl.ts similarity index 100% rename from utils/authorizedUrl.ts rename to app/utils/authorizedUrl.ts diff --git a/utils/availableContentLanguages.ts b/app/utils/availableContentLanguages.ts similarity index 100% rename from utils/availableContentLanguages.ts rename to app/utils/availableContentLanguages.ts diff --git a/utils/config.ts b/app/utils/config.ts similarity index 100% rename from utils/config.ts rename to app/utils/config.ts diff --git a/utils/dateToUtc.ts b/app/utils/dateToUtc.ts similarity index 100% rename from utils/dateToUtc.ts rename to app/utils/dateToUtc.ts diff --git a/utils/formatDate.ts b/app/utils/formatDate.ts similarity index 100% rename from utils/formatDate.ts rename to app/utils/formatDate.ts diff --git a/utils/formatTime.ts b/app/utils/formatTime.ts similarity index 100% rename from utils/formatTime.ts rename to app/utils/formatTime.ts diff --git a/utils/getLocalizedLanguageName.ts b/app/utils/getLocalizedLanguageName.ts similarity index 100% rename from utils/getLocalizedLanguageName.ts rename to app/utils/getLocalizedLanguageName.ts diff --git a/utils/getLocalizedList.ts b/app/utils/getLocalizedList.ts similarity index 100% rename from utils/getLocalizedList.ts rename to app/utils/getLocalizedList.ts diff --git a/utils/lyricsEditor.ts b/app/utils/lyricsEditor.ts similarity index 100% rename from utils/lyricsEditor.ts rename to app/utils/lyricsEditor.ts diff --git a/utils/parseLink.ts b/app/utils/parseLink.ts similarity index 100% rename from utils/parseLink.ts rename to app/utils/parseLink.ts diff --git a/utils/reactiveApi.ts b/app/utils/reactiveApi.ts similarity index 100% rename from utils/reactiveApi.ts rename to app/utils/reactiveApi.ts diff --git a/utils/roles.ts b/app/utils/roles.ts similarity index 100% rename from utils/roles.ts rename to app/utils/roles.ts diff --git a/utils/scroll.ts b/app/utils/scroll.ts similarity index 100% rename from utils/scroll.ts rename to app/utils/scroll.ts diff --git a/utils/setTitle.ts b/app/utils/setTitle.ts similarity index 100% rename from utils/setTitle.ts rename to app/utils/setTitle.ts diff --git a/utils/setTitleOfDocumentList.ts b/app/utils/setTitleOfDocumentList.ts similarity index 100% rename from utils/setTitleOfDocumentList.ts rename to app/utils/setTitleOfDocumentList.ts diff --git a/utils/showErrorToUser.ts b/app/utils/showErrorToUser.ts similarity index 100% rename from utils/showErrorToUser.ts rename to app/utils/showErrorToUser.ts diff --git a/utils/songbookName.ts b/app/utils/songbookName.ts similarity index 100% rename from utils/songbookName.ts rename to app/utils/songbookName.ts diff --git a/utils/songtreasures.ts b/app/utils/songtreasures.ts similarity index 100% rename from utils/songtreasures.ts rename to app/utils/songtreasures.ts diff --git a/utils/stringCasing.ts b/app/utils/stringCasing.ts similarity index 100% rename from utils/stringCasing.ts rename to app/utils/stringCasing.ts diff --git a/utils/trackFields.ts b/app/utils/trackFields.ts similarity index 100% rename from utils/trackFields.ts rename to app/utils/trackFields.ts diff --git a/utils/tracks.ts b/app/utils/tracks.ts similarity index 100% rename from utils/tracks.ts rename to app/utils/tracks.ts diff --git a/utils/tracksToTrackReferences.ts b/app/utils/tracksToTrackReferences.ts similarity index 100% rename from utils/tracksToTrackReferences.ts rename to app/utils/tracksToTrackReferences.ts diff --git a/utils/transcription.ts b/app/utils/transcription.ts similarity index 100% rename from utils/transcription.ts rename to app/utils/transcription.ts diff --git a/utils/uniqueItems.ts b/app/utils/uniqueItems.ts similarity index 100% rename from utils/uniqueItems.ts rename to app/utils/uniqueItems.ts diff --git a/utils/uuid.ts b/app/utils/uuid.ts similarity index 100% rename from utils/uuid.ts rename to app/utils/uuid.ts diff --git a/utils/weekDay.ts b/app/utils/weekDay.ts similarity index 100% rename from utils/weekDay.ts rename to app/utils/weekDay.ts diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist index 38c887b2..46f43d4a 100644 --- a/build/entitlements.mac.plist +++ b/build/entitlements.mac.plist @@ -1,12 +1,12 @@ - - com.apple.security.cs.allow-jit - - com.apple.security.cs.allow-unsigned-executable-memory - - com.apple.security.cs.allow-dyld-environment-variables - - + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-dyld-environment-variables + + diff --git a/build/entitlements.mas.plist b/build/entitlements.mas.plist index eb2489f8..51d633a1 100644 --- a/build/entitlements.mas.plist +++ b/build/entitlements.mas.plist @@ -1,14 +1,14 @@ - -com.apple.security.app-sandbox - -com.apple.security.application-groups -KJ6LCYQ3A8.org.brunstad.bmm -com.apple.security.files.user-selected.read-only - -com.apple.security.files.user-selected.read-write - - + + com.apple.security.app-sandbox + + com.apple.security.application-groups + KJ6LCYQ3A8.org.brunstad.bmm + com.apple.security.files.user-selected.read-only + + com.apple.security.files.user-selected.read-write + + \ No newline at end of file diff --git a/declarations.d.ts b/declarations.d.ts index 510f7a36..0253ceb1 100644 --- a/declarations.d.ts +++ b/declarations.d.ts @@ -4,6 +4,6 @@ import type { } from "vue"; declare module "@vue/runtime-core" { - interface ComponentCustomProperties extends _ComponentCustomProperties {} - interface ComponentCustomOptions extends _ComponentCustomOptions {} + type ComponentCustomProperties = _ComponentCustomProperties; + type ComponentCustomOptions = _ComponentCustomOptions; } diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..934c3a1d --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,6 @@ +// @ts-check +import withNuxt from './.nuxt/eslint.config.mjs' + +export default withNuxt( + // Your custom configs here +) diff --git a/i18n.config.ts b/i18n.config.ts index 20d6dd6f..76b54d98 100644 --- a/i18n.config.ts +++ b/i18n.config.ts @@ -19,7 +19,7 @@ import ru from "./locales/ru.json"; import it from "./locales/it.json"; import pl from "./locales/pl.json"; -function cleanupEmptyProperties(obj: any, fallback: any): any { +function cleanupEmptyProperties(obj, fallback) { Object.keys(obj).forEach((key) => { if (typeof obj[key] === "object") { obj[key] = cleanupEmptyProperties(obj[key], fallback[key]); diff --git a/modules/figma2tailwind/convertToTailwind.ts b/modules/figma2tailwind/convertToTailwind.ts index 161a33ce..b17a0f49 100644 --- a/modules/figma2tailwind/convertToTailwind.ts +++ b/modules/figma2tailwind/convertToTailwind.ts @@ -15,7 +15,7 @@ const comment = `/** async function writeTailwindColors(tailwindColors: Record) { await fs.writeFile( - "./assets/design-tokens/tailwind-colors.generated.ts", + "app/assets/design-tokens/tailwind-colors.generated.ts", `${comment}\n\nexport default ${JSON.stringify(tailwindColors, null, 2)}`, "utf8", ); @@ -25,7 +25,7 @@ async function writeTailwindTypography( tailwindTypography: Record, ) { await fs.writeFile( - "./assets/design-tokens/tailwind-typography.generated.ts", + "app/assets/design-tokens/tailwind-typography.generated.ts", `${comment}\n\nexport default ${JSON.stringify(tailwindTypography, null, 2)}`, "utf8", ); @@ -33,7 +33,7 @@ async function writeTailwindTypography( async function writeColorsCss(content: string) { await fs.writeFile( - "./assets/design-tokens/colors.generated.css", + "app/assets/design-tokens/colors.generated.css", `${comment}\n\n${content}`, "utf8", ); @@ -79,7 +79,7 @@ async function writeColors(figmaInput) { async function getFigmaInput() { const content = await fs.readFile( - "./assets/design-tokens/tokens.json", + "app/assets/design-tokens/tokens.json", "utf-8", ); return JSON.parse(content); diff --git a/modules/icons/module.ts b/modules/icons/module.ts index 9d62b315..23d8d919 100644 --- a/modules/icons/module.ts +++ b/modules/icons/module.ts @@ -1,5 +1,4 @@ // This component is a copy of the nuxt-icon component from nuxt-icons (https://nuxt.com/modules/icons) -/* eslint import/no-extraneous-dependencies: ["error", {"devDependencies": true}] */ import { defineNuxtModule, createResolver, addComponent } from "@nuxt/kit"; import { CreateTypedIcons } from "./generator"; @@ -18,7 +17,7 @@ export default defineNuxtModule({ name: "nuxt-icons", configKey: "nuxtIcons", compatibility: { - nuxt: "^3.0.0", + nuxt: "^4.3.1", }, }, defaults: { diff --git a/modules/icons/runtime/components/nuxt-icon.vue b/modules/icons/runtime/components/nuxt-icon.vue index bd95681d..cf8bf760 100644 --- a/modules/icons/runtime/components/nuxt-icon.vue +++ b/modules/icons/runtime/components/nuxt-icon.vue @@ -9,10 +9,11 @@ const props = withDefaults( {}, ); +// eslint-disable-next-line @typescript-eslint/no-explicit-any const icon = ref>(""); async function getIcon() { - const iconsImport = import.meta.glob("assets/icons/**/**.svg", { + const iconsImport = import.meta.glob("assets/icons/**.svg", { query: "?raw", import: "default", eager: false, @@ -24,7 +25,6 @@ async function getIcon() { } getIcon().catch((e) => { - // eslint-disable-next-line no-console console.warn( `[nuxt-icons] Failed. Does icon '${props.name}' exist in 'assets/icons'? Error was:`, e, @@ -35,7 +35,7 @@ watchEffect(getIcon);