Compare commits
	
		
			39 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 40817389a1 | ||
|  | 79da8986db | ||
|  | 1c4260a937 | ||
|  | afc680cb29 | ||
|  | 7c769fee49 | ||
|  | 6189a9225c | ||
|  | 46a39e1506 | ||
|  | 1c37b247c5 | ||
|  | 2a1e59f43b | ||
|  | 94b5fdddad | ||
|  | 65aec3f101 | ||
|  | b53ffae83e | ||
|  | 20c01380c9 | ||
|  | 6b3f6e620b | ||
|  | 693eba91a8 | ||
|  | b820b0fd92 | ||
|  | f8014b745e | ||
|  | 95e28e4a4a | ||
|  | 54b234f4ef | ||
|  | ff6a1fad6a | ||
|  | e13613fd5f | ||
|  | e111029e0a | ||
|  | 254f8194df | ||
|  | 4119f52750 | ||
|  | 4b51ef2eba | ||
|  | 588494cc01 | ||
|  | 3c1207657f | ||
|  | da59484756 | ||
|  | 501ff74200 | ||
|  | adaf70b651 | ||
|  | 3ed0230512 | ||
|  | ac3f63086d | ||
|  | f7a5571259 | ||
|  | a452fe4a81 | ||
|  | 61ef0a0570 | ||
|  | b25d6e98bc | ||
|  | ae4e44e588 | ||
|  | ae904df91e | ||
|  | e9f0988b4d | 
							
								
								
									
										17
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								README.md
									
									
									
									
									
								
							| @@ -4,10 +4,11 @@ | ||||
