strict typings

This commit is contained in:
Ulf Gebhardt 2023-12-12 00:58:13 +01:00
parent b56fa78ce6
commit 89db9f8f4f
Signed by: ulfgebhardt
GPG Key ID: DA6B843E748679C9
12 changed files with 27 additions and 21 deletions

View File

@ -2,13 +2,13 @@ import { createApp } from './app'
import type { PageContext, VikePageContext } from '#types/PageContext'
let app: ReturnType<typeof createApp>
async function render(pageContext: VikePageContext & PageContext) {
if (!app) {
app = createApp(pageContext).app
app.mount('#app')
let instance: ReturnType<typeof createApp>
/* async */ function render(pageContext: VikePageContext & PageContext) {
if (!instance) {
instance = createApp(pageContext)
instance.app.mount('#app')
} else {
app.changePage(pageContext)
instance.app.changePage(pageContext)
}
}

View File

@ -49,7 +49,9 @@ function createApp(pageContext: VikePageContext & PageContext, isClient = true)
objectAssign(app, {
changePage: (pageContext: VikePageContext & PageContext) => {
Object.assign(pageContextReactive, pageContext)
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
rootComponent.Page = markRaw(pageContext.Page)
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
rootComponent.pageProps = markRaw(pageContext.pageProps || {})
},
})

View File

@ -2,7 +2,7 @@
import '@mdi/font/css/materialdesignicons.css'
// eslint-disable-next-line import/no-unassigned-import
import 'vuetify/lib/styles/main.sass'
import { useI18n } from 'vue-i18n'
import { I18n, useI18n } from 'vue-i18n'
import { createVuetify } from 'vuetify'
// eslint-disable-next-line import/no-namespace
import * as components from 'vuetify/lib/components/index.mjs'
@ -11,7 +11,7 @@ import * as directives from 'vuetify/lib/directives/index.mjs'
import { createVueI18nAdapter } from 'vuetify/locale/adapters/vue-i18n'
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export default (i18n: any) =>
export default (i18n: I18n<any, NonNullable<unknown>, NonNullable<unknown>, string, false>) =>
createVuetify({
locale: {
adapter: createVueI18nAdapter({ i18n, useI18n }),

View File

@ -19,7 +19,7 @@ import { root } from './root.js'
const isProduction = process.env.NODE_ENV === 'production'
startServer()
void startServer()
async function startServer() {
const app = express()
@ -52,6 +52,7 @@ async function startServer() {
// Vike middleware. It should always be our last middleware (because it's a
// catch-all middleware superseding any middleware placed after it).
// eslint-disable-next-line @typescript-eslint/no-misused-promises
app.get('*', async (req, res, next) => {
const pageContextInit = {
urlOriginal: req.originalUrl,

View File

@ -6,7 +6,7 @@ import ClientOnly from './ClientOnly.vue'
describe('ClientOnly', () => {
const wrapper = mount(ClientOnly)
it('renders content if mounted', async () => {
it('renders content if mounted', () => {
expect(wrapper.isVisible()).toBeTruthy()
})
})

View File

@ -1,7 +1,8 @@
const META = {
DEFAULT_TITLE: import.meta.env.PUBLIC_ENV__META__DEFAULT_TITLE ?? 'IT4C',
DEFAULT_TITLE: (import.meta.env.PUBLIC_ENV__META__DEFAULT_TITLE as string) ?? 'IT4C',
DEFAULT_DESCRIPTION:
import.meta.env.PUBLIC_ENV__META__DEFAULT_DESCRIPTION ?? 'IT4C Frontend Boilerplate',
(import.meta.env.PUBLIC_ENV__META__DEFAULT_DESCRIPTION as string) ??
'IT4C Frontend Boilerplate',
}
export { META }

View File

@ -1,10 +1,11 @@
import { mount } from '@vue/test-utils'
import { VueWrapper, mount } from '@vue/test-utils'
import { describe, it, expect, beforeEach } from 'vitest'
import { ComponentPublicInstance } from 'vue'
import ErrorPage from './_error.page.vue'
describe('ErrorPage', () => {
let wrapper: typeof ErrorPage
let wrapper: VueWrapper<unknown, ComponentPublicInstance<unknown, Omit<unknown, never>>>
const Wrapper = () => {
return mount(ErrorPage)
}

View File

@ -2,7 +2,7 @@ import type { PageContextBuiltInServer } from 'vike/types'
export { onBeforeRender }
async function onBeforeRender(pageContext: PageContextBuiltInServer) {
/* async */ function onBeforeRender(pageContext: PageContextBuiltInServer) {
return {
pageContext: {
pageProps: pageContext.routeParams,

View File

@ -1,5 +1,5 @@
import { setActivePinia, createPinia } from 'pinia'
import { describe, it, expect } from 'vitest'
import { describe, it, expect, beforeEach } from 'vitest'
import { useCounterStore } from './counter'

View File

@ -13,6 +13,7 @@ const meta = {
render: (args: any) => ({
components: { ExampleHeader },
setup() {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
return { args }
},
template: '<example-header :user="args.user" />',

View File

@ -26,8 +26,8 @@ type Story = StoryObj<typeof meta>
export const LoggedIn: Story = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
play: async ({ canvasElement }: any) => {
const canvas = within(canvasElement)
const loginButton = await canvas.getByRole('button', {
const canvas = within(canvasElement as HTMLElement)
const loginButton = canvas.getByRole('button', {
name: /Log in/i,
})
await userEvent.click(loginButton)

6
types/vue.d.ts vendored
View File

@ -1,5 +1,5 @@
declare module '*.vue' {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const Component: any
export default Component
import Vue from 'vue'
export default Vue
}