diff --git a/npm/vue/package.json b/npm/vue/package.json index bfa825abf902..406aa9d8c0e0 100644 --- a/npm/vue/package.json +++ b/npm/vue/package.json @@ -17,7 +17,7 @@ "devDependencies": { "@cypress/mount-utils": "0.0.0-development", "@vitejs/plugin-vue": "5.0.4", - "@vue/compiler-sfc": "3.2.47", + "@vue/compiler-sfc": "3.5.13", "@vue/test-utils": "2.4.6", "axios": "0.21.2", "cypress": "0.0.0-development", @@ -26,7 +26,7 @@ "tailwindcss": "1.1.4", "typescript": "~5.4.5", "vite": "5.4.18", - "vue": "3.2.47", + "vue": "3.5.13", "vue-i18n": "9.13.1", "vue-router": "^4.0.0", "vue-tsc": "^2.0.19", @@ -35,7 +35,7 @@ "peerDependencies": { "@cypress/webpack-dev-server": "*", "cypress": ">=7.0.0", - "vue": ">=3.0.0" + "vue": ">=3.5.13" }, "files": [ "dist/**/*", diff --git a/package.json b/package.json index 0e68a5ed1f74..513dd75e8400 100644 --- a/package.json +++ b/package.json @@ -280,7 +280,7 @@ "browserify-sign": "4.2.2", "devtools-protocol": "0.0.1413303", "sharp": "0.29.3", - "vue-template-compiler": "2.6.12" + "vue-template-compiler": "2.7.16" }, "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/packages/app/package.json b/packages/app/package.json index 4fba47c523c1..181dd6867bec 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -88,7 +88,7 @@ "vite-plugin-pages": "0.32.1", "vite-plugin-vue-layouts": "0.11.0", "vite-svg-loader": "5.1.0", - "vue": "3.2.47", + "vue": "3.5.13", "vue-demi": "0.11.2", "vue-i18n": "9.13.1", "vue-router": "4", diff --git a/packages/app/src/debug/DebugRunNavigationRow.vue b/packages/app/src/debug/DebugRunNavigationRow.vue index f5efed254b03..04258c8ba8f5 100644 --- a/packages/app/src/debug/DebugRunNavigationRow.vue +++ b/packages/app/src/debug/DebugRunNavigationRow.vue @@ -5,7 +5,7 @@ > @@ -12,6 +12,8 @@ import DebugEmptyView from './DebugEmptyView.vue' import { useI18n } from '@cy/i18n' import { IconTechnologyCommandLineError } from '@cypress-design/vue-icon' +import type { FunctionalComponent, SVGAttributes } from 'vue' +import { h } from 'vue' const { t } = useI18n() @@ -19,4 +21,7 @@ const utm = { utm_campaign: 'No Runs Found', } +const IconWrapper: FunctionalComponent = (props) => { + return h(IconTechnologyCommandLineError, { ...props }) +} diff --git a/packages/app/src/debug/empty/DebugEmptyStates.cy.tsx b/packages/app/src/debug/empty/DebugEmptyStates.cy.tsx index 22ee6e78beeb..c4871292161a 100644 --- a/packages/app/src/debug/empty/DebugEmptyStates.cy.tsx +++ b/packages/app/src/debug/empty/DebugEmptyStates.cy.tsx @@ -1,3 +1,4 @@ +import type { VNode } from 'vue' import DebugNotLoggedIn from './DebugNotLoggedIn.vue' import DebugNoProject from './DebugNoProject.vue' import DebugNoRuns from './DebugNoRuns.vue' @@ -8,7 +9,7 @@ import { useUserProjectStatusStore } from '@packages/frontend-shared/src/store/u import { Promo_PromoSeenDocument, _PromoFragmentDoc } from '../../generated/graphql-test' import { DEBUG_PROMO_CAMPAIGNS, DEBUG_TAB_MEDIUM } from '../utils/constants' -function mountWithGql (component: JSX.Element) { +function mountWithGql (component: VNode) { const recordEvent = cy.stub().as('recordEvent') cy.stubMutationResolver(Promo_PromoSeenDocument, (defineResult, args) => { diff --git a/packages/app/src/debug/empty/DebugError.vue b/packages/app/src/debug/empty/DebugError.vue index 52635ec97c06..3ff4be5e7bc6 100644 --- a/packages/app/src/debug/empty/DebugError.vue +++ b/packages/app/src/debug/empty/DebugError.vue @@ -2,7 +2,7 @@ @@ -10,7 +10,9 @@ import DebugEmptyView from './DebugEmptyView.vue' import { useI18n } from '@cy/i18n' import { IconTechnologyCommandLineError } from '@cypress-design/vue-icon' +import type { FunctionalComponent, SVGAttributes } from 'vue' const { t } = useI18n() +const icon = IconTechnologyCommandLineError as unknown as FunctionalComponent diff --git a/packages/app/src/navigation/SidebarNavigation.vue b/packages/app/src/navigation/SidebarNavigation.vue index af882f6fae94..435e19c947fe 100644 --- a/packages/app/src/navigation/SidebarNavigation.vue +++ b/packages/app/src/navigation/SidebarNavigation.vue @@ -91,7 +91,7 @@ diff --git a/packages/app/src/runs/RunsLayout.vue b/packages/app/src/runs/RunsLayout.vue index f944d4419690..173286d52b43 100644 --- a/packages/app/src/runs/RunsLayout.vue +++ b/packages/app/src/runs/RunsLayout.vue @@ -64,7 +64,7 @@ variant="outline-indigo" size="32" class="self-start" - @click="openLatest" + @click="handleOpenLatest" > {{ t('runs.layout.viewCloudRuns') }} @@ -110,6 +110,10 @@ const props = defineProps<{ const openLatest = useExternalLink(props.latestRunUrl) +const handleOpenLatest = () => { + openLatest() +} + const Dot: FunctionalComponent = () => { return h('span', { ariaHidden: 'true', class: 'px-[8px] text-gray-300' }, '•') } diff --git a/packages/app/src/settings/device/NotificationSettings.vue b/packages/app/src/settings/device/NotificationSettings.vue index e0c9a2877a36..7706290cf21d 100644 --- a/packages/app/src/settings/device/NotificationSettings.vue +++ b/packages/app/src/settings/device/NotificationSettings.vue @@ -46,7 +46,7 @@ :disabled="!desktopNotificationsEnabled" @update="(value) => updatePref(id, value)" /> - {{ gql.localSettings }} + {{ props.gql.localSettings }}
diff --git a/packages/app/src/specs/SpecsList.vue b/packages/app/src/specs/SpecsList.vue index 704d836c9ee4..91bdd8d61940 100644 --- a/packages/app/src/specs/SpecsList.vue +++ b/packages/app/src/specs/SpecsList.vue @@ -232,49 +232,7 @@ const { openLoginConnectModal } = useUserProjectStatusStore() const route = useRoute() const { t } = useI18n() const testingType = useTestingType() - -const isOnline = useOnline() -const isOffline = ref(false) - -watch(isOnline, (newIsOnlineValue) => isOffline.value = !newIsOnlineValue, { immediate: true }) - -const tableGridColumns = 'grid-cols-[1fr,135px,130px] md:grid-cols-[1fr,135px,130px,130px] lg:grid-cols-[1fr,160px,160px,180px]' - -const projectConnectionStatus = computed(() => { - if (!props.gql.cloudViewer) return 'LOGGED_OUT' - - if (!props.gql.currentProject?.cloudProject?.__typename) return 'NOT_CONNECTED' - - if (props.gql.currentProject?.cloudProject?.__typename === 'CloudProjectNotFound') return 'NOT_FOUND' - - if (props.gql.currentProject?.cloudProject?.__typename === 'CloudProjectUnauthorized') { - if (props.gql.currentProject?.cloudProject?.hasRequestedAccess) { - return 'ACCESS_REQUESTED' - } - - return 'UNAUTHORIZED' - } - - return 'CONNECTED' -}) - -const cloudProjectType = computed(() => props.gql.currentProject?.cloudProject?.__typename) - -const hasRequestedAccess = computed(() => { - return projectConnectionStatus.value === 'ACCESS_REQUESTED' -}) - -const isGitAvailable = computed(() => { - return !(props.gql.currentProject?.specs.some((s) => s.gitInfo?.statusType === 'noGitInfo') ?? false) -}) - -const hasCloudErrors = computed(() => { - return props.gql.currentProject?.specs.some((s) => s.cloudSpec?.fetchingStatus === 'ERRORED') ?? false -}) - -const shouldShowFetchError = ref(false) - -watch(hasCloudErrors, (wasErrorFound) => shouldShowFetchError.value = wasErrorFound, { immediate: true }) +const runAllSpecsStore = useRunAllSpecsStore() gql` subscription SpecsList_GitInfoUpdated { @@ -351,6 +309,49 @@ const emit = defineEmits<{ (e: 'showCreateSpecModal'): void }>() +const isOnline = useOnline() +const isOffline = ref(false) + +watch(isOnline, (newIsOnlineValue) => isOffline.value = !newIsOnlineValue, { immediate: true }) + +const tableGridColumns = 'grid-cols-[1fr,135px,130px] md:grid-cols-[1fr,135px,130px,130px] lg:grid-cols-[1fr,160px,160px,180px]' + +const projectConnectionStatus = computed(() => { + if (!props.gql.cloudViewer) return 'LOGGED_OUT' + + if (!props.gql.currentProject?.cloudProject?.__typename) return 'NOT_CONNECTED' + + if (props.gql.currentProject?.cloudProject?.__typename === 'CloudProjectNotFound') return 'NOT_FOUND' + + if (props.gql.currentProject?.cloudProject?.__typename === 'CloudProjectUnauthorized') { + if (props.gql.currentProject?.cloudProject?.hasRequestedAccess) { + return 'ACCESS_REQUESTED' + } + + return 'UNAUTHORIZED' + } + + return 'CONNECTED' +}) + +const cloudProjectType = computed(() => props.gql.currentProject?.cloudProject?.__typename) + +const hasRequestedAccess = computed(() => { + return projectConnectionStatus.value === 'ACCESS_REQUESTED' +}) + +const isGitAvailable = computed(() => { + return !(props.gql.currentProject?.specs.some((s) => s.gitInfo?.statusType === 'noGitInfo') ?? false) +}) + +const hasCloudErrors = computed(() => { + return props.gql.currentProject?.specs.some((s) => s.cloudSpec?.fetchingStatus === 'ERRORED') ?? false +}) + +const shouldShowFetchError = ref(false) + +watch(hasCloudErrors, (wasErrorFound) => shouldShowFetchError.value = wasErrorFound, { immediate: true }) + const showSpecPatternModal = ref(false) const isSpecNotFound = ref(!!route.params?.unrunnable) @@ -442,8 +443,6 @@ const { refetchFailedCloudData } = useCloudSpecData( props.gql.currentProject?.specs as SpecsListFragment[] || [], ) -const runAllSpecsStore = useRunAllSpecsStore() - watch(collapsible, () => { runAllSpecsStore.setRunAllSpecsData(collapsible.value.tree) }, { immediate: true }) diff --git a/packages/app/src/specs/banners/TrackedBanner.vue b/packages/app/src/specs/banners/TrackedBanner.vue index 62daf6e3ead4..254b29a85d32 100644 --- a/packages/app/src/specs/banners/TrackedBanner.vue +++ b/packages/app/src/specs/banners/TrackedBanner.vue @@ -25,7 +25,7 @@ type EventData = { } type AlertComponentProps = InstanceType['$props'] -interface TrackedBannerComponentProps extends AlertComponentProps { +interface TrackedBannerComponentProps extends /* @vue-ignore */ AlertComponentProps { bannerId: string hasBannerBeenShown: boolean eventData: EventData | undefined diff --git a/packages/app/src/specs/switcher/TestingTypeSwitcher.vue b/packages/app/src/specs/switcher/TestingTypeSwitcher.vue index 48bf4be1e029..044f2c4f0330 100644 --- a/packages/app/src/specs/switcher/TestingTypeSwitcher.vue +++ b/packages/app/src/specs/switcher/TestingTypeSwitcher.vue @@ -49,6 +49,7 @@ const tabs = computed(() => { label: shouldUseLongText.value ? t('specPage.e2eSpecsHeader') : t('specPage.e2eSpecsHeaderShort'), iconAfter: props.isE2eConfigured === false ? StyledQuestionMarkIcon : undefined, active: props.viewedTestingType === 'e2e', + 'aria-controls': 'e2e-specs-panel', }, { id: 'component', @@ -56,6 +57,7 @@ const tabs = computed(() => { label: shouldUseLongText.value ? t('specPage.componentSpecsHeader') : t('specPage.componentSpecsHeaderShort'), iconAfter: props.isCtConfigured === false ? StyledQuestionMarkIcon : undefined, active: props.viewedTestingType === 'component', + 'aria-controls': 'component-specs-panel', }, ] }) diff --git a/packages/app/src/studio/StudioPanel.vue b/packages/app/src/studio/StudioPanel.vue index f028fbdb538d..b61a76dd4716 100644 --- a/packages/app/src/studio/StudioPanel.vue +++ b/packages/app/src/studio/StudioPanel.vue @@ -15,6 +15,7 @@ import { init, loadRemote } from '@module-federation/runtime' import type { StudioAppDefaultShape, StudioPanelShape } from './studio-app-types' import LoadingStudioPanel from './LoadingStudioPanel.vue' import type { EventManager } from '../runner/event-manager' +import type { JSX } from 'vue/jsx-runtime' // Mirrors the ReactDOM.Root type since incorporating those types // messes up vue typing elsewhere diff --git a/packages/app/src/studio/studio-app-types.ts b/packages/app/src/studio/studio-app-types.ts index 9f050b260d23..312f9c3d6a02 100644 --- a/packages/app/src/studio/studio-app-types.ts +++ b/packages/app/src/studio/studio-app-types.ts @@ -1,3 +1,5 @@ +import type { JSX } from 'vue/jsx-runtime' + export interface StudioPanelProps { canAccessStudioAI: boolean onStudioPanelClose?: () => void diff --git a/packages/frontend-shared/cypress/support/mock-graphql/mountFragment.ts b/packages/frontend-shared/cypress/support/mock-graphql/mountFragment.ts index 77f3a56d62cc..ae6e2a8ebcdd 100644 --- a/packages/frontend-shared/cypress/support/mock-graphql/mountFragment.ts +++ b/packages/frontend-shared/cypress/support/mock-graphql/mountFragment.ts @@ -12,7 +12,7 @@ import type { FragmentDefinitionNode } from 'graphql' import { print } from 'graphql' import { SubscriptionHook, testUrqlClient } from './clientTestUrqlClient' import type { MutationResolverCallback as MutationResolver } from './clientTestUrqlClient' -import type { Component } from 'vue' +import type { Component, VNode } from 'vue' import { computed, watch, defineComponent, h, toRaw } from 'vue' import { each } from 'lodash' // tslint:disable-next-line: no-implicit-dependencies - unsure how to handle these tsconfig compiler paths @@ -228,7 +228,7 @@ type MountFragmentConfig> = { /** * Render is passed the result of the "frag" and mounts the component under test */ - render: (frag: Exclude, undefined>) => JSX.Element + render: (frag: Exclude, undefined>) => VNode expectError?: boolean } & CyMountOptions @@ -239,7 +239,7 @@ type MountFragmentListConfig> = { count?: number variableTypes?: Record, string> variables?: VariablesOf - render: (frag: Exclude, undefined>[]) => JSX.Element + render: (frag: Exclude, undefined>[]) => VNode onResult?: (result: ResultOf, ctx: ClientTestContext) => ResultOf | void expectError?: boolean } & CyMountOptions diff --git a/packages/frontend-shared/package.json b/packages/frontend-shared/package.json index 863a50d6b265..144ecac74077 100644 --- a/packages/frontend-shared/package.json +++ b/packages/frontend-shared/package.json @@ -57,9 +57,9 @@ "@urql/vue": "0.6.2", "@vitejs/plugin-vue": "5.0.4", "@vitejs/plugin-vue-jsx": "3.1.0", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-sfc": "3.2.47", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", "@vue/test-utils": "2.4.6", "@vueuse/core": "7.7.1", "autoprefixer": "^10.4.20", @@ -101,7 +101,7 @@ "unplugin-vue-components": "^0.27.0", "vite": "^5.4.18", "vite-svg-loader": "5.1.0", - "vue": "3.2.47", + "vue": "3.5.13", "vue-eslint-parser": "7.11.0", "vue-i18n": "9.13.1", "vue-router": "4", diff --git a/packages/frontend-shared/src/components/Card.vue b/packages/frontend-shared/src/components/Card.vue index 5f31c9350626..83b0ef28aaa9 100644 --- a/packages/frontend-shared/src/components/Card.vue +++ b/packages/frontend-shared/src/components/Card.vue @@ -29,9 +29,7 @@
@@ -73,6 +71,8 @@ const props = withDefaults(defineProps<{ badgeText: '', }) +const hasHoverIcon = computed(() => props.hoverIcon !== undefined) + const classMap = { indigo: 'icon-dark-indigo-400 icon-light-indigo-100 icon-light-secondary-jade-200 icon-dark-secondary-jade-400', jade: 'icon-dark-jade-400 icon-light-jade-100', diff --git a/packages/frontend-shared/src/components/Select.cy.tsx b/packages/frontend-shared/src/components/Select.cy.tsx index e8ed8cdb2aa1..7d3a63e8dc71 100644 --- a/packages/frontend-shared/src/components/Select.cy.tsx +++ b/packages/frontend-shared/src/components/Select.cy.tsx @@ -170,7 +170,7 @@ describe('