|  | ||||
| - Single quotes, no semi | ||||
| - Auto fix for formatting (aimed to be used standalone without Prettier) | ||||
| - TypeScript, Vue, React out-of-box | ||||
| - Designed to work with TypeScript, Vue out-of-box | ||||
| - Lint also for json, yaml, markdown | ||||
| - Sorted imports, dangling commas for cleaner commit diff | ||||
| - Sorted imports, dangling commas | ||||
| - Reasonable defaults, best practices, only one-line of config | ||||
| - **Style principle**: Minimal for reading, stable for diff | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| @@ -42,22 +43,30 @@ For example: | ||||
|  | ||||
| ### Config VS Code auto fix | ||||
|  | ||||
| Create `.vscode/settings.json` | ||||
| Install [VS Code ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) and create `.vscode/settings.json` | ||||
|  | ||||
| ```json | ||||
| { | ||||
|   "prettier.enable": false, | ||||
|   "editor.formatOnSave": false, | ||||
|   "editor.codeActionsOnSave": { | ||||
|     "source.fixAll.eslint": true | ||||
|   } | ||||
| } | ||||
| ``` | ||||
|  | ||||
| ### TypeScript Aware Rules | ||||
|  | ||||
| Type aware rules are enabled when a `tsconfig.eslint.json` is found in the project root. Refer to [this file](https://github.com/antfu/eslint-config/blob/main/packages/typescript/index.js#L17). | ||||
|  | ||||
| ## Extended Reading | ||||
|  | ||||
| Learn more about the context - [Why I don't use Prettier](https://antfu.me/posts/why-not-prettier). | ||||
|  | ||||
| ## Check Also | ||||
|  | ||||
| - [antfu/dotfiles](https://github.com/antfu/dotfiles) - My dotfiles | ||||
| - [antfu/vscode-settings](https://github.com/antfu/vscode-settings) - My VS Code settings | ||||
| - [antfu/eslint-config](https://github.com/antfu/eslint-config) - My ESLint config | ||||
| - [antfu/ts-starter](https://github.com/antfu/ts-starter) - My starter template for TypeScript library | ||||
| - [antfu/vitesse](https://github.com/antfu/vitesse) - My starter template for Vue & Vite app | ||||
|  | ||||
|   | ||||
| @@ -1,6 +0,0 @@ | ||||
| // @ts-expect-error requires a comment | ||||
| export const a: string = 1 | ||||
|  | ||||
| export interface Foo { | ||||
|   a: string | ||||
| } | ||||
							
								
								
									
										9
									
								
								fixtures/vitesse/.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								fixtures/vitesse/.editorconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| root = true | ||||
|  | ||||
| [*] | ||||
| charset = utf-8 | ||||
| indent_style = space | ||||
| indent_size = 2 | ||||
| end_of_line = lf | ||||
| insert_final_newline = true | ||||
| trim_trailing_whitespace = true | ||||
							
								
								
									
										9
									
								
								fixtures/vitesse/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								fixtures/vitesse/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| .DS_Store | ||||
| .vite-ssg-dist | ||||
| .vite-ssg-temp | ||||
| *.local | ||||
| dist | ||||
| dist-ssr | ||||
| node_modules | ||||
| .idea/ | ||||
| *.log | ||||
							
								
								
									
										21
									
								
								fixtures/vitesse/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								fixtures/vitesse/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| MIT License | ||||
|  | ||||
| Copyright (c) 2020-2021 Anthony Fu | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
							
								
								
									
										1
									
								
								fixtures/vitesse/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								fixtures/vitesse/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| This is a fixture cloned from https://github.com/antfu/vitesse. It's only for lint checking and does not run. | ||||
							
								
								
									
										10
									
								
								fixtures/vitesse/cypress.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								fixtures/vitesse/cypress.config.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| import { defineConfig } from 'cypress' | ||||
|  | ||||
| export default defineConfig({ | ||||
|   e2e: { | ||||
|     baseUrl: 'http://localhost:3333', | ||||
|     chromeWebSecurity: false, | ||||
|     specPattern: 'cypress/e2e/**/*.spec.*', | ||||
|     supportFile: false, | ||||
|   }, | ||||
| }) | ||||
							
								
								
									
										36
									
								
								fixtures/vitesse/cypress/e2e/basic.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								fixtures/vitesse/cypress/e2e/basic.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| context('Basic', () => { | ||||
|   beforeEach(() => { | ||||
|     cy.visit('/') | ||||
|   }) | ||||
|  | ||||
|   it('basic nav', () => { | ||||
|     cy.url() | ||||
|       .should('eq', 'http://localhost:3333/') | ||||
|  | ||||
|     cy.contains('[Home Layout]') | ||||
|       .should('exist') | ||||
|  | ||||
|     cy.get('#input') | ||||
|       .type('Vitesse{Enter}') | ||||
|       .url() | ||||
|       .should('eq', 'http://localhost:3333/hi/Vitesse') | ||||
|  | ||||
|     cy.contains('[Default Layout]') | ||||
|       .should('exist') | ||||
|  | ||||
|     cy.get('[btn]') | ||||
|       .click() | ||||
|       .url() | ||||
|       .should('eq', 'http://localhost:3333/') | ||||
|   }) | ||||
|  | ||||
|   it('markdown', () => { | ||||
|     cy.get('[title="About"]') | ||||
|       .click() | ||||
|       .url() | ||||
|       .should('eq', 'http://localhost:3333/about') | ||||
|  | ||||
|     cy.get('.shiki') | ||||
|       .should('exist') | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										22
									
								
								fixtures/vitesse/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								fixtures/vitesse/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|   <meta charset="UTF-8"> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|   <link rel="apple-touch-icon" href="/pwa-192x192.png"> | ||||
|   <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#00aba9"> | ||||
|   <meta name="msapplication-TileColor" content="#00aba9"> | ||||
|   <script> | ||||
|     (function () { | ||||
|       const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches | ||||
|       const setting = localStorage.getItem('vueuse-color-scheme') || 'auto' | ||||
|       if (setting === 'dark' || (prefersDark && setting !== 'light')) | ||||
|         document.documentElement.classList.toggle('dark', true) | ||||
|     })() | ||||
|   </script> | ||||
| </head> | ||||
| <body class="font-sans"> | ||||
|   <div id="app"></div> | ||||
|   <script type="module" src="/src/main.ts"></script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										62
									
								
								fixtures/vitesse/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								fixtures/vitesse/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| { | ||||
|   "type": "module", | ||||
|   "private": true, | ||||
|   "packageManager": "pnpm@7.8.0", | ||||
|   "scripts": { | ||||
|     "build": "vite-ssg build", | ||||
|     "dev": "vite --port 3333 --open", | ||||
|     "lint": "eslint .", | ||||
|     "preview": "vite preview", | ||||
|     "preview-https": "serve dist", | ||||
|     "test": "vitest", | ||||
|     "test:e2e": "cypress open", | ||||
|     "test:unit": "vitest", | ||||
|     "typecheck": "vue-tsc --noEmit", | ||||
|     "up": "taze major -I" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@unocss/reset": "^0.47.0", | ||||
|     "@vueuse/core": "^9.6.0", | ||||
|     "@vueuse/head": "^1.0.18", | ||||
|     "nprogress": "^0.2.0", | ||||
|     "pinia": "^2.0.27", | ||||
|     "vue": "^3.2.45", | ||||
|     "vue-demi": "^0.13.11", | ||||
|     "vue-i18n": "^9.2.2", | ||||
|     "vue-router": "^4.1.6" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@antfu/eslint-config": "^0.31.0", | ||||
|     "@iconify-json/carbon": "^1.1.11", | ||||
|     "@intlify/vite-plugin-vue-i18n": "^6.0.3", | ||||
|     "@types/markdown-it-link-attributes": "^3.0.1", | ||||
|     "@types/nprogress": "^0.2.0", | ||||
|     "@vitejs/plugin-vue": "^3.2.0", | ||||
|     "@vue/test-utils": "^2.2.4", | ||||
|     "critters": "^0.0.16", | ||||
|     "cross-env": "^7.0.3", | ||||
|     "cypress": "^11.2.0", | ||||
|     "eslint": "^8.28.0", | ||||
|     "eslint-plugin-cypress": "^2.12.1", | ||||
|     "https-localhost": "^4.7.1", | ||||
|     "markdown-it-link-attributes": "^4.0.1", | ||||
|     "markdown-it-shiki": "^0.6.1", | ||||
|     "pnpm": "^7.17.1", | ||||
|     "shiki": "^0.11.1", | ||||
|     "taze": "^0.8.4", | ||||
|     "typescript": "^4.9.3", | ||||
|     "unocss": "^0.47.0", | ||||
|     "unplugin-auto-import": "^0.12.0", | ||||
|     "unplugin-vue-components": "^0.22.11", | ||||
|     "vite": "^3.2.4", | ||||
|     "vite-plugin-inspect": "^0.7.9", | ||||
|     "vite-plugin-pages": "^0.27.1", | ||||
|     "vite-plugin-pwa": "^0.13.3", | ||||
|     "vite-plugin-vue-layouts": "^0.7.0", | ||||
|     "vite-plugin-vue-markdown": "^0.22.1", | ||||
|     "vite-ssg": "^0.22.0", | ||||
|     "vite-ssg-sitemap": "^0.4.3", | ||||
|     "vitest": "^0.25.3", | ||||
|     "vue-tsc": "^1.0.9" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										26
									
								
								fixtures/vitesse/src/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								fixtures/vitesse/src/App.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| <script setup lang="ts"> | ||||
| // https://github.com/vueuse/head | ||||
| // you can use this to manipulate the document head in any components, | ||||
| // they will be rendered correctly in the html results with vite-ssg | ||||
| useHead({ | ||||
|   title: 'Vitesse', | ||||
|   meta: [ | ||||
|     { name: 'description', content: 'Opinionated Vite Starter Template' }, | ||||
|     { | ||||
|       name: 'theme-color', | ||||
|       content: computed(() => isDark.value ? '#00aba9' : '#ffffff'), | ||||
|     }, | ||||
|   ], | ||||
|   link: [ | ||||
|     { | ||||
|       rel: 'icon', | ||||
|       type: 'image/svg+xml', | ||||
|       href: computed(() => preferredDark.value ? '/favicon-dark.svg' : '/favicon.svg'), | ||||
|     }, | ||||
|   ], | ||||
| }) | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <RouterView /> | ||||
| </template> | ||||
							
								
								
									
										546
									
								
								fixtures/vitesse/src/auto-imports.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										546
									
								
								fixtures/vitesse/src/auto-imports.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,546 @@ | ||||
| // Generated by 'unplugin-auto-import' | ||||
| export {} | ||||
| declare global { | ||||
|   const $$: typeof import('vue/macros')['$$'] | ||||
|   const $: typeof import('vue/macros')['$'] | ||||
|   const $computed: typeof import('vue/macros')['$computed'] | ||||
|   const $customRef: typeof import('vue/macros')['$customRef'] | ||||
|   const $ref: typeof import('vue/macros')['$ref'] | ||||
|   const $shallowRef: typeof import('vue/macros')['$shallowRef'] | ||||
|   const $toRef: typeof import('vue/macros')['$toRef'] | ||||
|   const EffectScope: typeof import('vue')['EffectScope'] | ||||
|   const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] | ||||
|   const autoResetRef: typeof import('@vueuse/core')['autoResetRef'] | ||||
|   const computed: typeof import('vue')['computed'] | ||||
|   const computedAsync: typeof import('@vueuse/core')['computedAsync'] | ||||
|   const computedEager: typeof import('@vueuse/core')['computedEager'] | ||||
|   const computedInject: typeof import('@vueuse/core')['computedInject'] | ||||
|   const computedWithControl: typeof import('@vueuse/core')['computedWithControl'] | ||||
|   const controlledComputed: typeof import('@vueuse/core')['controlledComputed'] | ||||
|   const controlledRef: typeof import('@vueuse/core')['controlledRef'] | ||||
|   const createApp: typeof import('vue')['createApp'] | ||||
|   const createEventHook: typeof import('@vueuse/core')['createEventHook'] | ||||
|   const createGlobalState: typeof import('@vueuse/core')['createGlobalState'] | ||||
|   const createInjectionState: typeof import('@vueuse/core')['createInjectionState'] | ||||
|   const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn'] | ||||
|   const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable'] | ||||
|   const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn'] | ||||
|   const customRef: typeof import('vue')['customRef'] | ||||
|   const debouncedRef: typeof import('@vueuse/core')['debouncedRef'] | ||||
|   const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch'] | ||||
|   const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] | ||||
|   const defineComponent: typeof import('vue')['defineComponent'] | ||||
|   const eagerComputed: typeof import('@vueuse/core')['eagerComputed'] | ||||
|   const effectScope: typeof import('vue')['effectScope'] | ||||
|   const extendRef: typeof import('@vueuse/core')['extendRef'] | ||||
|   const getCurrentInstance: typeof import('vue')['getCurrentInstance'] | ||||
|   const getCurrentScope: typeof import('vue')['getCurrentScope'] | ||||
|   const h: typeof import('vue')['h'] | ||||
|   const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] | ||||
|   const inject: typeof import('vue')['inject'] | ||||
|   const isDark: typeof import('./composables/dark')['isDark'] | ||||
|   const isDefined: typeof import('@vueuse/core')['isDefined'] | ||||
|   const isProxy: typeof import('vue')['isProxy'] | ||||
|   const isReactive: typeof import('vue')['isReactive'] | ||||
|   const isReadonly: typeof import('vue')['isReadonly'] | ||||
|   const isRef: typeof import('vue')['isRef'] | ||||
|   const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable'] | ||||
|   const markRaw: typeof import('vue')['markRaw'] | ||||
|   const nextTick: typeof import('vue')['nextTick'] | ||||
|   const onActivated: typeof import('vue')['onActivated'] | ||||
|   const onBeforeMount: typeof import('vue')['onBeforeMount'] | ||||
|   const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] | ||||
|   const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] | ||||
|   const onClickOutside: typeof import('@vueuse/core')['onClickOutside'] | ||||
|   const onDeactivated: typeof import('vue')['onDeactivated'] | ||||
|   const onErrorCaptured: typeof import('vue')['onErrorCaptured'] | ||||
|   const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke'] | ||||
|   const onLongPress: typeof import('@vueuse/core')['onLongPress'] | ||||
|   const onMounted: typeof import('vue')['onMounted'] | ||||
|   const onRenderTracked: typeof import('vue')['onRenderTracked'] | ||||
|   const onRenderTriggered: typeof import('vue')['onRenderTriggered'] | ||||
|   const onScopeDispose: typeof import('vue')['onScopeDispose'] | ||||
|   const onServerPrefetch: typeof import('vue')['onServerPrefetch'] | ||||
|   const onStartTyping: typeof import('@vueuse/core')['onStartTyping'] | ||||
|   const onUnmounted: typeof import('vue')['onUnmounted'] | ||||
|   const onUpdated: typeof import('vue')['onUpdated'] | ||||
|   const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] | ||||
|   const preferredDark: typeof import('./composables/dark')['preferredDark'] | ||||
|   const provide: typeof import('vue')['provide'] | ||||
|   const reactify: typeof import('@vueuse/core')['reactify'] | ||||
|   const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] | ||||
|   const reactive: typeof import('vue')['reactive'] | ||||
|   const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed'] | ||||
|   const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit'] | ||||
|   const reactivePick: typeof import('@vueuse/core')['reactivePick'] | ||||
|   const readonly: typeof import('vue')['readonly'] | ||||
|   const ref: typeof import('vue')['ref'] | ||||
|   const refAutoReset: typeof import('@vueuse/core')['refAutoReset'] | ||||
|   const refDebounced: typeof import('@vueuse/core')['refDebounced'] | ||||
|   const refDefault: typeof import('@vueuse/core')['refDefault'] | ||||
|   const refThrottled: typeof import('@vueuse/core')['refThrottled'] | ||||
|   const refWithControl: typeof import('@vueuse/core')['refWithControl'] | ||||
|   const resolveComponent: typeof import('vue')['resolveComponent'] | ||||
|   const resolveRef: typeof import('@vueuse/core')['resolveRef'] | ||||
|   const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] | ||||
|   const shallowReactive: typeof import('vue')['shallowReactive'] | ||||
|   const shallowReadonly: typeof import('vue')['shallowReadonly'] | ||||
|   const shallowRef: typeof import('vue')['shallowRef'] | ||||
|   const syncRef: typeof import('@vueuse/core')['syncRef'] | ||||
|   const syncRefs: typeof import('@vueuse/core')['syncRefs'] | ||||
|   const templateRef: typeof import('@vueuse/core')['templateRef'] | ||||
|   const throttledRef: typeof import('@vueuse/core')['throttledRef'] | ||||
|   const throttledWatch: typeof import('@vueuse/core')['throttledWatch'] | ||||
|   const toRaw: typeof import('vue')['toRaw'] | ||||
|   const toReactive: typeof import('@vueuse/core')['toReactive'] | ||||
|   const toRef: typeof import('vue')['toRef'] | ||||
|   const toRefs: typeof import('vue')['toRefs'] | ||||
|   const toggleDark: typeof import('./composables/dark')['toggleDark'] | ||||
|   const triggerRef: typeof import('vue')['triggerRef'] | ||||
|   const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount'] | ||||
|   const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount'] | ||||
|   const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted'] | ||||
|   const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose'] | ||||
|   const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted'] | ||||
|   const unref: typeof import('vue')['unref'] | ||||
|   const unrefElement: typeof import('@vueuse/core')['unrefElement'] | ||||
|   const until: typeof import('@vueuse/core')['until'] | ||||
|   const useActiveElement: typeof import('@vueuse/core')['useActiveElement'] | ||||
|   const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery'] | ||||
|   const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter'] | ||||
|   const useArrayFind: typeof import('@vueuse/core')['useArrayFind'] | ||||
|   const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex'] | ||||
|   const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin'] | ||||
|   const useArrayMap: typeof import('@vueuse/core')['useArrayMap'] | ||||
|   const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce'] | ||||
|   const useArraySome: typeof import('@vueuse/core')['useArraySome'] | ||||
|   const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue'] | ||||
|   const useAsyncState: typeof import('@vueuse/core')['useAsyncState'] | ||||
|   const useAttrs: typeof import('vue')['useAttrs'] | ||||
|   const useBase64: typeof import('@vueuse/core')['useBase64'] | ||||
|   const useBattery: typeof import('@vueuse/core')['useBattery'] | ||||
|   const useBluetooth: typeof import('@vueuse/core')['useBluetooth'] | ||||
|   const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints'] | ||||
|   const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel'] | ||||
|   const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] | ||||
|   const useCached: typeof import('@vueuse/core')['useCached'] | ||||
|   const useClipboard: typeof import('@vueuse/core')['useClipboard'] | ||||
|   const useColorMode: typeof import('@vueuse/core')['useColorMode'] | ||||
|   const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] | ||||
|   const useCounter: typeof import('@vueuse/core')['useCounter'] | ||||
|   const useCssModule: typeof import('vue')['useCssModule'] | ||||
|   const useCssVar: typeof import('@vueuse/core')['useCssVar'] | ||||
|   const useCssVars: typeof import('vue')['useCssVars'] | ||||
|   const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement'] | ||||
|   const useCycleList: typeof import('@vueuse/core')['useCycleList'] | ||||
|   const useDark: typeof import('@vueuse/core')['useDark'] | ||||
|   const useDateFormat: typeof import('@vueuse/core')['useDateFormat'] | ||||
|   const useDebounce: typeof import('@vueuse/core')['useDebounce'] | ||||
|   const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn'] | ||||
|   const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory'] | ||||
|   const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion'] | ||||
|   const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation'] | ||||
|   const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio'] | ||||
|   const useDevicesList: typeof import('@vueuse/core')['useDevicesList'] | ||||
|   const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia'] | ||||
|   const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility'] | ||||
|   const useDraggable: typeof import('@vueuse/core')['useDraggable'] | ||||
|   const useDropZone: typeof import('@vueuse/core')['useDropZone'] | ||||
|   const useElementBounding: typeof import('@vueuse/core')['useElementBounding'] | ||||
|   const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint'] | ||||
|   const useElementHover: typeof import('@vueuse/core')['useElementHover'] | ||||
|   const useElementSize: typeof import('@vueuse/core')['useElementSize'] | ||||
|   const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility'] | ||||
|   const useEventBus: typeof import('@vueuse/core')['useEventBus'] | ||||
|   const useEventListener: typeof import('@vueuse/core')['useEventListener'] | ||||
|   const useEventSource: typeof import('@vueuse/core')['useEventSource'] | ||||
|   const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper'] | ||||
|   const useFavicon: typeof import('@vueuse/core')['useFavicon'] | ||||
|   const useFetch: typeof import('@vueuse/core')['useFetch'] | ||||
|   const useFileDialog: typeof import('@vueuse/core')['useFileDialog'] | ||||
|   const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess'] | ||||
|   const useFocus: typeof import('@vueuse/core')['useFocus'] | ||||
|   const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin'] | ||||
|   const useFps: typeof import('@vueuse/core')['useFps'] | ||||
|   const useFullscreen: typeof import('@vueuse/core')['useFullscreen'] | ||||
|   const useGamepad: typeof import('@vueuse/core')['useGamepad'] | ||||
|   const useGeolocation: typeof import('@vueuse/core')['useGeolocation'] | ||||
|   const useHead: typeof import('@vueuse/head')['useHead'] | ||||
|   const useI18n: typeof import('vue-i18n')['useI18n'] | ||||
|   const useIdle: typeof import('@vueuse/core')['useIdle'] | ||||
|   const useImage: typeof import('@vueuse/core')['useImage'] | ||||
|   const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll'] | ||||
|   const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver'] | ||||
|   const useInterval: typeof import('@vueuse/core')['useInterval'] | ||||
|   const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] | ||||
|   const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier'] | ||||
|   const useLastChanged: typeof import('@vueuse/core')['useLastChanged'] | ||||
|   const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage'] | ||||
|   const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys'] | ||||
|   const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory'] | ||||
|   const useMediaControls: typeof import('@vueuse/core')['useMediaControls'] | ||||
|   const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery'] | ||||
|   const useMemoize: typeof import('@vueuse/core')['useMemoize'] | ||||
|   const useMemory: typeof import('@vueuse/core')['useMemory'] | ||||
|   const useMounted: typeof import('@vueuse/core')['useMounted'] | ||||
|   const useMouse: typeof import('@vueuse/core')['useMouse'] | ||||
|   const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement'] | ||||
|   const useMousePressed: typeof import('@vueuse/core')['useMousePressed'] | ||||
|   const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver'] | ||||
|   const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage'] | ||||
|   const useNetwork: typeof import('@vueuse/core')['useNetwork'] | ||||
|   const useNow: typeof import('@vueuse/core')['useNow'] | ||||
|   const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl'] | ||||
|   const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination'] | ||||
|   const useOnline: typeof import('@vueuse/core')['useOnline'] | ||||
|   const usePageLeave: typeof import('@vueuse/core')['usePageLeave'] | ||||
|   const useParallax: typeof import('@vueuse/core')['useParallax'] | ||||
|   const usePermission: typeof import('@vueuse/core')['usePermission'] | ||||
|   const usePointer: typeof import('@vueuse/core')['usePointer'] | ||||
|   const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe'] | ||||
|   const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme'] | ||||
|   const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark'] | ||||
|   const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages'] | ||||
|   const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion'] | ||||
|   const useRafFn: typeof import('@vueuse/core')['useRafFn'] | ||||
|   const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] | ||||
|   const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] | ||||
|   const useRoute: typeof import('vue-router')['useRoute'] | ||||
|   const useRouter: typeof import('vue-router')['useRouter'] | ||||
|   const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation'] | ||||
|   const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea'] | ||||
|   const useScriptTag: typeof import('@vueuse/core')['useScriptTag'] | ||||
|   const useScroll: typeof import('@vueuse/core')['useScroll'] | ||||
|   const useScrollLock: typeof import('@vueuse/core')['useScrollLock'] | ||||
|   const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage'] | ||||
|   const useShare: typeof import('@vueuse/core')['useShare'] | ||||
|   const useSlots: typeof import('vue')['useSlots'] | ||||
|   const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition'] | ||||
|   const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis'] | ||||
|   const useStepper: typeof import('@vueuse/core')['useStepper'] | ||||
|   const useStorage: typeof import('@vueuse/core')['useStorage'] | ||||
|   const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync'] | ||||
|   const useStyleTag: typeof import('@vueuse/core')['useStyleTag'] | ||||
|   const useSupported: typeof import('@vueuse/core')['useSupported'] | ||||
|   const useSwipe: typeof import('@vueuse/core')['useSwipe'] | ||||
|   const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList'] | ||||
|   const useTextDirection: typeof import('@vueuse/core')['useTextDirection'] | ||||
|   const useTextSelection: typeof import('@vueuse/core')['useTextSelection'] | ||||
|   const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize'] | ||||
|   const useThrottle: typeof import('@vueuse/core')['useThrottle'] | ||||
|   const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn'] | ||||
|   const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory'] | ||||
|   const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo'] | ||||
|   const useTimeout: typeof import('@vueuse/core')['useTimeout'] | ||||
|   const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn'] | ||||
|   const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll'] | ||||
|   const useTimestamp: typeof import('@vueuse/core')['useTimestamp'] | ||||
|   const useTitle: typeof import('@vueuse/core')['useTitle'] | ||||
|   const useToNumber: typeof import('@vueuse/core')['useToNumber'] | ||||
|   const useToString: typeof import('@vueuse/core')['useToString'] | ||||
|   const useToggle: typeof import('@vueuse/core')['useToggle'] | ||||
|   const useTransition: typeof import('@vueuse/core')['useTransition'] | ||||
|   const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams'] | ||||
|   const useUserMedia: typeof import('@vueuse/core')['useUserMedia'] | ||||
|   const useUserStore: typeof import('./store/user')['useUserStore'] | ||||
|   const useVModel: typeof import('@vueuse/core')['useVModel'] | ||||
|   const useVModels: typeof import('@vueuse/core')['useVModels'] | ||||
|   const useVibrate: typeof import('@vueuse/core')['useVibrate'] | ||||
|   const useVirtualList: typeof import('@vueuse/core')['useVirtualList'] | ||||
|   const useWakeLock: typeof import('@vueuse/core')['useWakeLock'] | ||||
|   const useWebNotification: typeof import('@vueuse/core')['useWebNotification'] | ||||
|   const useWebSocket: typeof import('@vueuse/core')['useWebSocket'] | ||||
|   const useWebWorker: typeof import('@vueuse/core')['useWebWorker'] | ||||
|   const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn'] | ||||
|   const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus'] | ||||
|   const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll'] | ||||
|   const useWindowSize: typeof import('@vueuse/core')['useWindowSize'] | ||||
|   const watch: typeof import('vue')['watch'] | ||||
|   const watchArray: typeof import('@vueuse/core')['watchArray'] | ||||
|   const watchAtMost: typeof import('@vueuse/core')['watchAtMost'] | ||||
|   const watchDebounced: typeof import('@vueuse/core')['watchDebounced'] | ||||
|   const watchEffect: typeof import('vue')['watchEffect'] | ||||
|   const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable'] | ||||
|   const watchOnce: typeof import('@vueuse/core')['watchOnce'] | ||||
|   const watchPausable: typeof import('@vueuse/core')['watchPausable'] | ||||
|   const watchPostEffect: typeof import('vue')['watchPostEffect'] | ||||
|   const watchSyncEffect: typeof import('vue')['watchSyncEffect'] | ||||
|   const watchThrottled: typeof import('@vueuse/core')['watchThrottled'] | ||||
|   const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable'] | ||||
|   const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter'] | ||||
|   const whenever: typeof import('@vueuse/core')['whenever'] | ||||
| } | ||||
| // for vue template auto import | ||||
| import { UnwrapRef } from 'vue' | ||||
| declare module '@vue/runtime-core' { | ||||
|   interface ComponentCustomProperties { | ||||
|     readonly $$: UnwrapRef<typeof import('vue/macros')['$$']> | ||||
|     readonly $: UnwrapRef<typeof import('vue/macros')['$']> | ||||
|     readonly $computed: UnwrapRef<typeof import('vue/macros')['$computed']> | ||||
|     readonly $customRef: UnwrapRef<typeof import('vue/macros')['$customRef']> | ||||
|     readonly $ref: UnwrapRef<typeof import('vue/macros')['$ref']> | ||||
|     readonly $shallowRef: UnwrapRef<typeof import('vue/macros')['$shallowRef']> | ||||
|     readonly $toRef: UnwrapRef<typeof import('vue/macros')['$toRef']> | ||||
|     readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']> | ||||
|     readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']> | ||||
|     readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']> | ||||
|     readonly computed: UnwrapRef<typeof import('vue')['computed']> | ||||
|     readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']> | ||||
|     readonly computedEager: UnwrapRef<typeof import('@vueuse/core')['computedEager']> | ||||
|     readonly computedInject: UnwrapRef<typeof import('@vueuse/core')['computedInject']> | ||||
|     readonly computedWithControl: UnwrapRef<typeof import('@vueuse/core')['computedWithControl']> | ||||
|     readonly controlledComputed: UnwrapRef<typeof import('@vueuse/core')['controlledComputed']> | ||||
|     readonly controlledRef: UnwrapRef<typeof import('@vueuse/core')['controlledRef']> | ||||
|     readonly createApp: UnwrapRef<typeof import('vue')['createApp']> | ||||
|     readonly createEventHook: UnwrapRef<typeof import('@vueuse/core')['createEventHook']> | ||||
|     readonly createGlobalState: UnwrapRef<typeof import('@vueuse/core')['createGlobalState']> | ||||
|     readonly createInjectionState: UnwrapRef<typeof import('@vueuse/core')['createInjectionState']> | ||||
|     readonly createReactiveFn: UnwrapRef<typeof import('@vueuse/core')['createReactiveFn']> | ||||
|     readonly createSharedComposable: UnwrapRef<typeof import('@vueuse/core')['createSharedComposable']> | ||||
|     readonly createUnrefFn: UnwrapRef<typeof import('@vueuse/core')['createUnrefFn']> | ||||
|     readonly customRef: UnwrapRef<typeof import('vue')['customRef']> | ||||
|     readonly debouncedRef: UnwrapRef<typeof import('@vueuse/core')['debouncedRef']> | ||||
|     readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']> | ||||
|     readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']> | ||||
|     readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']> | ||||
|     readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']> | ||||
|     readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']> | ||||
|     readonly extendRef: UnwrapRef<typeof import('@vueuse/core')['extendRef']> | ||||
|     readonly getCurrentInstance: UnwrapRef<typeof import('vue')['getCurrentInstance']> | ||||
|     readonly getCurrentScope: UnwrapRef<typeof import('vue')['getCurrentScope']> | ||||
|     readonly h: UnwrapRef<typeof import('vue')['h']> | ||||
|     readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']> | ||||
|     readonly inject: UnwrapRef<typeof import('vue')['inject']> | ||||
|     readonly isDark: UnwrapRef<typeof import('./composables/dark')['isDark']> | ||||
|     readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']> | ||||
|     readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']> | ||||
|     readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']> | ||||
|     readonly isReadonly: UnwrapRef<typeof import('vue')['isReadonly']> | ||||
|     readonly isRef: UnwrapRef<typeof import('vue')['isRef']> | ||||
|     readonly makeDestructurable: UnwrapRef<typeof import('@vueuse/core')['makeDestructurable']> | ||||
|     readonly markRaw: UnwrapRef<typeof import('vue')['markRaw']> | ||||
|     readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']> | ||||
|     readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']> | ||||
|     readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']> | ||||
|     readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']> | ||||
|     readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']> | ||||
|     readonly onClickOutside: UnwrapRef<typeof import('@vueuse/core')['onClickOutside']> | ||||
|     readonly onDeactivated: UnwrapRef<typeof import('vue')['onDeactivated']> | ||||
|     readonly onErrorCaptured: UnwrapRef<typeof import('vue')['onErrorCaptured']> | ||||
|     readonly onKeyStroke: UnwrapRef<typeof import('@vueuse/core')['onKeyStroke']> | ||||
|     readonly onLongPress: UnwrapRef<typeof import('@vueuse/core')['onLongPress']> | ||||
|     readonly onMounted: UnwrapRef<typeof import('vue')['onMounted']> | ||||
|     readonly onRenderTracked: UnwrapRef<typeof import('vue')['onRenderTracked']> | ||||
|     readonly onRenderTriggered: UnwrapRef<typeof import('vue')['onRenderTriggered']> | ||||
|     readonly onScopeDispose: UnwrapRef<typeof import('vue')['onScopeDispose']> | ||||
|     readonly onServerPrefetch: UnwrapRef<typeof import('vue')['onServerPrefetch']> | ||||
|     readonly onStartTyping: UnwrapRef<typeof import('@vueuse/core')['onStartTyping']> | ||||
|     readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']> | ||||
|     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']> | ||||
|     readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']> | ||||
|     readonly preferredDark: UnwrapRef<typeof import('./composables/dark')['preferredDark']> | ||||
|     readonly provide: UnwrapRef<typeof import('vue')['provide']> | ||||
|     readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']> | ||||
|     readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']> | ||||
|     readonly reactive: UnwrapRef<typeof import('vue')['reactive']> | ||||
|     readonly reactiveComputed: UnwrapRef<typeof import('@vueuse/core')['reactiveComputed']> | ||||
|     readonly reactiveOmit: UnwrapRef<typeof import('@vueuse/core')['reactiveOmit']> | ||||
|     readonly reactivePick: UnwrapRef<typeof import('@vueuse/core')['reactivePick']> | ||||
|     readonly readonly: UnwrapRef<typeof import('vue')['readonly']> | ||||
|     readonly ref: UnwrapRef<typeof import('vue')['ref']> | ||||
|     readonly refAutoReset: UnwrapRef<typeof import('@vueuse/core')['refAutoReset']> | ||||
|     readonly refDebounced: UnwrapRef<typeof import('@vueuse/core')['refDebounced']> | ||||
|     readonly refDefault: UnwrapRef<typeof import('@vueuse/core')['refDefault']> | ||||
|     readonly refThrottled: UnwrapRef<typeof import('@vueuse/core')['refThrottled']> | ||||
|     readonly refWithControl: UnwrapRef<typeof import('@vueuse/core')['refWithControl']> | ||||
|     readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']> | ||||
|     readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']> | ||||
|     readonly resolveUnref: UnwrapRef<typeof import('@vueuse/core')['resolveUnref']> | ||||
|     readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']> | ||||
|     readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']> | ||||
|     readonly shallowRef: UnwrapRef<typeof import('vue')['shallowRef']> | ||||
|     readonly syncRef: UnwrapRef<typeof import('@vueuse/core')['syncRef']> | ||||
|     readonly syncRefs: UnwrapRef<typeof import('@vueuse/core')['syncRefs']> | ||||
|     readonly templateRef: UnwrapRef<typeof import('@vueuse/core')['templateRef']> | ||||
|     readonly throttledRef: UnwrapRef<typeof import('@vueuse/core')['throttledRef']> | ||||
|     readonly throttledWatch: UnwrapRef<typeof import('@vueuse/core')['throttledWatch']> | ||||
|     readonly toRaw: UnwrapRef<typeof import('vue')['toRaw']> | ||||
|     readonly toReactive: UnwrapRef<typeof import('@vueuse/core')['toReactive']> | ||||
|     readonly toRef: UnwrapRef<typeof import('vue')['toRef']> | ||||
|     readonly toRefs: UnwrapRef<typeof import('vue')['toRefs']> | ||||
|     readonly toggleDark: UnwrapRef<typeof import('./composables/dark')['toggleDark']> | ||||
|     readonly triggerRef: UnwrapRef<typeof import('vue')['triggerRef']> | ||||
|     readonly tryOnBeforeMount: UnwrapRef<typeof import('@vueuse/core')['tryOnBeforeMount']> | ||||
|     readonly tryOnBeforeUnmount: UnwrapRef<typeof import('@vueuse/core')['tryOnBeforeUnmount']> | ||||
|     readonly tryOnMounted: UnwrapRef<typeof import('@vueuse/core')['tryOnMounted']> | ||||
|     readonly tryOnScopeDispose: UnwrapRef<typeof import('@vueuse/core')['tryOnScopeDispose']> | ||||
|     readonly tryOnUnmounted: UnwrapRef<typeof import('@vueuse/core')['tryOnUnmounted']> | ||||
|     readonly unref: UnwrapRef<typeof import('vue')['unref']> | ||||
|     readonly unrefElement: UnwrapRef<typeof import('@vueuse/core')['unrefElement']> | ||||
|     readonly until: UnwrapRef<typeof import('@vueuse/core')['until']> | ||||
|     readonly useActiveElement: UnwrapRef<typeof import('@vueuse/core')['useActiveElement']> | ||||
|     readonly useArrayEvery: UnwrapRef<typeof import('@vueuse/core')['useArrayEvery']> | ||||
|     readonly useArrayFilter: UnwrapRef<typeof import('@vueuse/core')['useArrayFilter']> | ||||
|     readonly useArrayFind: UnwrapRef<typeof import('@vueuse/core')['useArrayFind']> | ||||
|     readonly useArrayFindIndex: UnwrapRef<typeof import('@vueuse/core')['useArrayFindIndex']> | ||||
|     readonly useArrayJoin: UnwrapRef<typeof import('@vueuse/core')['useArrayJoin']> | ||||
|     readonly useArrayMap: UnwrapRef<typeof import('@vueuse/core')['useArrayMap']> | ||||
|     readonly useArrayReduce: UnwrapRef<typeof import('@vueuse/core')['useArrayReduce']> | ||||
|     readonly useArraySome: UnwrapRef<typeof import('@vueuse/core')['useArraySome']> | ||||
|     readonly useAsyncQueue: UnwrapRef<typeof import('@vueuse/core')['useAsyncQueue']> | ||||
|     readonly useAsyncState: UnwrapRef<typeof import('@vueuse/core')['useAsyncState']> | ||||
|     readonly useAttrs: UnwrapRef<typeof import('vue')['useAttrs']> | ||||
|     readonly useBase64: UnwrapRef<typeof import('@vueuse/core')['useBase64']> | ||||
|     readonly useBattery: UnwrapRef<typeof import('@vueuse/core')['useBattery']> | ||||
|     readonly useBluetooth: UnwrapRef<typeof import('@vueuse/core')['useBluetooth']> | ||||
|     readonly useBreakpoints: UnwrapRef<typeof import('@vueuse/core')['useBreakpoints']> | ||||
|     readonly useBroadcastChannel: UnwrapRef<typeof import('@vueuse/core')['useBroadcastChannel']> | ||||
|     readonly useBrowserLocation: UnwrapRef<typeof import('@vueuse/core')['useBrowserLocation']> | ||||
|     readonly useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']> | ||||
|     readonly useClipboard: UnwrapRef<typeof import('@vueuse/core')['useClipboard']> | ||||
|     readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']> | ||||
|     readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']> | ||||
|     readonly useCounter: UnwrapRef<typeof import('@vueuse/core')['useCounter']> | ||||
|     readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']> | ||||
|     readonly useCssVar: UnwrapRef<typeof import('@vueuse/core')['useCssVar']> | ||||
|     readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']> | ||||
|     readonly useCurrentElement: UnwrapRef<typeof import('@vueuse/core')['useCurrentElement']> | ||||
|     readonly useCycleList: UnwrapRef<typeof import('@vueuse/core')['useCycleList']> | ||||
|     readonly useDark: UnwrapRef<typeof import('@vueuse/core')['useDark']> | ||||
|     readonly useDateFormat: UnwrapRef<typeof import('@vueuse/core')['useDateFormat']> | ||||
|     readonly useDebounce: UnwrapRef<typeof import('@vueuse/core')['useDebounce']> | ||||
|     readonly useDebounceFn: UnwrapRef<typeof import('@vueuse/core')['useDebounceFn']> | ||||
|     readonly useDebouncedRefHistory: UnwrapRef<typeof import('@vueuse/core')['useDebouncedRefHistory']> | ||||
|     readonly useDeviceMotion: UnwrapRef<typeof import('@vueuse/core')['useDeviceMotion']> | ||||
|     readonly useDeviceOrientation: UnwrapRef<typeof import('@vueuse/core')['useDeviceOrientation']> | ||||
|     readonly useDevicePixelRatio: UnwrapRef<typeof import('@vueuse/core')['useDevicePixelRatio']> | ||||
|     readonly useDevicesList: UnwrapRef<typeof import('@vueuse/core')['useDevicesList']> | ||||
|     readonly useDisplayMedia: UnwrapRef<typeof import('@vueuse/core')['useDisplayMedia']> | ||||
|     readonly useDocumentVisibility: UnwrapRef<typeof import('@vueuse/core')['useDocumentVisibility']> | ||||
|     readonly useDraggable: UnwrapRef<typeof import('@vueuse/core')['useDraggable']> | ||||
|     readonly useDropZone: UnwrapRef<typeof import('@vueuse/core')['useDropZone']> | ||||
|     readonly useElementBounding: UnwrapRef<typeof import('@vueuse/core')['useElementBounding']> | ||||
|     readonly useElementByPoint: UnwrapRef<typeof import('@vueuse/core')['useElementByPoint']> | ||||
|     readonly useElementHover: UnwrapRef<typeof import('@vueuse/core')['useElementHover']> | ||||
|     readonly useElementSize: UnwrapRef<typeof import('@vueuse/core')['useElementSize']> | ||||
|     readonly useElementVisibility: UnwrapRef<typeof import('@vueuse/core')['useElementVisibility']> | ||||
|     readonly useEventBus: UnwrapRef<typeof import('@vueuse/core')['useEventBus']> | ||||
|     readonly useEventListener: UnwrapRef<typeof import('@vueuse/core')['useEventListener']> | ||||
|     readonly useEventSource: UnwrapRef<typeof import('@vueuse/core')['useEventSource']> | ||||
|     readonly useEyeDropper: UnwrapRef<typeof import('@vueuse/core')['useEyeDropper']> | ||||
|     readonly useFavicon: UnwrapRef<typeof import('@vueuse/core')['useFavicon']> | ||||
|     readonly useFetch: UnwrapRef<typeof import('@vueuse/core')['useFetch']> | ||||
|     readonly useFileDialog: UnwrapRef<typeof import('@vueuse/core')['useFileDialog']> | ||||
|     readonly useFileSystemAccess: UnwrapRef<typeof import('@vueuse/core')['useFileSystemAccess']> | ||||
|     readonly useFocus: UnwrapRef<typeof import('@vueuse/core')['useFocus']> | ||||
|     readonly useFocusWithin: UnwrapRef<typeof import('@vueuse/core')['useFocusWithin']> | ||||
|     readonly useFps: UnwrapRef<typeof import('@vueuse/core')['useFps']> | ||||
|     readonly useFullscreen: UnwrapRef<typeof import('@vueuse/core')['useFullscreen']> | ||||
|     readonly useGamepad: UnwrapRef<typeof import('@vueuse/core')['useGamepad']> | ||||
|     readonly useGeolocation: UnwrapRef<typeof import('@vueuse/core')['useGeolocation']> | ||||
|     readonly useHead: UnwrapRef<typeof import('@vueuse/head')['useHead']> | ||||
|     readonly useI18n: UnwrapRef<typeof import('vue-i18n')['useI18n']> | ||||
|     readonly useIdle: UnwrapRef<typeof import('@vueuse/core')['useIdle']> | ||||
|     readonly useImage: UnwrapRef<typeof import('@vueuse/core')['useImage']> | ||||
|     readonly useInfiniteScroll: UnwrapRef<typeof import('@vueuse/core')['useInfiniteScroll']> | ||||
|     readonly useIntersectionObserver: UnwrapRef<typeof import('@vueuse/core')['useIntersectionObserver']> | ||||
|     readonly useInterval: UnwrapRef<typeof import('@vueuse/core')['useInterval']> | ||||
|     readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']> | ||||
|     readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']> | ||||
|     readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']> | ||||
|     readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']> | ||||
|     readonly useMagicKeys: UnwrapRef<typeof import('@vueuse/core')['useMagicKeys']> | ||||
|     readonly useManualRefHistory: UnwrapRef<typeof import('@vueuse/core')['useManualRefHistory']> | ||||
|     readonly useMediaControls: UnwrapRef<typeof import('@vueuse/core')['useMediaControls']> | ||||
|     readonly useMediaQuery: UnwrapRef<typeof import('@vueuse/core')['useMediaQuery']> | ||||
|     readonly useMemoize: UnwrapRef<typeof import('@vueuse/core')['useMemoize']> | ||||
|     readonly useMemory: UnwrapRef<typeof import('@vueuse/core')['useMemory']> | ||||
|     readonly useMounted: UnwrapRef<typeof import('@vueuse/core')['useMounted']> | ||||
|     readonly useMouse: UnwrapRef<typeof import('@vueuse/core')['useMouse']> | ||||
|     readonly useMouseInElement: UnwrapRef<typeof import('@vueuse/core')['useMouseInElement']> | ||||
|     readonly useMousePressed: UnwrapRef<typeof import('@vueuse/core')['useMousePressed']> | ||||
|     readonly useMutationObserver: UnwrapRef<typeof import('@vueuse/core')['useMutationObserver']> | ||||
|     readonly useNavigatorLanguage: UnwrapRef<typeof import('@vueuse/core')['useNavigatorLanguage']> | ||||
|     readonly useNetwork: UnwrapRef<typeof import('@vueuse/core')['useNetwork']> | ||||
|     readonly useNow: UnwrapRef<typeof import('@vueuse/core')['useNow']> | ||||
|     readonly useObjectUrl: UnwrapRef<typeof import('@vueuse/core')['useObjectUrl']> | ||||
|     readonly useOffsetPagination: UnwrapRef<typeof import('@vueuse/core')['useOffsetPagination']> | ||||
|     readonly useOnline: UnwrapRef<typeof import('@vueuse/core')['useOnline']> | ||||
|     readonly usePageLeave: UnwrapRef<typeof import('@vueuse/core')['usePageLeave']> | ||||
|     readonly useParallax: UnwrapRef<typeof import('@vueuse/core')['useParallax']> | ||||
|     readonly usePermission: UnwrapRef<typeof import('@vueuse/core')['usePermission']> | ||||
|     readonly usePointer: UnwrapRef<typeof import('@vueuse/core')['usePointer']> | ||||
|     readonly usePointerSwipe: UnwrapRef<typeof import('@vueuse/core')['usePointerSwipe']> | ||||
|     readonly usePreferredColorScheme: UnwrapRef<typeof import('@vueuse/core')['usePreferredColorScheme']> | ||||
|     readonly usePreferredDark: UnwrapRef<typeof import('@vueuse/core')['usePreferredDark']> | ||||
|     readonly usePreferredLanguages: UnwrapRef<typeof import('@vueuse/core')['usePreferredLanguages']> | ||||
|     readonly usePreferredReducedMotion: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedMotion']> | ||||
|     readonly useRafFn: UnwrapRef<typeof import('@vueuse/core')['useRafFn']> | ||||
|     readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']> | ||||
|     readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']> | ||||
|     readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']> | ||||
|     readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']> | ||||
|     readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']> | ||||
|     readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']> | ||||
|     readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']> | ||||
|     readonly useScroll: UnwrapRef<typeof import('@vueuse/core')['useScroll']> | ||||
|     readonly useScrollLock: UnwrapRef<typeof import('@vueuse/core')['useScrollLock']> | ||||
|     readonly useSessionStorage: UnwrapRef<typeof import('@vueuse/core')['useSessionStorage']> | ||||
|     readonly useShare: UnwrapRef<typeof import('@vueuse/core')['useShare']> | ||||
|     readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']> | ||||
|     readonly useSpeechRecognition: UnwrapRef<typeof import('@vueuse/core')['useSpeechRecognition']> | ||||
|     readonly useSpeechSynthesis: UnwrapRef<typeof import('@vueuse/core')['useSpeechSynthesis']> | ||||
|     readonly useStepper: UnwrapRef<typeof import('@vueuse/core')['useStepper']> | ||||
|     readonly useStorage: UnwrapRef<typeof import('@vueuse/core')['useStorage']> | ||||
|     readonly useStorageAsync: UnwrapRef<typeof import('@vueuse/core')['useStorageAsync']> | ||||
|     readonly useStyleTag: UnwrapRef<typeof import('@vueuse/core')['useStyleTag']> | ||||
|     readonly useSupported: UnwrapRef<typeof import('@vueuse/core')['useSupported']> | ||||
|     readonly useSwipe: UnwrapRef<typeof import('@vueuse/core')['useSwipe']> | ||||
|     readonly useTemplateRefsList: UnwrapRef<typeof import('@vueuse/core')['useTemplateRefsList']> | ||||
|     readonly useTextDirection: UnwrapRef<typeof import('@vueuse/core')['useTextDirection']> | ||||
|     readonly useTextSelection: UnwrapRef<typeof import('@vueuse/core')['useTextSelection']> | ||||
|     readonly useTextareaAutosize: UnwrapRef<typeof import('@vueuse/core')['useTextareaAutosize']> | ||||
|     readonly useThrottle: UnwrapRef<typeof import('@vueuse/core')['useThrottle']> | ||||
|     readonly useThrottleFn: UnwrapRef<typeof import('@vueuse/core')['useThrottleFn']> | ||||
|     readonly useThrottledRefHistory: UnwrapRef<typeof import('@vueuse/core')['useThrottledRefHistory']> | ||||
|     readonly useTimeAgo: UnwrapRef<typeof import('@vueuse/core')['useTimeAgo']> | ||||
|     readonly useTimeout: UnwrapRef<typeof import('@vueuse/core')['useTimeout']> | ||||
|     readonly useTimeoutFn: UnwrapRef<typeof import('@vueuse/core')['useTimeoutFn']> | ||||
|     readonly useTimeoutPoll: UnwrapRef<typeof import('@vueuse/core')['useTimeoutPoll']> | ||||
|     readonly useTimestamp: UnwrapRef<typeof import('@vueuse/core')['useTimestamp']> | ||||
|     readonly useTitle: UnwrapRef<typeof import('@vueuse/core')['useTitle']> | ||||
|     readonly useToNumber: UnwrapRef<typeof import('@vueuse/core')['useToNumber']> | ||||
|     readonly useToString: UnwrapRef<typeof import('@vueuse/core')['useToString']> | ||||
|     readonly useToggle: UnwrapRef<typeof import('@vueuse/core')['useToggle']> | ||||
|     readonly useTransition: UnwrapRef<typeof import('@vueuse/core')['useTransition']> | ||||
|     readonly useUrlSearchParams: UnwrapRef<typeof import('@vueuse/core')['useUrlSearchParams']> | ||||
|     readonly useUserMedia: UnwrapRef<typeof import('@vueuse/core')['useUserMedia']> | ||||
|     readonly useUserStore: UnwrapRef<typeof import('./store/user')['useUserStore']> | ||||
|     readonly useVModel: UnwrapRef<typeof import('@vueuse/core')['useVModel']> | ||||
|     readonly useVModels: UnwrapRef<typeof import('@vueuse/core')['useVModels']> | ||||
|     readonly useVibrate: UnwrapRef<typeof import('@vueuse/core')['useVibrate']> | ||||
|     readonly useVirtualList: UnwrapRef<typeof import('@vueuse/core')['useVirtualList']> | ||||
|     readonly useWakeLock: UnwrapRef<typeof import('@vueuse/core')['useWakeLock']> | ||||
|     readonly useWebNotification: UnwrapRef<typeof import('@vueuse/core')['useWebNotification']> | ||||
|     readonly useWebSocket: UnwrapRef<typeof import('@vueuse/core')['useWebSocket']> | ||||
|     readonly useWebWorker: UnwrapRef<typeof import('@vueuse/core')['useWebWorker']> | ||||
|     readonly useWebWorkerFn: UnwrapRef<typeof import('@vueuse/core')['useWebWorkerFn']> | ||||
|     readonly useWindowFocus: UnwrapRef<typeof import('@vueuse/core')['useWindowFocus']> | ||||
|     readonly useWindowScroll: UnwrapRef<typeof import('@vueuse/core')['useWindowScroll']> | ||||
|     readonly useWindowSize: UnwrapRef<typeof import('@vueuse/core')['useWindowSize']> | ||||
|     readonly watch: UnwrapRef<typeof import('vue')['watch']> | ||||
|     readonly watchArray: UnwrapRef<typeof import('@vueuse/core')['watchArray']> | ||||
|     readonly watchAtMost: UnwrapRef<typeof import('@vueuse/core')['watchAtMost']> | ||||
|     readonly watchDebounced: UnwrapRef<typeof import('@vueuse/core')['watchDebounced']> | ||||
|     readonly watchEffect: UnwrapRef<typeof import('vue')['watchEffect']> | ||||
|     readonly watchIgnorable: UnwrapRef<typeof import('@vueuse/core')['watchIgnorable']> | ||||
|     readonly watchOnce: UnwrapRef<typeof import('@vueuse/core')['watchOnce']> | ||||
|     readonly watchPausable: UnwrapRef<typeof import('@vueuse/core')['watchPausable']> | ||||
|     readonly watchPostEffect: UnwrapRef<typeof import('vue')['watchPostEffect']> | ||||
|     readonly watchSyncEffect: UnwrapRef<typeof import('vue')['watchSyncEffect']> | ||||
|     readonly watchThrottled: UnwrapRef<typeof import('@vueuse/core')['watchThrottled']> | ||||
|     readonly watchTriggerable: UnwrapRef<typeof import('@vueuse/core')['watchTriggerable']> | ||||
|     readonly watchWithFilter: UnwrapRef<typeof import('@vueuse/core')['watchWithFilter']> | ||||
|     readonly whenever: UnwrapRef<typeof import('@vueuse/core')['whenever']> | ||||
|   } | ||||
| } | ||||
							
								
								
									
										16
									
								
								fixtures/vitesse/src/components.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								fixtures/vitesse/src/components.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| // generated by unplugin-vue-components | ||||
