Merge pull request #25 from IT4Change/eslint-typescript-strict

fix(other): eslint typescript strict
This commit is contained in:
Ulf Gebhardt 2023-12-12 08:52:20 +01:00 committed by GitHub
commit 7a9dc5f07a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 55 additions and 22 deletions

5
.eslintignore Normal file
View File

@ -0,0 +1,5 @@
node_modules/
build/
coverage/
.storybook/
.vuepress/

View File

@ -130,6 +130,28 @@
"promise/no-multiple-resolved": "error"
},
"overrides": [
{
"files": ["*.ts", "*.tsx"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"tsconfigRootDir": ".",
"project": ["./tsconfig.json", "**/tsconfig.json"],
"ecmaVersion": "latest",
"parser": "@typescript-eslint/parser",
"sourceType": "module"
},
"plugins": ["@typescript-eslint"],
"extends": [
"plugin:@typescript-eslint/recommended",
"plugin:@typescript-eslint/recommended-requiring-type-checking",
"plugin:@typescript-eslint/strict"
],
"rules": {
// allow explicitly defined dangling promises
"@typescript-eslint/no-floating-promises": ["error", { "ignoreVoid": true }],
"no-void": ["error", { "allowAsStatement": true }]
}
},
{
"files": ["!*.json"],
"plugins": ["prettier"],

View File

@ -45,7 +45,7 @@
"storybook:build": "storybook build -o build/storybook",
"storybook:test": "test-storybook",
"test:lint": "npm run test:lint:eslint && npm run test:lint:remark && npm run test:lint:style && npm run test:lint:locales",
"test:lint:eslint": "eslint --ext .vue,.ts,.tsx,.js,.jsx,.json,.yml,.yaml --max-warnings 0 --ignore-path .gitignore .",
"test:lint:eslint": "eslint --ext .vue,.ts,.tsx,.js,.jsx,.json,.yml,.yaml --max-warnings 0 .",
"test:lint:locales": "scripts/locales/locales.sh src/locales",
"test:lint:remark": "remark . --quiet --frail",
"test:lint:style": "stylelint --max-warnings 0 --ignore-path .gitignore \"**/*.{css,scss,vue,vuex}\"",

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
}