diff --git a/packages/web-app-app-store/package.json b/packages/web-app-app-store/package.json index 740072453d..74a40a8734 100644 --- a/packages/web-app-app-store/package.json +++ b/packages/web-app-app-store/package.json @@ -18,7 +18,7 @@ "pinia": "3.0.3", "vue-concurrency": "5.0.3", "vue-router": "4.5.1", - "zod": "3.25.75", + "zod": "4.0.5", "vue3-gettext": "2.4.0" } } diff --git a/packages/web-app-app-store/tests/unit/components/AppAuthors.spec.ts b/packages/web-app-app-store/tests/unit/components/AppAuthors.spec.ts index eb2b95f2ed..86fe4f1eb2 100644 --- a/packages/web-app-app-store/tests/unit/components/AppAuthors.spec.ts +++ b/packages/web-app-app-store/tests/unit/components/AppAuthors.spec.ts @@ -15,6 +15,7 @@ const author3: AppAuthor = { url: 'wololo' } const author4: AppAuthor = { + name: 'Trololo', url: 'trololo' } const authors = [author1, author2, author3, author4] diff --git a/packages/web-app-app-store/tests/unit/components/AppImageGallery.spec.ts b/packages/web-app-app-store/tests/unit/components/AppImageGallery.spec.ts index cefea2e7df..981932c44c 100644 --- a/packages/web-app-app-store/tests/unit/components/AppImageGallery.spec.ts +++ b/packages/web-app-app-store/tests/unit/components/AppImageGallery.spec.ts @@ -8,6 +8,7 @@ const coverImageWithUrl: AppImage = { caption: 'Cover image' } const coverImageWithoutUrl: AppImage = { + url: '', caption: 'Trololo' } const screenshot1: AppImage = { diff --git a/packages/web-app-app-store/tests/unit/components/AppResources.spec.ts b/packages/web-app-app-store/tests/unit/components/AppResources.spec.ts index 267f5664d5..555b2c0961 100644 --- a/packages/web-app-app-store/tests/unit/components/AppResources.spec.ts +++ b/packages/web-app-app-store/tests/unit/components/AppResources.spec.ts @@ -13,10 +13,12 @@ const resource2: AppResource = { label: 'Wololo' } const resource3: AppResource = { + label: '', url: 'https://some.url', icon: 'file' } const resource4: AppResource = { + url: '', label: 'Wololo' } const resources = [resource1, resource2, resource3, resource4] diff --git a/packages/web-app-app-store/tests/unit/components/AppVersions.spec.ts b/packages/web-app-app-store/tests/unit/components/AppVersions.spec.ts index 052e63c863..eee1fd9666 100644 --- a/packages/web-app-app-store/tests/unit/components/AppVersions.spec.ts +++ b/packages/web-app-app-store/tests/unit/components/AppVersions.spec.ts @@ -22,6 +22,7 @@ const version4: AppVersion = { version: '1.2.0' } const version5: AppVersion = { + version: '', url: 'https://wololo.com/download-1.3.0.zip', minOpenCloud: '6.5.0' } diff --git a/packages/web-app-external/package.json b/packages/web-app-external/package.json index 481f5d090e..4af9708ef8 100644 --- a/packages/web-app-external/package.json +++ b/packages/web-app-external/package.json @@ -17,6 +17,6 @@ "vue-concurrency": "5.0.3", "vue3-gettext": "2.4.0", "vue-router": "4.5.1", - "zod": "3.25.75" + "zod": "4.0.5" } } diff --git a/packages/web-app-ocm/package.json b/packages/web-app-ocm/package.json index 56cdf8e66b..c5b2ef089f 100644 --- a/packages/web-app-ocm/package.json +++ b/packages/web-app-ocm/package.json @@ -14,6 +14,6 @@ "vue-concurrency": "5.0.3", "uuid": "11.1.0", "vue-router": "4.5.1", - "zod": "3.25.75" + "zod": "4.0.5" } } diff --git a/packages/web-client/package.json b/packages/web-client/package.json index 2013e8f73b..2ce4254c01 100644 --- a/packages/web-client/package.json +++ b/packages/web-client/package.json @@ -90,7 +90,7 @@ "uuid": "^11.0.0", "webdav": "^5.7.1", "xml-js": "^1.6.11", - "zod": "^3.23.8" + "zod": "^4.0.0" }, "devDependencies": { "@types/luxon": "3.6.2", diff --git a/packages/web-pkg/package.json b/packages/web-pkg/package.json index a30188892e..50cde0676f 100644 --- a/packages/web-pkg/package.json +++ b/packages/web-pkg/package.json @@ -72,7 +72,7 @@ "vue-concurrency": "^5.0.1", "vue-router": "^4.2.5", "vue3-gettext": "^2.4.0", - "zod": "^3.23.8" + "zod": "^4.0.0" }, "devDependencies": { "@opencloud-eu/web-test-helpers": "workspace:^", diff --git a/packages/web-pkg/src/composables/piniaStores/config/types.ts b/packages/web-pkg/src/composables/piniaStores/config/types.ts index 9503e11c94..44a7b3769e 100644 --- a/packages/web-pkg/src/composables/piniaStores/config/types.ts +++ b/packages/web-pkg/src/composables/piniaStores/config/types.ts @@ -33,7 +33,7 @@ const OpenIdConnectConfigSchema = z export type OpenIdConnectConfig = z.infer -const SentryConfigSchema = z.record(z.any()) +const SentryConfigSchema = z.record(z.any(), z.any()) export type SentryConfig = z.infer @@ -131,7 +131,7 @@ export type OptionsConfig = z.infer const ExternalApp = z.object({ id: z.string(), path: z.string(), - config: z.record(z.unknown()).optional() + config: z.record(z.string(), z.unknown()).optional() }) export const RawConfigSchema = z.object({ diff --git a/packages/web-pkg/src/composables/piniaStores/theme.ts b/packages/web-pkg/src/composables/piniaStores/theme.ts index 4ab0a28579..f3aedfd12c 100644 --- a/packages/web-pkg/src/composables/piniaStores/theme.ts +++ b/packages/web-pkg/src/composables/piniaStores/theme.ts @@ -30,13 +30,13 @@ const CommonSection = z.object({ }) const DesignTokens = z.object({ - breakpoints: z.record(z.string()).optional(), - roles: z.record(z.string()).optional(), - colorPalette: z.record(z.string()).optional(), + breakpoints: z.record(z.string(), z.string()).optional(), + roles: z.record(z.string(), z.string()).optional(), + colorPalette: z.record(z.string(), z.string()).optional(), fontFamily: z.string().optional(), - fontSizes: z.record(z.string()).optional(), - sizes: z.record(z.string()).optional(), - spacing: z.record(z.string()).optional() + fontSizes: z.record(z.string(), z.string()).optional(), + sizes: z.record(z.string(), z.string()).optional(), + spacing: z.record(z.string(), z.string()).optional() }) const WebDefaults = CommonSection.extend({ @@ -77,7 +77,9 @@ export const useThemeStore = defineStore('theme', () => { const availableThemes = ref([]) const initializeThemes = (themeConfig: ThemeConfigType) => { - const baseTheme = merge(themeConfig.common, themeConfig.clients.web.defaults) + const commonThemeConfig = themeConfig.common as WebThemeType + const webThemeConfig = themeConfig.clients.web.defaults as WebThemeType + const baseTheme = merge(commonThemeConfig, webThemeConfig) availableThemes.value = themeConfig.clients.web.themes.map((theme) => { return merge(baseTheme, theme) }) diff --git a/packages/web-pkg/tests/unit/components/Modals/FilePickerModal.spec.ts b/packages/web-pkg/tests/unit/components/Modals/FilePickerModal.spec.ts index 8469a154de..2ed8e0174a 100644 --- a/packages/web-pkg/tests/unit/components/Modals/FilePickerModal.spec.ts +++ b/packages/web-pkg/tests/unit/components/Modals/FilePickerModal.spec.ts @@ -2,7 +2,7 @@ import FilePickerModal from '../../../../src/components/Modals/FilePickerModal.v import { defaultComponentMocks, defaultPlugins, shallowMount } from '@opencloud-eu/web-test-helpers' import { mock } from 'vitest-mock-extended' import { Resource, SpaceResource } from '@opencloud-eu/web-client' -import { Modal, useModals } from '../../../../src/composables/piniaStores' +import { Modal, useModals, WebThemeType } from '../../../../src/composables/piniaStores' import { RouteLocation } from 'vue-router' window.open = vi.fn() @@ -75,7 +75,7 @@ function getWrapper() { ...defaultPlugins({ piniaOptions: { spacesState: { spaces: [mock({ id: '1' })] }, - themeState: { currentTheme: { name: 'OpenCloud' } } + themeState: { currentTheme: { name: 'OpenCloud' } as WebThemeType } } }) ], diff --git a/packages/web-pkg/tests/unit/components/Modals/SaveAsModal.spec.ts b/packages/web-pkg/tests/unit/components/Modals/SaveAsModal.spec.ts index e55c1fb8fa..3e75d99244 100644 --- a/packages/web-pkg/tests/unit/components/Modals/SaveAsModal.spec.ts +++ b/packages/web-pkg/tests/unit/components/Modals/SaveAsModal.spec.ts @@ -8,7 +8,12 @@ import { import { mock, mockDeep } from 'vitest-mock-extended' import { Resource, SpaceResource } from '@opencloud-eu/web-client' import { ListFilesResult } from '@opencloud-eu/web-client/webdav' -import { Modal, useMessages, useModals } from '../../../../src/composables/piniaStores' +import { + Modal, + useMessages, + useModals, + WebThemeType +} from '../../../../src/composables/piniaStores' import { ClientService } from '../../../../src' window.open = vi.fn() @@ -114,7 +119,7 @@ function getWrapper() { ...defaultPlugins({ piniaOptions: { spacesState: { spaces: [mock({ id: '1' })] }, - themeState: { currentTheme: { name: 'OpenCloud' } } + themeState: { currentTheme: { name: 'OpenCloud' } as WebThemeType } } }) ], diff --git a/packages/web-pkg/tests/unit/composables/piniaStores/config.spec.ts b/packages/web-pkg/tests/unit/composables/piniaStores/config.spec.ts index 404b0e0da6..40605c008e 100644 --- a/packages/web-pkg/tests/unit/composables/piniaStores/config.spec.ts +++ b/packages/web-pkg/tests/unit/composables/piniaStores/config.spec.ts @@ -30,7 +30,7 @@ describe('useConfigStore', () => { it('loads config for external apps', () => { getWrapper({ setup: (instance) => { - const externalApp = { id: '1', config: { foo: 'bar' } } + const externalApp = { id: '1', config: { foo: 'bar' }, path: '' } const data = { server: 'https://foo.bar', theme: undefined, diff --git a/packages/web-runtime/package.json b/packages/web-runtime/package.json index 910128329a..57bb5ecd11 100644 --- a/packages/web-runtime/package.json +++ b/packages/web-runtime/package.json @@ -43,7 +43,7 @@ "vue3-gettext": "2.4.0", "webdav": "5.8.0", "xml-js": "^1.6.11", - "zod": "3.25.75" + "zod": "4.0.5" }, "devDependencies": { "@opencloud-eu/web-test-helpers": "workspace:*" diff --git a/packages/web-runtime/tests/unit/components/Topbar/UserMenu.spec.ts b/packages/web-runtime/tests/unit/components/Topbar/UserMenu.spec.ts index 4f0d482644..01ffc4100a 100644 --- a/packages/web-runtime/tests/unit/components/Topbar/UserMenu.spec.ts +++ b/packages/web-runtime/tests/unit/components/Topbar/UserMenu.spec.ts @@ -9,6 +9,7 @@ import { import { mock } from 'vitest-mock-extended' import { SpaceResource } from '@opencloud-eu/web-client' import { Quota } from '@opencloud-eu/web-client/graph/generated' +import { WebThemeType } from '@opencloud-eu/web-pkg' const totalQuota = 1000 const basicQuota = 300 @@ -150,7 +151,7 @@ const getMountedWrapper = ( imprint: areThemeUrlsSet ? 'https://imprint.url.theme' : '', accessibility: areThemeUrlsSet ? 'https://accessibility.url.theme' : '' } - } + } as WebThemeType }, userState: { user: noUser diff --git a/packages/web-runtime/tests/unit/container/bootstrap.spec.ts b/packages/web-runtime/tests/unit/container/bootstrap.spec.ts index 229247adef..1bebeee66a 100644 --- a/packages/web-runtime/tests/unit/container/bootstrap.spec.ts +++ b/packages/web-runtime/tests/unit/container/bootstrap.spec.ts @@ -38,7 +38,10 @@ describe('initialize applications', () => { const configStore = useConfigStore() configStore.apps = ['internalFishy', 'internalValid'] - configStore.externalApps = [{ path: 'externalFishy' }, { path: 'externalValid' }] + configStore.externalApps = [ + { id: '1', path: 'externalFishy' }, + { id: '2', path: 'externalValid' } + ] const applications = await initializeApplications({ app: createApp(defineComponent({})), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 331c110399..5f015d3c64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -464,8 +464,8 @@ importers: specifier: 2.4.0 version: 2.4.0(patch_hash=6f231bbef273efbc788b5657c47fc744b52bc838f972357a764c144fde6065f2)(@vue/compiler-sfc@3.5.17)(vue@3.5.17(typescript@5.8.3)) zod: - specifier: 3.25.75 - version: 3.25.75 + specifier: 4.0.5 + version: 4.0.5 devDependencies: '@opencloud-eu/web-test-helpers': specifier: workspace:* @@ -520,8 +520,8 @@ importers: specifier: 2.4.0 version: 2.4.0(patch_hash=6f231bbef273efbc788b5657c47fc744b52bc838f972357a764c144fde6065f2)(@vue/compiler-sfc@3.5.17)(vue@3.5.17(typescript@5.8.3)) zod: - specifier: 3.25.75 - version: 3.25.75 + specifier: 4.0.5 + version: 4.0.5 devDependencies: '@opencloud-eu/web-test-helpers': specifier: workspace:* @@ -624,8 +624,8 @@ importers: specifier: 4.5.1 version: 4.5.1(vue@3.5.17(typescript@5.8.3)) zod: - specifier: 3.25.75 - version: 3.25.75 + specifier: 4.0.5 + version: 4.0.5 packages/web-app-pdf-viewer: dependencies: @@ -767,8 +767,8 @@ importers: specifier: ^1.6.11 version: 1.6.11 zod: - specifier: ^3.23.8 - version: 3.25.75 + specifier: ^4.0.0 + version: 4.0.5 devDependencies: '@types/luxon': specifier: 3.6.2 @@ -907,8 +907,8 @@ importers: specifier: ^2.4.0 version: 2.4.0(patch_hash=6f231bbef273efbc788b5657c47fc744b52bc838f972357a764c144fde6065f2)(@vue/compiler-sfc@3.5.17)(vue@3.5.17(typescript@5.8.3)) zod: - specifier: ^3.23.8 - version: 3.25.75 + specifier: ^4.0.0 + version: 4.0.5 devDependencies: '@opencloud-eu/web-test-helpers': specifier: workspace:^ @@ -1050,8 +1050,8 @@ importers: specifier: ^1.6.11 version: 1.6.11 zod: - specifier: 3.25.75 - version: 3.25.75 + specifier: 4.0.5 + version: 4.0.5 devDependencies: '@opencloud-eu/web-test-helpers': specifier: workspace:* @@ -6698,8 +6698,8 @@ packages: zhead@2.2.4: resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} - zod@3.25.75: - resolution: {integrity: sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==} + zod@4.0.5: + resolution: {integrity: sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -12854,6 +12854,6 @@ snapshots: zhead@2.2.4: {} - zod@3.25.75: {} + zod@4.0.5: {} zwitch@2.0.4: {}