| // We suggest you to commit this file into source control | ||||
| // Read more: https://github.com/vuejs/core/pull/3399 | ||||
| import '@vue/runtime-core' | ||||
|  | ||||
| export {} | ||||
|  | ||||
| declare module '@vue/runtime-core' { | ||||
|   export interface GlobalComponents { | ||||
|     Counter: typeof import('./components/Counter.vue')['default'] | ||||
|     Footer: typeof import('./components/Footer.vue')['default'] | ||||
|     README: typeof import('./components/README.md')['default'] | ||||
|     RouterLink: typeof import('vue-router')['RouterLink'] | ||||
|     RouterView: typeof import('vue-router')['RouterView'] | ||||
|   } | ||||
| } | ||||
							
								
								
									
										19
									
								
								fixtures/vitesse/src/components/Counter.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								fixtures/vitesse/src/components/Counter.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| <script setup lang="ts"> | ||||
| const props = defineProps<{ | ||||
|   initial: number | ||||
| }>() | ||||
|  | ||||
| const { count, inc, dec } = useCounter(props.initial) | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <div> | ||||
|     {{ count }} | ||||
|     <button class="inc" @click="inc()"> | ||||
|       + | ||||
|     </button> | ||||
|     <button class="dec" @click="dec()"> | ||||
|       - | ||||
|     </button> | ||||
|   </div> | ||||
| </template> | ||||
							
								
								
									
										33
									
								
								fixtures/vitesse/src/components/Footer.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								fixtures/vitesse/src/components/Footer.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <script setup lang="ts"> | ||||
| const { t, availableLocales, locale } = useI18n() | ||||
|  | ||||
| const toggleLocales = () => { | ||||
|   // change to some real logic | ||||
|   const locales = availableLocales | ||||
|   locale.value = locales[(locales.indexOf(locale.value) + 1) % locales.length] | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <nav text-xl mt-6> | ||||
|     <RouterLink class="icon-btn mx-2" to="/" :title="t('button.home')"> | ||||
|       <div i-carbon-campsite /> | ||||
|     </RouterLink> | ||||
|  | ||||
|     <button class="icon-btn mx-2 !outline-none" :title="t('button.toggle_dark')" @click="toggleDark()"> | ||||
|       <div i="carbon-sun dark:carbon-moon" /> | ||||
|     </button> | ||||
|  | ||||
|     <a class="icon-btn mx-2" :title="t('button.toggle_langs')" @click="toggleLocales()"> | ||||
|       <div i-carbon-language /> | ||||
|     </a> | ||||
|  | ||||
|     <RouterLink class="icon-btn mx-2" to="/about" :title="t('button.about')"> | ||||
|       <div i-carbon-dicom-overlay /> | ||||
|     </RouterLink> | ||||
|  | ||||
|     <a class="icon-btn mx-2" rel="noreferrer" href="https://github.com/antfu/vitesse" target="_blank" title="GitHub"> | ||||
|       <div i-carbon-logo-github /> | ||||
|     </a> | ||||
|   </nav> | ||||
| </template> | ||||
							
								
								
									
										10
									
								
								fixtures/vitesse/src/components/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								fixtures/vitesse/src/components/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| ## Components | ||||
|  | ||||
| Components in this dir will be auto-registered and on-demand, powered by [`unplugin-vue-components`](https://github.com/antfu/unplugin-vue-components). | ||||
|  | ||||
|  | ||||
| ### Icons | ||||
|  | ||||
| You can use icons from almost any icon sets by the power of [Iconify](https://iconify.design/). | ||||
|  | ||||
| It will only bundle the icons you use. Check out [`unplugin-icons`](https://github.com/antfu/unplugin-icons) for more details. | ||||
							
								
								
									
										4
									
								
								fixtures/vitesse/src/composables/dark.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								fixtures/vitesse/src/composables/dark.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| // these APIs are auto-imported from @vueuse/core | ||||
| export const isDark = useDark() | ||||
| export const toggleDark = useToggle(isDark) | ||||
| export const preferredDark = usePreferredDark() | ||||
							
								
								
									
										18
									
								
								fixtures/vitesse/src/layouts/404.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								fixtures/vitesse/src/layouts/404.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <script setup lang="ts"> | ||||
| const router = useRouter() | ||||
| const { t } = useI18n() | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <main p="x4 y10" text="center teal-700 dark:gray-200"> | ||||
|     <div text-4xl> | ||||
|       <div i-carbon-warning inline-block /> | ||||
|     </div> | ||||
|     <RouterView /> | ||||
|     <div> | ||||
|       <button btn text-sm m="3 t8" @click="router.back()"> | ||||
|         {{ t('button.back') }} | ||||
|       </button> | ||||
|     </div> | ||||
|   </main> | ||||
| </template> | ||||
							
								
								
									
										14
									
								
								fixtures/vitesse/src/layouts/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								fixtures/vitesse/src/layouts/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| ## Layouts | ||||
|  | ||||
| Vue components in this dir are used as layouts. | ||||
|  | ||||
| By default, `default.vue` will be used unless an alternative is specified in the route meta. | ||||
|  | ||||
| With [`vite-plugin-pages`](https://github.com/hannoeru/vite-plugin-pages) and [`vite-plugin-vue-layouts`](https://github.com/JohnCampionJr/vite-plugin-vue-layouts), you can specify the layout in the page's SFCs like this: | ||||
|  | ||||
| ```html | ||||
| <route lang="yaml"> | ||||
| meta: | ||||
|   layout: home | ||||
| </route> | ||||
| ``` | ||||
							
								
								
									
										9
									
								
								fixtures/vitesse/src/layouts/default.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								fixtures/vitesse/src/layouts/default.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| <template> | ||||
|   <main class="px-4 py-10 text-center text-gray-700 dark:text-gray-200"> | ||||
|     <RouterView /> | ||||
|     <Footer /> | ||||
|     <div class="mt-5 mx-auto text-center opacity-75 dark:opacity-50 text-sm"> | ||||
|       [Default Layout] | ||||
|     </div> | ||||
|   </main> | ||||
| </template> | ||||
							
								
								
									
										9
									
								
								fixtures/vitesse/src/layouts/home.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								fixtures/vitesse/src/layouts/home.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| <template> | ||||
|   <main class="px-4 py-10 text-center text-gray-700 dark:text-gray-200"> | ||||
|     <RouterView /> | ||||
|     <Footer /> | ||||
|     <div class="mt-5 mx-auto text-center opacity-75 dark:opacity-50 text-sm"> | ||||
|       [Home Layout] | ||||
|     </div> | ||||
|   </main> | ||||
| </template> | ||||
							
								
								
									
										22
									
								
								fixtures/vitesse/src/main.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								fixtures/vitesse/src/main.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| import { ViteSSG } from 'vite-ssg' | ||||
| import { setupLayouts } from 'virtual:generated-layouts' | ||||
| import App from './App.vue' | ||||
| import type { UserModule } from './types' | ||||
| import generatedRoutes from '~pages' | ||||
|  | ||||
| import '@unocss/reset/tailwind.css' | ||||
| import './styles/main.css' | ||||
| import 'uno.css' | ||||
|  | ||||
| const routes = setupLayouts(generatedRoutes) | ||||
|  | ||||
| // https://github.com/antfu/vite-ssg | ||||
| export const createApp = ViteSSG( | ||||
|   App, | ||||
|   { routes, base: import.meta.env.BASE_URL }, | ||||
|   (ctx) => { | ||||
|     // install all modules under `modules/` | ||||
|     Object.values(import.meta.glob<{ install: UserModule }>('./modules/*.ts', { eager: true })) | ||||
|       .forEach(i => i.install?.(ctx)) | ||||
|   }, | ||||
| ) | ||||
							
								
								
									
										11
									
								
								fixtures/vitesse/src/modules/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								fixtures/vitesse/src/modules/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| ## Modules | ||||
|  | ||||
| A custom user module system. Place a `.ts` file with the following template, it will be installed automatically. | ||||
|  | ||||
| ```ts | ||||
| import { type UserModule } from '~/types' | ||||
|  | ||||
| export const install: UserModule = ({ app, router, isClient }) => { | ||||
|   // do something | ||||
| } | ||||
| ``` | ||||
							
								
								
									
										25
									
								
								fixtures/vitesse/src/modules/i18n.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								fixtures/vitesse/src/modules/i18n.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| import { createI18n } from 'vue-i18n' | ||||
| import { type UserModule } from '~/types' | ||||
|  | ||||
| // Import i18n resources | ||||
| // https://vitejs.dev/guide/features.html#glob-import | ||||
| // | ||||
| // Don't need this? Try vitesse-lite: https://github.com/antfu/vitesse-lite | ||||
| const messages = Object.fromEntries( | ||||
|   Object.entries( | ||||
|     import.meta.glob<{ default: any }>('../../locales/*.y(a)?ml', { eager: true })) | ||||
|     .map(([key, value]) => { | ||||
|       const yaml = key.endsWith('.yaml') | ||||
|       return [key.slice(14, yaml ? -5 : -4), value.default] | ||||
|     }), | ||||
| ) | ||||
|  | ||||
| export const install: UserModule = ({ app }) => { | ||||
|   const i18n = createI18n({ | ||||
|     legacy: false, | ||||
|     locale: 'en', | ||||
|     messages, | ||||
|   }) | ||||
|  | ||||
|   app.use(i18n) | ||||
| } | ||||
							
								
								
									
										14
									
								
								fixtures/vitesse/src/modules/nprogress.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								fixtures/vitesse/src/modules/nprogress.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| import NProgress from 'nprogress' | ||||
| import { type UserModule } from '~/types' | ||||
|  | ||||
| export const install: UserModule = ({ isClient, router }) => { | ||||
|   if (isClient) { | ||||
|     router.beforeEach((to, from) => { | ||||
|       if (to.path !== from.path) | ||||
|         NProgress.start() | ||||
|     }) | ||||
|     router.afterEach(() => { | ||||
|       NProgress.done() | ||||
|     }) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										17
									
								
								fixtures/vitesse/src/modules/pinia.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								fixtures/vitesse/src/modules/pinia.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| import { createPinia } from 'pinia' | ||||
| import { type UserModule } from '~/types' | ||||
|  | ||||
| // Setup Pinia | ||||
| // https://pinia.vuejs.org/ | ||||
| export const install: UserModule = ({ isClient, initialState, app }) => { | ||||
|   const pinia = createPinia() | ||||
|   app.use(pinia) | ||||
|   // Refer to | ||||
|   // https://github.com/antfu/vite-ssg/blob/main/README.md#state-serialization | ||||
|   // for other serialization strategies. | ||||
|   if (isClient) | ||||
|     pinia.state.value = (initialState.pinia) || {} | ||||
|  | ||||
|   else | ||||
|     initialState.pinia = pinia.state.value | ||||
| } | ||||
							
								
								
									
										12
									
								
								fixtures/vitesse/src/modules/pwa.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								fixtures/vitesse/src/modules/pwa.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| import { type UserModule } from '~/types' | ||||
|  | ||||
| // https://github.com/antfu/vite-plugin-pwa#automatic-reload-when-new-content-available | ||||
| export const install: UserModule = ({ isClient, router }) => { | ||||
|   if (!isClient) | ||||
|     return | ||||
|  | ||||
|   router.isReady().then(async () => { | ||||
|     const { registerSW } = await import('virtual:pwa-register') | ||||
|     registerSW({ immediate: true }) | ||||
|   }) | ||||
| } | ||||
							
								
								
									
										20
									
								
								fixtures/vitesse/src/pages/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								fixtures/vitesse/src/pages/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| ## File-based Routing | ||||
|  | ||||
| Routes will be auto-generated for Vue files in this dir with the same file structure. | ||||
| Check out [`vite-plugin-pages`](https://github.com/hannoeru/vite-plugin-pages) for more details. | ||||
|  | ||||
| ### Path Aliasing | ||||
|  | ||||
| `~/` is aliased to `./src/` folder. | ||||
|  | ||||
| For example, instead of having | ||||
|  | ||||
| ```ts | ||||
| import { isDark } from '../../../../composables' | ||||
| ``` | ||||
|  | ||||
| now, you can use | ||||
|  | ||||
| ```ts | ||||
| import { isDark } from '~/composables' | ||||
| ``` | ||||
							
								
								
									
										14
									
								
								fixtures/vitesse/src/pages/[...all].vue
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										14
									
								
								fixtures/vitesse/src/pages/[...all].vue
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| <script setup lang="ts"> | ||||
| const { t } = useI18n() | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <div> | ||||
|     {{ t('not-found') }} | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <route lang="yaml"> | ||||
| meta: | ||||
|   layout: 404 | ||||
| </route> | ||||
							
								
								
									
										21
									
								
								fixtures/vitesse/src/pages/about.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								fixtures/vitesse/src/pages/about.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| --- | ||||
| title: About | ||||
| --- | ||||
|  | ||||
| <div class="text-center"> | ||||
|   <!-- You can use Vue components inside markdown --> | ||||
|   <div i-carbon-dicom-overlay class="text-4xl -mb-6 m-auto" /> | ||||
|   <h3>About</h3> | ||||
| </div> | ||||
|  | ||||
| [Vitesse](https://github.com/antfu/vitesse) is an opinionated [Vite](https://github.com/vitejs/vite) starter template made by [@antfu](https://github.com/antfu) for mocking apps swiftly. With **file-based routing**, **components auto importing**, **markdown support**, I18n, PWA and uses **UnoCSS** for styling and icons. | ||||
|  | ||||
| ```js | ||||
| // syntax highlighting example | ||||
| function vitesse() { | ||||
|   const foo = 'bar' | ||||
|   console.log(foo) | ||||
| } | ||||
| ``` | ||||
|  | ||||
| Check out the [GitHub repo](https://github.com/antfu/vitesse) for more details. | ||||
							
								
								
									
										47
									
								
								fixtures/vitesse/src/pages/hi/[name].vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								fixtures/vitesse/src/pages/hi/[name].vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| <script setup lang="ts"> | ||||
| const props = defineProps<{ name: string }>() | ||||
| const router = useRouter() | ||||
| const user = useUserStore() | ||||
| const { t } = useI18n() | ||||
|  | ||||
| watchEffect(() => { | ||||
|   user.setNewName(props.name) | ||||
| }) | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <div> | ||||
|     <div text-4xl> | ||||
|       <div i-carbon-pedestrian inline-block /> | ||||
|     </div> | ||||
|     <p> | ||||
|       {{ t('intro.hi', { name: props.name }) }} | ||||
|     </p> | ||||
|  | ||||
|     <p text-sm opacity-75> | ||||
|       <em>{{ t('intro.dynamic-route') }}</em> | ||||
|     </p> | ||||
|  | ||||
|     <template v-if="user.otherNames.length"> | ||||
|       <p text-sm mt-4> | ||||
|         <span opacity-75>{{ t('intro.aka') }}:</span> | ||||
|         <ul> | ||||
|           <li v-for="otherName in user.otherNames" :key="otherName"> | ||||
|             <router-link :to="`/hi/${otherName}`" replace> | ||||
|               {{ otherName }} | ||||
|             </router-link> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </p> | ||||
|     </template> | ||||
|  | ||||
|     <div> | ||||
|       <button | ||||
|         btn m="3 t6" text-sm | ||||
|         @click="router.back()" | ||||
|       > | ||||
|         {{ t('button.back') }} | ||||
|       </button> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
							
								
								
									
										62
									
								
								fixtures/vitesse/src/pages/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								fixtures/vitesse/src/pages/index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| <script setup lang="ts"> | ||||
| const user = useUserStore() | ||||
| const name = $ref(user.savedName) | ||||
|  | ||||
| const router = useRouter() | ||||
| const go = () => { | ||||
|   if (name) | ||||
|     router.push(`/hi/${encodeURIComponent(name)}`) | ||||
| } | ||||
|  | ||||
| const { t } = useI18n() | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <div> | ||||
|     <div text-4xl> | ||||
|       <div i-carbon-campsite inline-block /> | ||||
|     </div> | ||||
|     <p> | ||||
|       <a rel="noreferrer" href="https://github.com/antfu/vitesse" target="_blank"> | ||||
|         Vitesse | ||||
|       </a> | ||||
|     </p> | ||||
|     <p> | ||||
|       <em text-sm opacity-75>{{ t('intro.desc') }}</em> | ||||
|     </p> | ||||
|  | ||||
|     <div py-4 /> | ||||
|  | ||||
|     <input | ||||
|       id="input" | ||||
|       v-model="name" | ||||
|       :placeholder="t('intro.whats-your-name')" | ||||
|       :aria-label="t('intro.whats-your-name')" | ||||
|       type="text" | ||||
|       autocomplete="false" | ||||
|       p="x4 y2" | ||||
|       w="250px" | ||||
|       text="center" | ||||
|       bg="transparent" | ||||
|       border="~ rounded gray-200 dark:gray-700" | ||||
|       outline="none active:none" | ||||
|       @keydown.enter="go" | ||||
|     > | ||||
|     <label class="hidden" for="input">{{ t('intro.whats-your-name') }}</label> | ||||
|  | ||||
|     <div> | ||||
|       <button | ||||
|         btn m-3 text-sm | ||||
|         :disabled="!name" | ||||
|         @click="go" | ||||
|       > | ||||
|         {{ t('button.go') }} | ||||
|       </button> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <route lang="yaml"> | ||||
| meta: | ||||
|   layout: home | ||||
| </route> | ||||
							
								
								
									
										16
									
								
								fixtures/vitesse/src/shims.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								fixtures/vitesse/src/shims.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| declare interface Window { | ||||
|   // extend the window | ||||
| } | ||||
|  | ||||
| // with vite-plugin-vue-markdown, markdown files can be treated as Vue components | ||||
| declare module '*.md' { | ||||
|   import { type DefineComponent } from 'vue' | ||||
|   const component: DefineComponent<{}, {}, any> | ||||
|   export default component | ||||
| } | ||||
|  | ||||
| declare module '*.vue' { | ||||
|   import { type DefineComponent } from 'vue' | ||||
|   const component: DefineComponent<{}, {}, any> | ||||
|   export default component | ||||
| } | ||||
							
								
								
									
										34
									
								
								fixtures/vitesse/src/store/user.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								fixtures/vitesse/src/store/user.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| import { acceptHMRUpdate, defineStore } from 'pinia' | ||||
|  | ||||
| export const useUserStore = defineStore('user', () => { | ||||
|   /** | ||||
|    * Current name of the user. | ||||
|    */ | ||||
|   const savedName = ref('') | ||||
|   const previousNames = ref(new Set<string>()) | ||||
|  | ||||
|   const usedNames = computed(() => Array.from(previousNames.value)) | ||||
|   const otherNames = computed(() => usedNames.value.filter(name => name !== savedName.value)) | ||||
|  | ||||
|   /** | ||||
|    * Changes the current name of the user and saves the one that was used | ||||
|    * before. | ||||
|    * | ||||
|    * @param name - new name to set | ||||
|    */ | ||||
|   function setNewName(name: string) { | ||||
|     if (savedName.value) | ||||
|       previousNames.value.add(savedName.value) | ||||
|  | ||||
|     savedName.value = name | ||||
|   } | ||||
|  | ||||
|   return { | ||||
|     setNewName, | ||||
|     otherNames, | ||||
|     savedName, | ||||
|   } | ||||
| }) | ||||
|  | ||||
| if (import.meta.hot) | ||||
|   import.meta.hot.accept(acceptHMRUpdate(useUserStore, import.meta.hot)) | ||||
							
								
								
									
										29
									
								
								fixtures/vitesse/src/styles/main.css
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										29
									
								
								fixtures/vitesse/src/styles/main.css
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| @import './markdown.css'; | ||||
|  | ||||
| html, | ||||
| body, | ||||
| #app { | ||||
|   height: 100%; | ||||
|   margin: 0; | ||||
|   padding: 0; | ||||
| } | ||||
|  | ||||
| html.dark { | ||||
|   background: #121212; | ||||
|   color-scheme: dark; | ||||
| } | ||||
|  | ||||
| #nprogress { | ||||
|   pointer-events: none; | ||||
| } | ||||
|  | ||||
| #nprogress .bar { | ||||
|   background: rgb(13,148,136); | ||||
|   opacity: 0.75; | ||||
|   position: fixed; | ||||
|   z-index: 1031; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   width: 100%; | ||||
|   height: 2px; | ||||
| } | ||||
							
								
								
									
										28
									
								
								fixtures/vitesse/src/styles/markdown.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								fixtures/vitesse/src/styles/markdown.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| .prose pre:not(.shiki) { | ||||
|   padding: 0; | ||||
| } | ||||
|  | ||||
| .prose .shiki { | ||||
|   font-family: 'DM Mono', monospace; | ||||
|   font-size: 1.2em; | ||||
|   line-height: 1.4; | ||||
| } | ||||
|  | ||||
| .prose img { | ||||
|   width: 100%; | ||||
| } | ||||
|  | ||||
| .shiki-light { | ||||
|   background: #f8f8f8 !important; | ||||
| } | ||||
| .shiki-dark { | ||||
|   background: #0e0e0e !important; | ||||
| } | ||||
|  | ||||
| html.dark .shiki-light { | ||||
|   display: none; | ||||
| } | ||||
|  | ||||
| html:not(.dark) .shiki-dark { | ||||
|   display: none; | ||||
| } | ||||
							
								
								
									
										3
									
								
								fixtures/vitesse/src/types.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								fixtures/vitesse/src/types.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| import { type ViteSSGContext } from 'vite-ssg' | ||||
|  | ||||
| export type UserModule = (ctx: ViteSSGContext) => void | ||||
| @@ -0,0 +1,3 @@ | ||||
| // Vitest Snapshot v1 | ||||
|  | ||||
| exports[`Counter.vue > should render 1`] = `"<div>10 <button class=\\"inc\\"> + </button><button class=\\"dec\\"> - </button></div>"`; | ||||
							
								
								
									
										7
									
								
								fixtures/vitesse/test/basic.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								fixtures/vitesse/test/basic.test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| import { describe, expect, it } from 'vitest' | ||||
|  | ||||
| describe('tests', () => { | ||||
|   it('should works', () => { | ||||
|     expect(1 + 1).toEqual(2) | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										28
									
								
								fixtures/vitesse/test/component.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								fixtures/vitesse/test/component.test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| import { mount } from '@vue/test-utils' | ||||
| import { describe, expect, it } from 'vitest' | ||||
| import Counter from '../src/components/Counter.vue' | ||||
|  | ||||
| describe('Counter.vue', () => { | ||||
|   it('should render', () => { | ||||
|     const wrapper = mount(Counter, { props: { initial: 10 } }) | ||||
|     expect(wrapper.text()).toContain('10') | ||||
|     expect(wrapper.html()).toMatchSnapshot() | ||||
|   }) | ||||
|  | ||||
|   it('should be interactive', async () => { | ||||
|     const wrapper = mount(Counter, { props: { initial: 0 } }) | ||||
|     expect(wrapper.text()).toContain('0') | ||||
|  | ||||
|     expect(wrapper.find('.inc').exists()).toBe(true) | ||||
|  | ||||
|     expect(wrapper.find('.dec').exists()).toBe(true) | ||||
|  | ||||
|     await wrapper.get('.inc').trigger('click') | ||||
|  | ||||
|     expect(wrapper.text()).toContain('1') | ||||
|  | ||||
|     await wrapper.get('.dec').trigger('click') | ||||
|  | ||||
|     expect(wrapper.text()).toContain('0') | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										38
									
								
								fixtures/vitesse/unocss.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								fixtures/vitesse/unocss.config.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| import { | ||||
|   defineConfig, | ||||
|   presetAttributify, | ||||
|   presetIcons, | ||||
|   presetTypography, | ||||
|   presetUno, | ||||
|   presetWebFonts, | ||||
|   transformerDirectives, | ||||
|   transformerVariantGroup, | ||||
| } from 'unocss' | ||||
|  | ||||
| export default defineConfig({ | ||||
|   shortcuts: [ | ||||
|     ['btn', 'px-4 py-1 rounded inline-block bg-teal-700 text-white cursor-pointer hover:bg-teal-800 disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50'], | ||||
|     ['icon-btn', 'inline-block cursor-pointer select-none opacity-75 transition duration-200 ease-in-out hover:opacity-100 hover:text-teal-600'], | ||||
|   ], | ||||
|   presets: [ | ||||
|     presetUno(), | ||||
|     presetAttributify(), | ||||
|     presetIcons({ | ||||
|       scale: 1.2, | ||||
|       warn: true, | ||||
|     }), | ||||
|     presetTypography(), | ||||
|     presetWebFonts({ | ||||
|       fonts: { | ||||
|         sans: 'DM Sans', | ||||
|         serif: 'DM Serif Display', | ||||
|         mono: 'DM Mono', | ||||
|       }, | ||||
|     }), | ||||
|   ], | ||||
|   transformers: [ | ||||
|     transformerDirectives(), | ||||
|     transformerVariantGroup(), | ||||
|   ], | ||||
|   safelist: 'prose prose-sm m-auto text-left'.split(' '), | ||||
| }) | ||||
							
								
								
									
										153
									
								
								fixtures/vitesse/vite.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								fixtures/vitesse/vite.config.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,153 @@ | ||||
| import path from 'path' | ||||
| import { defineConfig } from 'vite' | ||||
| import Vue from '@vitejs/plugin-vue' | ||||
| import Pages from 'vite-plugin-pages' | ||||
| import generateSitemap from 'vite-ssg-sitemap' | ||||
| import Layouts from 'vite-plugin-vue-layouts' | ||||
| import Components from 'unplugin-vue-components/vite' | ||||
| import AutoImport from 'unplugin-auto-import/vite' | ||||
| import Markdown from 'vite-plugin-vue-markdown' | ||||
| import { VitePWA } from 'vite-plugin-pwa' | ||||
| import VueI18n from '@intlify/vite-plugin-vue-i18n' | ||||
| import Inspect from 'vite-plugin-inspect' | ||||
| import LinkAttributes from 'markdown-it-link-attributes' | ||||
| import Unocss from 'unocss/vite' | ||||
| import Shiki from 'markdown-it-shiki' | ||||
|  | ||||
| export default defineConfig({ | ||||
|   resolve: { | ||||
|     alias: { | ||||
|       '~/': `${path.resolve(__dirname, 'src')}/`, | ||||
|     }, | ||||
|   }, | ||||
|  | ||||
|   plugins: [ | ||||
|     Vue({ | ||||
|       include: [/\.vue$/, /\.md$/], | ||||
|       reactivityTransform: true, | ||||
|     }), | ||||
|  | ||||
|     // https://github.com/hannoeru/vite-plugin-pages | ||||
|     Pages({ | ||||
|       extensions: ['vue', 'md'], | ||||
|     }), | ||||
|  | ||||
|     // https://github.com/JohnCampionJr/vite-plugin-vue-layouts | ||||
|     Layouts(), | ||||
|  | ||||
|     // https://github.com/antfu/unplugin-auto-import | ||||
|     AutoImport({ | ||||
|       imports: [ | ||||
|         'vue', | ||||
|         'vue-router', | ||||
|         'vue-i18n', | ||||
|         'vue/macros', | ||||
|         '@vueuse/head', | ||||
|         '@vueuse/core', | ||||
|       ], | ||||
|       dts: 'src/auto-imports.d.ts', | ||||
|       dirs: [ | ||||
|         'src/composables', | ||||
|         'src/store', | ||||
|       ], | ||||
|       vueTemplate: true, | ||||
|     }), | ||||
|  | ||||
|     // https://github.com/antfu/unplugin-vue-components | ||||
|     Components({ | ||||
|       // allow auto load markdown components under `./src/components/` | ||||
|       extensions: ['vue', 'md'], | ||||
|       // allow auto import and register components used in markdown | ||||
|       include: [/\.vue$/, /\.vue\?vue/, /\.md$/], | ||||
|       dts: 'src/components.d.ts', | ||||
|     }), | ||||
|  | ||||
|     // https://github.com/antfu/unocss | ||||
|     // see unocss.config.ts for config | ||||
|     Unocss(), | ||||
|  | ||||
|     // https://github.com/antfu/vite-plugin-vue-markdown | ||||
|     // Don't need this? Try vitesse-lite: https://github.com/antfu/vitesse-lite | ||||
|     Markdown({ | ||||
|       wrapperClasses: 'prose prose-sm m-auto text-left', | ||||
|       headEnabled: true, | ||||
|       markdownItSetup(md) { | ||||
|         // https://prismjs.com/ | ||||
|         md.use(Shiki, { | ||||
|           theme: { | ||||
|             light: 'vitesse-light', | ||||
|             dark: 'vitesse-dark', | ||||
|           }, | ||||
|         }) | ||||
|         md.use(LinkAttributes, { | ||||
|           matcher: (link: string) => /^https?:\/\//.test(link), | ||||
|           attrs: { | ||||
|             target: '_blank', | ||||
|             rel: 'noopener', | ||||
|           }, | ||||
|         }) | ||||
|       }, | ||||
|     }), | ||||
|  | ||||
|     // https://github.com/antfu/vite-plugin-pwa | ||||
|     VitePWA({ | ||||
|       registerType: 'autoUpdate', | ||||
|       includeAssets: ['favicon.svg', 'safari-pinned-tab.svg'], | ||||
|       manifest: { | ||||
|         name: 'Vitesse', | ||||
|         short_name: 'Vitesse', | ||||
|         theme_color: '#ffffff', | ||||
|         icons: [ | ||||
|           { | ||||
|             src: '/pwa-192x192.png', | ||||
|             sizes: '192x192', | ||||
|             type: 'image/png', | ||||
|           }, | ||||
|           { | ||||
|             src: '/pwa-512x512.png', | ||||
|             sizes: '512x512', | ||||
|             type: 'image/png', | ||||
|           }, | ||||
|           { | ||||
|             src: '/pwa-512x512.png', | ||||
|             sizes: '512x512', | ||||
|             type: 'image/png', | ||||
|             purpose: 'any maskable', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     }), | ||||
|  | ||||
|     // https://github.com/intlify/bundle-tools/tree/main/packages/vite-plugin-vue-i18n | ||||
|     VueI18n({ | ||||
|       runtimeOnly: true, | ||||
|       compositionOnly: true, | ||||
|       include: [path.resolve(__dirname, 'locales/**')], | ||||
|     }), | ||||
|  | ||||
|     // https://github.com/antfu/vite-plugin-inspect | ||||
|     // Visit http://localhost:3333/__inspect/ to see the inspector | ||||
|     Inspect(), | ||||
|   ], | ||||
|  | ||||
|   // https://github.com/vitest-dev/vitest | ||||
|   test: { | ||||
|     include: ['test/**/*.test.ts'], | ||||
|     environment: 'jsdom', | ||||
|     deps: { | ||||
|       inline: ['@vue', '@vueuse', 'vue-demi'], | ||||
|     }, | ||||
|   }, | ||||
|  | ||||
|   // https://github.com/antfu/vite-ssg | ||||
|   ssgOptions: { | ||||
|     script: 'async', | ||||
|     formatting: 'minify', | ||||
|     onFinished() { generateSitemap() }, | ||||
|   }, | ||||
|  | ||||
|   ssr: { | ||||
|     // TODO: workaround until they support native ESM | ||||
|     noExternal: ['workbox-window', /vue-i18n/], | ||||
|   }, | ||||
| }) | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-monorepo", | ||||
|   "version": "0.26.3", | ||||
|   "version": "0.33.0", | ||||
|   "private": true, | ||||
|   "packageManager": "pnpm@7.1.0", | ||||
|   "author": "Anthony Fu <anthonyfu117@hotmail.com> (https://github.com/antfu/)", | ||||
| @@ -14,8 +14,9 @@ | ||||
|   "devDependencies": { | ||||
|     "@antfu/eslint-config": "*", | ||||
|     "bumpp": "^8.2.1", | ||||
|     "eslint": "^8.23.0", | ||||
|     "eslint": "^8.28.0", | ||||
|     "eslint-plugin-antfu": "workspace:*", | ||||
|     "typescript": "^4.8.2" | ||||
|     "rimraf": "^3.0.2", | ||||
|     "typescript": "^4.9.3" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| module.exports = { | ||||
|   extends: [ | ||||
|     '@antfu/eslint-config-react', | ||||
|     '@antfu/eslint-config-vue', | ||||
|   ], | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config", | ||||
|   "version": "0.26.3", | ||||
|   "version": "0.33.0", | ||||
|   "description": "Anthony's ESLint config", | ||||
|   "author": "Anthony Fu <anthonyfu117@hotmail.com> (https://github.com/antfu/)", | ||||
|   "license": "MIT", | ||||
| @@ -16,23 +16,22 @@ | ||||
|     "eslint": ">=7.4.0" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antfu/eslint-config-react": "workspace:*", | ||||
|     "@antfu/eslint-config-vue": "workspace:*", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.36.1", | ||||
|     "@typescript-eslint/parser": "^5.36.1", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.45.0", | ||||
|     "@typescript-eslint/parser": "^5.45.0", | ||||
|     "eslint-plugin-eslint-comments": "^3.2.0", | ||||
|     "eslint-plugin-html": "^7.1.0", | ||||
|     "eslint-plugin-import": "^2.26.0", | ||||
|     "eslint-plugin-jsonc": "^2.4.0", | ||||
|     "eslint-plugin-n": "^15.2.5", | ||||
|     "eslint-plugin-promise": "^6.0.1", | ||||
|     "eslint-plugin-unicorn": "^43.0.2", | ||||
|     "eslint-plugin-vue": "^9.4.0", | ||||
|     "eslint-plugin-yml": "^1.1.0", | ||||
|     "eslint-plugin-jsonc": "^2.5.0", | ||||
|     "eslint-plugin-n": "^15.5.1", | ||||
|     "eslint-plugin-promise": "^6.1.1", | ||||
|     "eslint-plugin-unicorn": "^45.0.1", | ||||
|     "eslint-plugin-vue": "^9.8.0", | ||||
|     "eslint-plugin-yml": "^1.2.0", | ||||
|     "jsonc-eslint-parser": "^2.1.0", | ||||
|     "yaml-eslint-parser": "^1.1.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.23.0" | ||||
|     "eslint": "^8.28.0" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -35,6 +35,7 @@ module.exports = { | ||||
|     'html', | ||||
|     'unicorn', | ||||
|     'antfu', | ||||
|     'no-only-tests', | ||||
|   ], | ||||
|   settings: { | ||||
|     'import/resolver': { | ||||
| @@ -155,6 +156,7 @@ module.exports = { | ||||
|       files: ['*.test.ts', '*.test.js', '*.spec.ts', '*.spec.js'], | ||||
|       rules: { | ||||
|         'no-unused-expressions': 'off', | ||||
|         'no-only-tests/no-only-tests': 'error', | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
| @@ -283,6 +285,7 @@ module.exports = { | ||||
|     'require-await': 'off', | ||||
|     'no-return-assign': 'off', | ||||
|     'operator-linebreak': ['error', 'before'], | ||||
|     'max-statements-per-line': ['error', { max: 1 }], | ||||
|  | ||||
|     // unicorns | ||||
|     // Pass error message when throwing errors | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-basic", | ||||
|   "version": "0.26.3", | ||||
|   "version": "0.33.0", | ||||
|   "description": "", | ||||
|   "author": "Anthony Fu <anthonyfu117@hotmail.com> (https://github.com/antfu/)", | ||||
|   "license": "MIT", | ||||
| @@ -23,16 +23,17 @@ | ||||
|     "eslint-plugin-eslint-comments": "^3.2.0", | ||||
|     "eslint-plugin-html": "^7.1.0", | ||||
|     "eslint-plugin-import": "^2.26.0", | ||||
|     "eslint-plugin-jsonc": "^2.4.0", | ||||
|     "eslint-plugin-jsonc": "^2.5.0", | ||||
|     "eslint-plugin-markdown": "^3.0.0", | ||||
|     "eslint-plugin-n": "^15.2.5", | ||||
|     "eslint-plugin-promise": "^6.0.1", | ||||
|     "eslint-plugin-unicorn": "^43.0.2", | ||||
|     "eslint-plugin-yml": "^1.1.0", | ||||
|     "eslint-plugin-n": "^15.5.1", | ||||
|     "eslint-plugin-no-only-tests": "^3.1.0", | ||||
|     "eslint-plugin-promise": "^6.1.1", | ||||
|     "eslint-plugin-unicorn": "^45.0.1", | ||||
|     "eslint-plugin-yml": "^1.2.0", | ||||
|     "jsonc-eslint-parser": "^2.1.0", | ||||
|     "yaml-eslint-parser": "^1.1.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.23.0" | ||||
|     "eslint": "^8.28.0" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "eslint-plugin-antfu", | ||||
|   "version": "0.26.3", | ||||
|   "version": "0.33.0", | ||||
|   "license": "MIT", | ||||
|   "homepage": "https://github.com/antfu/eslint-config", | ||||
|   "main": "./dist/index.cjs", | ||||
| @@ -16,10 +16,11 @@ | ||||
|     "prepublishOnly": "nr build" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@typescript-eslint/utils": "^5.36.1" | ||||
|     "@typescript-eslint/utils": "^5.45.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "unbuild": "^0.8.10", | ||||
|     "vitest": "^0.22.1" | ||||
|     "@types/node": "^18.11.9", | ||||
|     "unbuild": "^1.0.1", | ||||
|     "vitest": "^0.25.3" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| import genericSpacing from './rules/generic-spacing' | ||||
| import ifNewline from './rules/if-newline' | ||||
| import importDedupe from './rules/import-dedupe' | ||||
| import preferInlineTypeImport from './rules/prefer-inline-type-import' | ||||
| @@ -7,5 +8,6 @@ export default { | ||||
|     'if-newline': ifNewline, | ||||
|     'import-dedupe': importDedupe, | ||||
|     'prefer-inline-type-import': preferInlineTypeImport, | ||||
|     'generic-spacing': genericSpacing, | ||||
|   }, | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,52 @@ | ||||
| import { RuleTester } from '@typescript-eslint/utils/dist/ts-eslint' | ||||
| import { it } from 'vitest' | ||||
| import rule, { RULE_NAME } from './generic-spacing' | ||||
|  | ||||
| const valids = [ | ||||
|   'type Foo<T = true> = T', | ||||
|   'type Foo<T extends true = true> = T', | ||||
|   ` | ||||
| type Foo< | ||||
|   T = true, | ||||
|   K = false | ||||
| > = T`, | ||||
|   `function foo< | ||||
|   T | ||||
| >() {}`, | ||||
|   'const foo = <T>(name: T) => name', | ||||
|   `interface Log { | ||||
|     foo<T>(name: T): void | ||||
|   }`, | ||||
|   `interface Log { | ||||
|   <T>(name: T): void | ||||
| }`, | ||||
| `interface Foo { | ||||
|   foo?: <T>(name: T) => void | ||||
| }`, | ||||
| ] | ||||
| const invalids = [ | ||||
|   ['type Foo<T=true> = T', 'type Foo<T = true> = T'], | ||||
|   ['type Foo<T,K> = T', 'type Foo<T, K> = T'], | ||||
|   ['type Foo<T=false,K=1|2> = T', 'type Foo<T = false, K = 1|2> = T', 3], | ||||
|   ['function foo <T>() {}', 'function foo<T>() {}'], | ||||
|   [`interface Log { | ||||
|   foo <T>(name: T): void | ||||
| }`, `interface Log { | ||||
|   foo<T>(name: T): void | ||||
| }`], | ||||
| ] as const | ||||
|  | ||||
| it('runs', () => { | ||||
|   const ruleTester: RuleTester = new RuleTester({ | ||||
|     parser: require.resolve('@typescript-eslint/parser'), | ||||
|   }) | ||||
|  | ||||
|   ruleTester.run(RULE_NAME, rule, { | ||||
|     valid: valids, | ||||
|     invalid: invalids.map(i => ({ | ||||
|       code: i[0], | ||||
|       output: i[1].trim(), | ||||
|       errors: Array.from({ length: i[2] || 1 }, () => ({ messageId: 'genericSpacingMismatch' })), | ||||
|     })), | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										87
									
								
								packages/eslint-plugin-antfu/src/rules/generic-spacing.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								packages/eslint-plugin-antfu/src/rules/generic-spacing.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| import { createEslintRule } from '../utils' | ||||
|  | ||||
| export const RULE_NAME = 'generic-spacing' | ||||
| export type MessageIds = 'genericSpacingMismatch' | ||||
| export type Options = [] | ||||
|  | ||||
| export default createEslintRule<Options, MessageIds>({ | ||||
|   name: RULE_NAME, | ||||
|   meta: { | ||||
|     type: 'suggestion', | ||||
|     docs: { | ||||
|       description: 'Spaces around generic type parameters', | ||||
|       recommended: 'error', | ||||
|     }, | ||||
|     fixable: 'code', | ||||
|     schema: [], | ||||
|     messages: { | ||||
|       genericSpacingMismatch: 'Generic spaces mismatch', | ||||
|     }, | ||||
|   }, | ||||
|   defaultOptions: [], | ||||
|   create: (context) => { | ||||
|     const sourceCode = context.getSourceCode() | ||||
|     return { | ||||
|       TSTypeParameterDeclaration: (node) => { | ||||
|         if (!['TSCallSignatureDeclaration', 'ArrowFunctionExpression', 'TSFunctionType'].includes(node.parent.type)) { | ||||
|           const pre = sourceCode.text.slice(0, node.range[0]) | ||||
|           const preSpace = pre.match(/(\s+)$/)?.[0] | ||||
|           // strip space before <T> | ||||
|           if (preSpace && preSpace.length) { | ||||
|             context.report({ | ||||
|               node, | ||||
|               messageId: 'genericSpacingMismatch', | ||||
|               *fix(fixer) { | ||||
|                 yield fixer.replaceTextRange([node.range[0] - preSpace.length, node.range[0]], '') | ||||
|               }, | ||||
|             }) | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         // add space between <T,K> | ||||
|         const params = node.params | ||||
|         for (let i = 1; i < params.length; i++) { | ||||
|           const prev = params[i - 1] | ||||
|           const current = params[i] | ||||
|           const from = prev.range[1] | ||||
|           const to = current.range[0] | ||||
|           const span = sourceCode.text.slice(from, to) | ||||
|           if (span !== ', ' && !span.match(/,\n/)) { | ||||
|             context.report({ | ||||
|               *fix(fixer) { | ||||
|                 yield fixer.replaceTextRange([from, to], ', ') | ||||
|               }, | ||||
|               loc: { | ||||
|                 start: prev.loc.end, | ||||
|                 end: current.loc.start, | ||||
|               }, | ||||
|               messageId: 'genericSpacingMismatch', | ||||
|               node, | ||||
|             }) | ||||
|           } | ||||
|         } | ||||
|       }, | ||||
|       // add space around = in type Foo<T = true> | ||||
|       TSTypeParameter: (node) => { | ||||
|         if (!node.default) | ||||
|           return | ||||
|         const endNode = node.constraint || node.name | ||||
|         const from = endNode.range[1] | ||||
|         const to = node.default.range[0] | ||||
|         if (sourceCode.text.slice(from, to) !== ' = ') { | ||||
|           context.report({ | ||||
|             *fix(fixer) { | ||||
|               yield fixer.replaceTextRange([from, to], ' = ') | ||||
|             }, | ||||
|             loc: { | ||||
|               start: endNode.loc.end, | ||||
|               end: node.default.loc.start, | ||||
|             }, | ||||
|             messageId: 'genericSpacingMismatch', | ||||
|             node, | ||||
|           }) | ||||
|         } | ||||
|       }, | ||||
|     } | ||||
|   }, | ||||
| }) | ||||
| @@ -1,6 +1,7 @@ | ||||
| module.exports = { | ||||
|   extends: [ | ||||
|     'plugin:react/recommended', | ||||
|     'plugin:react-hooks/recommended', | ||||
|     '@antfu/eslint-config-ts', | ||||
|   ], | ||||
|   settings: { | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-react", | ||||
|   "version": "0.26.3", | ||||
|   "version": "0.33.0", | ||||
|   "description": "", | ||||
|   "author": "Anthony Fu <anthonyfu117@hotmail.com> (https://github.com/antfu/)", | ||||
|   "license": "MIT", | ||||
| @@ -20,11 +20,12 @@ | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antfu/eslint-config-ts": "workspace:*", | ||||
|     "eslint-plugin-react": "^7.31.1" | ||||
|     "eslint-plugin-react": "^7.31.11", | ||||
|     "eslint-plugin-react-hooks": "^4.6.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.23.0", | ||||
|     "eslint": "^8.28.0", | ||||
|     "react": "^18.2.0", | ||||
|     "typescript": "^4.8.2" | ||||
|     "typescript": "^4.9.3" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| const fs = require('fs') | ||||
| const { join } = require('path') | ||||
| const basic = require('@antfu/eslint-config-basic') | ||||
|  | ||||
| module.exports = { | ||||
| @@ -11,7 +13,30 @@ module.exports = { | ||||
|       node: { extensions: ['.js', '.jsx', '.mjs', '.ts', '.tsx', '.d.ts'] }, | ||||
|     }, | ||||
|   }, | ||||
|   overrides: basic.overrides, | ||||
|   overrides: basic.overrides.concat( | ||||
|     !fs.existsSync(join(process.cwd(), 'tsconfig.eslint.json')) | ||||
|       ? [] | ||||
|       : [{ | ||||
|           parserOptions: { | ||||
|             tsconfigRootDir: process.cwd(), | ||||
|             project: ['tsconfig.json'], | ||||
|           }, | ||||
|           parser: '@typescript-eslint/parser', | ||||
|           excludedFiles: ['**/*.md/*.*'], | ||||
|           files: ['*.ts', '*.tsx'], | ||||
|           rules: { | ||||
|             'no-throw-literal': 'off', | ||||
|             '@typescript-eslint/no-throw-literal': 'error', | ||||
|             'no-implied-eval': 'off', | ||||
|             '@typescript-eslint/no-implied-eval': 'error', | ||||
|             'dot-notation': 'off', | ||||
|             '@typescript-eslint/dot-notation': ['error', { allowKeywords: true }], | ||||
|             'no-void': ['error', { allowAsStatement: true }], | ||||
|             '@typescript-eslint/no-floating-promises': 'error', | ||||
|             '@typescript-eslint/no-misused-promises': 'error', | ||||
|           }, | ||||
|         }], | ||||
|   ), | ||||
|   rules: { | ||||
|     'import/named': 'off', | ||||
|  | ||||
| @@ -58,6 +83,9 @@ module.exports = { | ||||
|         'JSXEmptyExpression', | ||||
|         'JSXSpreadChild', | ||||
|         'TSTypeParameterInstantiation', | ||||
|         'FunctionExpression > .params[decorators.length > 0]', | ||||
|         'FunctionExpression > .params > :matches(Decorator, :not(:first-child))', | ||||
|         'ClassBody.body > PropertyDefinition[decorators.length > 0] > .key', | ||||
|       ], | ||||
|       offsetTernaryExpressions: true, | ||||
|     }], | ||||
| @@ -102,14 +130,9 @@ module.exports = { | ||||
|     '@typescript-eslint/no-loss-of-precision': 'error', | ||||
|     'lines-between-class-members': 'off', | ||||
|     '@typescript-eslint/lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: true }], | ||||
|     // The following rule overrides require a parser service, aka. require a `typescript.json` path. | ||||
|     // This needs to be done individually for each project, and it slows down linting significantly. | ||||
|     // 'no-throw-literal': 'off', | ||||
|     // '@typescript-eslint/no-throw-literal': 'error', | ||||
|     // 'no-implied-eval': 'off', | ||||
|     // '@typescript-eslint/no-implied-eval': 'error', | ||||
|     // 'dot-notation': 'off', | ||||
|     // '@typescript-eslint/dot-notation': ['error', { allowKeywords: true }], | ||||
|  | ||||
|     // antfu | ||||
|     'antfu/generic-spacing': 'error', | ||||
|  | ||||
|     // off | ||||
|     '@typescript-eslint/consistent-indexed-object-style': 'off', | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-ts", | ||||
|   "version": "0.26.3", | ||||
|   "version": "0.33.0", | ||||
|   "description": "", | ||||
|   "author": "Anthony Fu <anthonyfu117@hotmail.com> (https://github.com/antfu/)", | ||||
|   "license": "MIT", | ||||
| @@ -18,10 +18,10 @@ | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antfu/eslint-config-basic": "workspace:*", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.36.1", | ||||
|     "@typescript-eslint/parser": "^5.36.1" | ||||
|     "@typescript-eslint/eslint-plugin": "^5.45.0", | ||||
|     "@typescript-eslint/parser": "^5.45.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.23.0" | ||||
|     "eslint": "^8.28.0" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,10 @@ | ||||
| const { isPackageExists } = require('local-pkg') | ||||
|  | ||||
| const TS = isPackageExists('typescript') | ||||
|  | ||||
| if (!TS) | ||||
|   console.warn('[@antfu/eslint-config] TypeScript is not installed, fallback to JS only.') | ||||
|  | ||||
| module.exports = { | ||||
|   overrides: [ | ||||
|     { | ||||
| @@ -9,13 +16,17 @@ module.exports = { | ||||
|       rules: { | ||||
|         'no-unused-vars': 'off', | ||||
|         'no-undef': 'off', | ||||
|         '@typescript-eslint/no-unused-vars': 'off', | ||||
|         ...(TS | ||||
|           ? { '@typescript-eslint/no-unused-vars': 'off' } | ||||
|           : null), | ||||
|       }, | ||||
|     }, | ||||
|   ], | ||||
|   extends: [ | ||||
|     'plugin:vue/vue3-recommended', | ||||
|     '@antfu/eslint-config-ts', | ||||
|     TS | ||||
|       ? '@antfu/eslint-config-ts' | ||||
|       : '@antfu/eslint-config-basic', | ||||
|   ], | ||||
|   rules: { | ||||
|     'vue/max-attributes-per-line': 'off', | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-vue", | ||||
|   "version": "0.26.3", | ||||
|   "version": "0.33.0", | ||||
|   "description": "", | ||||
|   "author": "Anthony Fu <anthonyfu117@hotmail.com> (https://github.com/antfu/)", | ||||
|   "license": "MIT", | ||||
| @@ -15,10 +15,12 @@ | ||||
|     "eslint": ">=7.4.0" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antfu/eslint-config-basic": "workspace:*", | ||||
|     "@antfu/eslint-config-ts": "workspace:*", | ||||
|     "eslint-plugin-vue": "^9.4.0" | ||||
|     "eslint-plugin-vue": "^9.8.0", | ||||
|     "local-pkg": "^0.4.2" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.23.0" | ||||
|     "eslint": "^8.28.0" | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										1333
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1333
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										14
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     "baseUrl": ".", | ||||
|     "target": "es2020", | ||||
|     "module": "es2020", | ||||
|     "moduleResolution": "node" | ||||
|   }, | ||||
|   "include": [ | ||||
|     "./packages/**/*.ts" | ||||
|   ], | ||||
|   "exclude": [ | ||||
|     "./fixtures/**/*.*" | ||||
|   ] | ||||
| } | ||||
		Reference in New Issue
	
	Block a user