├── .eslintrc.cjs
├── .gitignore
├── .prettierrc.json
├── .vscode
├── _sfc.code-snippets
├── extensions.json
└── settings.json
├── README.md
├── auto-imports.d.ts
├── components.d.ts
├── e2e
├── tsconfig.json
└── vue.spec.ts
├── env.d.ts
├── index.html
├── package-lock.json
├── package.json
├── playwright.config.ts
├── public
└── favicon.ico
├── src
├── App.vue
├── assets
│ └── logo.svg
├── components
│ ├── BaseButton.spec.ts
│ ├── BaseButton.vue
│ ├── BaseInputText.spec.ts
│ └── BaseInputText.vue
├── composables
│ └── useTheme.ts
├── design
│ ├── _colors.scss
│ ├── _durations.scss
│ ├── _fonts.scss
│ ├── _layers.scss
│ ├── _sizes.scss
│ ├── _typography.scss
│ └── index.scss
├── layouts
│ └── AppLayout.vue
├── main.ts
├── pages
│ ├── about.vue
│ └── index.vue
├── router
│ ├── index.ts
│ └── routes.ts
├── stores
│ └── counter.ts
└── types.ts
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.node.json
├── tsconfig.vitest.json
├── vite.config.ts
└── vitest.config.ts
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | /* eslint-env node */
2 | require('@rushstack/eslint-patch/modern-module-resolution')
3 |
4 | module.exports = {
5 | root: true,
6 | 'extends': [
7 | 'plugin:vue/vue3-essential',
8 | 'eslint:recommended',
9 | '@vue/eslint-config-typescript',
10 | '@vue/eslint-config-prettier/skip-formatting'
11 | ],
12 | parserOptions: {
13 | ecmaVersion: 'latest'
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | .DS_Store
12 | dist
13 | dist-ssr
14 | coverage
15 | *.local
16 |
17 | # Editor directories and files
18 | .idea
19 | *.suo
20 | *.ntvs*
21 | *.njsproj
22 | *.sln
23 | *.sw?
24 |
25 | # Playwright directories
26 | test-results/
27 | playwright-report/
28 |
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/prettierrc",
3 | "semi": false,
4 | "tabWidth": 2,
5 | "singleQuote": true,
6 | "printWidth": 100,
7 | "trailingComma": "none"
8 | }
--------------------------------------------------------------------------------
/.vscode/_sfc.code-snippets:
--------------------------------------------------------------------------------
1 | {
2 | "veb-sfc": {
3 | "scope": "vue",
4 | "prefix": "sfc",
5 | "body": [
6 | "",
9 | "",
10 | "",
11 | "\t",
12 | "",
13 | "",
14 | ""
17 | ],
18 | "description": "Single File Component (Comp API + TS) from VEB"
19 | },
20 | "veb-sfc-options": {
21 | "scope": "vue",
22 | "prefix": "sfc-options",
23 | "body": [
24 | "",
31 | "",
32 | "",
33 | "\t",
34 | "",
35 | "",
36 | ""
39 | ],
40 | "description": "Single File Component (Options API + TS) from VEB"
41 | },
42 | "veb-script": {
43 | "scope": "vue",
44 | "prefix": "script",
45 | "body": [""],
46 | "description": "Script block (Comp API + TS)"
47 | },
48 | "veb-script-options": {
49 | "scope": "vue",
50 | "prefix": "script-options",
51 | "body": [
52 | ""
59 | ],
60 | "description": "Script block (Options API + TS)"
61 | },
62 | "veb-template": {
63 | "scope": "vue",
64 | "prefix": "template",
65 | "body": ["", "\t${0}", ""],
66 | "description": "Template block"
67 | },
68 | "veb-style": {
69 | "scope": "vue",
70 | "prefix": "style",
71 | "body": [""],
72 | "description": "Scoped CSS + Sass styles block from VEB"
73 | },
74 | "veb-style-module": {
75 | "scope": "vue",
76 | "prefix": "style-module",
77 | "body": [""],
78 | "description": "CSS Module + Sass styles block from VEB"
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | // Vue - Official Extension
4 | // https://github.com/vuejs/language-tools
5 | "vue.volar",
6 |
7 | // Format-on-save with Prettier
8 | // https://github.com/prettier/prettier-vscode
9 | "esbenp.prettier-vscode",
10 |
11 | // Playwright Test - Official Extension
12 | // https://github.com/microsoft/playwright-vscode
13 | "ms-playwright.playwright",
14 |
15 | // Better Comments
16 | // https://github.com/aaron-bond/better-comments
17 | "aaron-bond.better-comments",
18 |
19 | // Path Intellisense
20 | // https://github.com/ChristianKohler/PathIntellisense
21 | "christian-kohler.path-intellisense",
22 |
23 | // Peacock - Workspace Color Customizer
24 | // https://github.com/johnpapa/vscode-peacock
25 | "johnpapa.vscode-peacock"
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | // ======
3 | // Spacing
4 | // ======
5 |
6 | "editor.insertSpaces": true,
7 | "editor.tabSize": 2,
8 | "editor.trimAutoWhitespace": true,
9 | "files.trimTrailingWhitespace": true,
10 | "files.eol": "\n",
11 | "files.insertFinalNewline": true,
12 | "files.trimFinalNewlines": true,
13 |
14 | // ======
15 | // Files
16 | // ======
17 |
18 | "files.exclude": {
19 | "**/*.log": true,
20 | "**/*.log*": true,
21 | "**/dist": true,
22 | "**/coverage": true
23 | },
24 |
25 | // ======
26 | // Event Triggers
27 | // ======
28 |
29 | "editor.formatOnSave": true,
30 | "editor.defaultFormatter": "esbenp.prettier-vscode",
31 | "editor.codeActionsOnSave": {
32 | "source.fixAll.eslint": "explicit",
33 | "source.fixAll.stylelint": "explicit",
34 | "source.fixAll.markdownlint": "explicit"
35 | },
36 | "eslint.validate": ["javascript", "javascriptreact", "vue", "vue-html", "html"],
37 |
38 | // ======
39 | // HTML
40 | // ======
41 |
42 | "emmet.triggerExpansionOnTab": true,
43 |
44 | // ======
45 | // CSS
46 | // ======
47 |
48 | "stylelint.enable": true,
49 | "css.validate": false,
50 | "scss.validate": false,
51 |
52 | // ======
53 | // MARKDOWN
54 | // ======
55 |
56 | "[markdown]": {
57 | "editor.wordWrap": "wordWrapColumn",
58 | "editor.wordWrapColumn": 80
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Vue Enterprise Boilerplate v3 (alpha)
2 |
3 | This repo is currently in active development and considered in alpha release.
4 |
5 | > This is an ever-evolving, opinionated architecture and dev environment for new Vue 3 + Vite SPA projects using [create-vue](https://github.com/vuejs/create-vue).
6 |
7 | 🎩 A huge thanks to [Chris Fritz](https://twitter.com/chrisvfritz) for the incredible work that this work builds upon. For those looking for his version, see [this branch for the original Vue 2 enterprise boilerplate](https://github.com/bencodezen/vue-enterprise-boilerplate/tree/vue-2-version).
8 |
9 | ## Recommended IDE Setup
10 |
11 | [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
12 |
13 | ## Type Support for `.vue` Imports in TS
14 |
15 | TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types.
16 |
17 | If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps:
18 |
19 | 1. Disable the built-in TypeScript Extension
20 | 1. Run `Extensions: Show Built-in Extensions` from VSCode's command palette
21 | 2. Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
22 | 2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
23 |
24 | ## Project Setup
25 |
26 | ```sh
27 | npm install
28 | ```
29 |
30 | ### Compile and Hot-Reload for Development
31 |
32 | ```sh
33 | npm run dev
34 | ```
35 |
36 | ### Type-Check, Compile and Minify for Production
37 |
38 | ```sh
39 | npm run build
40 | ```
41 |
42 | ### Run Unit Tests with [Vitest](https://vitest.dev/)
43 |
44 | ```sh
45 | npm run test:unit
46 | ```
47 |
48 | ### Run End-to-End Tests with [Playwright](https://playwright.dev)
49 |
50 | ```sh
51 | # Install browsers for the first run
52 | npx playwright install
53 |
54 | # When testing on CI, must build the project first
55 | npm run build
56 |
57 | # Runs the end-to-end tests
58 | npm run test:e2e
59 | # Runs the tests only on Chromium
60 | npm run test:e2e -- --project=chromium
61 | # Runs the tests of a specific file
62 | npm run test:e2e -- tests/example.spec.ts
63 | # Runs the tests in debug mode
64 | npm run test:e2e -- --debug
65 | ```
66 |
67 | ### Lint with [ESLint](https://eslint.org/)
68 |
69 | ```sh
70 | npm run lint
71 | ```
72 |
--------------------------------------------------------------------------------
/auto-imports.d.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | /* prettier-ignore */
3 | // @ts-nocheck
4 | // noinspection JSUnusedGlobalSymbols
5 | // Generated by unplugin-auto-import
6 | export {}
7 | declare global {
8 | const EffectScope: typeof import('vue')['EffectScope']
9 | const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
10 | const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
11 | const computed: typeof import('vue')['computed']
12 | const computedAsync: typeof import('@vueuse/core')['computedAsync']
13 | const computedEager: typeof import('@vueuse/core')['computedEager']
14 | const computedInject: typeof import('@vueuse/core')['computedInject']
15 | const computedWithControl: typeof import('@vueuse/core')['computedWithControl']
16 | const controlledComputed: typeof import('@vueuse/core')['controlledComputed']
17 | const controlledRef: typeof import('@vueuse/core')['controlledRef']
18 | const createApp: typeof import('vue')['createApp']
19 | const createEventHook: typeof import('@vueuse/core')['createEventHook']
20 | const createGlobalState: typeof import('@vueuse/core')['createGlobalState']
21 | const createInjectionState: typeof import('@vueuse/core')['createInjectionState']
22 | const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn']
23 | const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate']
24 | const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable']
25 | const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise']
26 | const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn']
27 | const customRef: typeof import('vue')['customRef']
28 | const debouncedRef: typeof import('@vueuse/core')['debouncedRef']
29 | const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
30 | const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
31 | const defineComponent: typeof import('vue')['defineComponent']
32 | const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
33 | const effectScope: typeof import('vue')['effectScope']
34 | const extendRef: typeof import('@vueuse/core')['extendRef']
35 | const getCurrentInstance: typeof import('vue')['getCurrentInstance']
36 | const getCurrentScope: typeof import('vue')['getCurrentScope']
37 | const h: typeof import('vue')['h']
38 | const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
39 | const inject: typeof import('vue')['inject']
40 | const injectLocal: typeof import('@vueuse/core')['injectLocal']
41 | const isDefined: typeof import('@vueuse/core')['isDefined']
42 | const isProxy: typeof import('vue')['isProxy']
43 | const isReactive: typeof import('vue')['isReactive']
44 | const isReadonly: typeof import('vue')['isReadonly']
45 | const isRef: typeof import('vue')['isRef']
46 | const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable']
47 | const markRaw: typeof import('vue')['markRaw']
48 | const nextTick: typeof import('vue')['nextTick']
49 | const onActivated: typeof import('vue')['onActivated']
50 | const onBeforeMount: typeof import('vue')['onBeforeMount']
51 | const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
52 | const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
53 | const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
54 | const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
55 | const onClickOutside: typeof import('@vueuse/core')['onClickOutside']
56 | const onDeactivated: typeof import('vue')['onDeactivated']
57 | const onErrorCaptured: typeof import('vue')['onErrorCaptured']
58 | const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke']
59 | const onLongPress: typeof import('@vueuse/core')['onLongPress']
60 | const onMounted: typeof import('vue')['onMounted']
61 | const onRenderTracked: typeof import('vue')['onRenderTracked']
62 | const onRenderTriggered: typeof import('vue')['onRenderTriggered']
63 | const onScopeDispose: typeof import('vue')['onScopeDispose']
64 | const onServerPrefetch: typeof import('vue')['onServerPrefetch']
65 | const onStartTyping: typeof import('@vueuse/core')['onStartTyping']
66 | const onUnmounted: typeof import('vue')['onUnmounted']
67 | const onUpdated: typeof import('vue')['onUpdated']
68 | const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
69 | const provide: typeof import('vue')['provide']
70 | const provideLocal: typeof import('@vueuse/core')['provideLocal']
71 | const reactify: typeof import('@vueuse/core')['reactify']
72 | const reactifyObject: typeof import('@vueuse/core')['reactifyObject']
73 | const reactive: typeof import('vue')['reactive']
74 | const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed']
75 | const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit']
76 | const reactivePick: typeof import('@vueuse/core')['reactivePick']
77 | const readonly: typeof import('vue')['readonly']
78 | const ref: typeof import('vue')['ref']
79 | const refAutoReset: typeof import('@vueuse/core')['refAutoReset']
80 | const refDebounced: typeof import('@vueuse/core')['refDebounced']
81 | const refDefault: typeof import('@vueuse/core')['refDefault']
82 | const refThrottled: typeof import('@vueuse/core')['refThrottled']
83 | const refWithControl: typeof import('@vueuse/core')['refWithControl']
84 | const resolveComponent: typeof import('vue')['resolveComponent']
85 | const resolveRef: typeof import('@vueuse/core')['resolveRef']
86 | const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
87 | const shallowReactive: typeof import('vue')['shallowReactive']
88 | const shallowReadonly: typeof import('vue')['shallowReadonly']
89 | const shallowRef: typeof import('vue')['shallowRef']
90 | const syncRef: typeof import('@vueuse/core')['syncRef']
91 | const syncRefs: typeof import('@vueuse/core')['syncRefs']
92 | const templateRef: typeof import('@vueuse/core')['templateRef']
93 | const throttledRef: typeof import('@vueuse/core')['throttledRef']
94 | const throttledWatch: typeof import('@vueuse/core')['throttledWatch']
95 | const toRaw: typeof import('vue')['toRaw']
96 | const toReactive: typeof import('@vueuse/core')['toReactive']
97 | const toRef: typeof import('vue')['toRef']
98 | const toRefs: typeof import('vue')['toRefs']
99 | const toValue: typeof import('vue')['toValue']
100 | const triggerRef: typeof import('vue')['triggerRef']
101 | const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount']
102 | const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount']
103 | const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted']
104 | const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose']
105 | const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted']
106 | const unref: typeof import('vue')['unref']
107 | const unrefElement: typeof import('@vueuse/core')['unrefElement']
108 | const until: typeof import('@vueuse/core')['until']
109 | const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
110 | const useAnimate: typeof import('@vueuse/core')['useAnimate']
111 | const useArrayDifference: typeof import('@vueuse/core')['useArrayDifference']
112 | const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery']
113 | const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter']
114 | const useArrayFind: typeof import('@vueuse/core')['useArrayFind']
115 | const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex']
116 | const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast']
117 | const useArrayIncludes: typeof import('@vueuse/core')['useArrayIncludes']
118 | const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin']
119 | const useArrayMap: typeof import('@vueuse/core')['useArrayMap']
120 | const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce']
121 | const useArraySome: typeof import('@vueuse/core')['useArraySome']
122 | const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique']
123 | const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue']
124 | const useAsyncState: typeof import('@vueuse/core')['useAsyncState']
125 | const useAttrs: typeof import('vue')['useAttrs']
126 | const useBase64: typeof import('@vueuse/core')['useBase64']
127 | const useBattery: typeof import('@vueuse/core')['useBattery']
128 | const useBluetooth: typeof import('@vueuse/core')['useBluetooth']
129 | const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints']
130 | const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
131 | const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
132 | const useCached: typeof import('@vueuse/core')['useCached']
133 | const useClipboard: typeof import('@vueuse/core')['useClipboard']
134 | const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems']
135 | const useCloned: typeof import('@vueuse/core')['useCloned']
136 | const useColorMode: typeof import('@vueuse/core')['useColorMode']
137 | const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
138 | const useCounter: typeof import('@vueuse/core')['useCounter']
139 | const useCssModule: typeof import('vue')['useCssModule']
140 | const useCssVar: typeof import('@vueuse/core')['useCssVar']
141 | const useCssVars: typeof import('vue')['useCssVars']
142 | const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement']
143 | const useCycleList: typeof import('@vueuse/core')['useCycleList']
144 | const useDark: typeof import('@vueuse/core')['useDark']
145 | const useDateFormat: typeof import('@vueuse/core')['useDateFormat']
146 | const useDebounce: typeof import('@vueuse/core')['useDebounce']
147 | const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn']
148 | const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory']
149 | const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion']
150 | const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation']
151 | const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio']
152 | const useDevicesList: typeof import('@vueuse/core')['useDevicesList']
153 | const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia']
154 | const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility']
155 | const useDraggable: typeof import('@vueuse/core')['useDraggable']
156 | const useDropZone: typeof import('@vueuse/core')['useDropZone']
157 | const useElementBounding: typeof import('@vueuse/core')['useElementBounding']
158 | const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint']
159 | const useElementHover: typeof import('@vueuse/core')['useElementHover']
160 | const useElementSize: typeof import('@vueuse/core')['useElementSize']
161 | const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility']
162 | const useEventBus: typeof import('@vueuse/core')['useEventBus']
163 | const useEventListener: typeof import('@vueuse/core')['useEventListener']
164 | const useEventSource: typeof import('@vueuse/core')['useEventSource']
165 | const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper']
166 | const useFavicon: typeof import('@vueuse/core')['useFavicon']
167 | const useFetch: typeof import('@vueuse/core')['useFetch']
168 | const useFileDialog: typeof import('@vueuse/core')['useFileDialog']
169 | const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess']
170 | const useFocus: typeof import('@vueuse/core')['useFocus']
171 | const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin']
172 | const useFps: typeof import('@vueuse/core')['useFps']
173 | const useFullscreen: typeof import('@vueuse/core')['useFullscreen']
174 | const useGamepad: typeof import('@vueuse/core')['useGamepad']
175 | const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
176 | const useHead: typeof import('@unhead/vue')['useHead']
177 | const useIdle: typeof import('@vueuse/core')['useIdle']
178 | const useImage: typeof import('@vueuse/core')['useImage']
179 | const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
180 | const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver']
181 | const useInterval: typeof import('@vueuse/core')['useInterval']
182 | const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn']
183 | const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier']
184 | const useLastChanged: typeof import('@vueuse/core')['useLastChanged']
185 | const useLink: typeof import('vue-router')['useLink']
186 | const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage']
187 | const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys']
188 | const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory']
189 | const useMediaControls: typeof import('@vueuse/core')['useMediaControls']
190 | const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
191 | const useMemoize: typeof import('@vueuse/core')['useMemoize']
192 | const useMemory: typeof import('@vueuse/core')['useMemory']
193 | const useMounted: typeof import('@vueuse/core')['useMounted']
194 | const useMouse: typeof import('@vueuse/core')['useMouse']
195 | const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
196 | const useMousePressed: typeof import('@vueuse/core')['useMousePressed']
197 | const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver']
198 | const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage']
199 | const useNetwork: typeof import('@vueuse/core')['useNetwork']
200 | const useNow: typeof import('@vueuse/core')['useNow']
201 | const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl']
202 | const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination']
203 | const useOnline: typeof import('@vueuse/core')['useOnline']
204 | const usePageLeave: typeof import('@vueuse/core')['usePageLeave']
205 | const useParallax: typeof import('@vueuse/core')['useParallax']
206 | const useParentElement: typeof import('@vueuse/core')['useParentElement']
207 | const usePerformanceObserver: typeof import('@vueuse/core')['usePerformanceObserver']
208 | const usePermission: typeof import('@vueuse/core')['usePermission']
209 | const usePointer: typeof import('@vueuse/core')['usePointer']
210 | const usePointerLock: typeof import('@vueuse/core')['usePointerLock']
211 | const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe']
212 | const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme']
213 | const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast']
214 | const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark']
215 | const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
216 | const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
217 | const usePrevious: typeof import('@vueuse/core')['usePrevious']
218 | const useRafFn: typeof import('@vueuse/core')['useRafFn']
219 | const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
220 | const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
221 | const useRoute: typeof import('vue-router')['useRoute']
222 | const useRouter: typeof import('vue-router')['useRouter']
223 | const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation']
224 | const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea']
225 | const useScriptTag: typeof import('@vueuse/core')['useScriptTag']
226 | const useScroll: typeof import('@vueuse/core')['useScroll']
227 | const useScrollLock: typeof import('@vueuse/core')['useScrollLock']
228 | const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage']
229 | const useShare: typeof import('@vueuse/core')['useShare']
230 | const useSlots: typeof import('vue')['useSlots']
231 | const useSorted: typeof import('@vueuse/core')['useSorted']
232 | const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition']
233 | const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis']
234 | const useStepper: typeof import('@vueuse/core')['useStepper']
235 | const useStorage: typeof import('@vueuse/core')['useStorage']
236 | const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync']
237 | const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
238 | const useSupported: typeof import('@vueuse/core')['useSupported']
239 | const useSwipe: typeof import('@vueuse/core')['useSwipe']
240 | const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
241 | const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
242 | const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
243 | const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize']
244 | const useThrottle: typeof import('@vueuse/core')['useThrottle']
245 | const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn']
246 | const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory']
247 | const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo']
248 | const useTimeout: typeof import('@vueuse/core')['useTimeout']
249 | const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn']
250 | const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll']
251 | const useTimestamp: typeof import('@vueuse/core')['useTimestamp']
252 | const useTitle: typeof import('@vueuse/core')['useTitle']
253 | const useToNumber: typeof import('@vueuse/core')['useToNumber']
254 | const useToString: typeof import('@vueuse/core')['useToString']
255 | const useToggle: typeof import('@vueuse/core')['useToggle']
256 | const useTransition: typeof import('@vueuse/core')['useTransition']
257 | const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
258 | const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
259 | const useVModel: typeof import('@vueuse/core')['useVModel']
260 | const useVModels: typeof import('@vueuse/core')['useVModels']
261 | const useVibrate: typeof import('@vueuse/core')['useVibrate']
262 | const useVirtualList: typeof import('@vueuse/core')['useVirtualList']
263 | const useWakeLock: typeof import('@vueuse/core')['useWakeLock']
264 | const useWebNotification: typeof import('@vueuse/core')['useWebNotification']
265 | const useWebSocket: typeof import('@vueuse/core')['useWebSocket']
266 | const useWebWorker: typeof import('@vueuse/core')['useWebWorker']
267 | const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn']
268 | const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus']
269 | const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll']
270 | const useWindowSize: typeof import('@vueuse/core')['useWindowSize']
271 | const watch: typeof import('vue')['watch']
272 | const watchArray: typeof import('@vueuse/core')['watchArray']
273 | const watchAtMost: typeof import('@vueuse/core')['watchAtMost']
274 | const watchDebounced: typeof import('@vueuse/core')['watchDebounced']
275 | const watchDeep: typeof import('@vueuse/core')['watchDeep']
276 | const watchEffect: typeof import('vue')['watchEffect']
277 | const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable']
278 | const watchImmediate: typeof import('@vueuse/core')['watchImmediate']
279 | const watchOnce: typeof import('@vueuse/core')['watchOnce']
280 | const watchPausable: typeof import('@vueuse/core')['watchPausable']
281 | const watchPostEffect: typeof import('vue')['watchPostEffect']
282 | const watchSyncEffect: typeof import('vue')['watchSyncEffect']
283 | const watchThrottled: typeof import('@vueuse/core')['watchThrottled']
284 | const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable']
285 | const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter']
286 | const whenever: typeof import('@vueuse/core')['whenever']
287 | }
288 | // for type re-export
289 | declare global {
290 | // @ts-ignore
291 | export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
292 | import('vue')
293 | }
294 |
--------------------------------------------------------------------------------
/components.d.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | // @ts-nocheck
3 | // Generated by unplugin-vue-components
4 | // Read more: https://github.com/vuejs/core/pull/3399
5 | export {}
6 |
7 | /* prettier-ignore */
8 | declare module 'vue' {
9 | export interface GlobalComponents {
10 | AppLayout: typeof import('./src/layouts/AppLayout.vue')['default']
11 | BaseButton: typeof import('./src/components/BaseButton.vue')['default']
12 | BaseInputText: typeof import('./src/components/BaseInputText.vue')['default']
13 | BaseLink: typeof import('./src/components/BaseLink.vue')['default']
14 | RouterLink: typeof import('vue-router')['RouterLink']
15 | RouterView: typeof import('vue-router')['RouterView']
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/e2e/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tsconfig/node20/tsconfig.json",
3 | "include": ["./**/*"]
4 | }
5 |
--------------------------------------------------------------------------------
/e2e/vue.spec.ts:
--------------------------------------------------------------------------------
1 | import { test, expect } from '@playwright/test'
2 |
3 | // See here how to get started:
4 | // https://playwright.dev/docs/intro
5 | test('visits the app root url', async ({ page }) => {
6 | await page.goto('/')
7 | await expect(page.locator('h1')).toHaveText('Home Page')
8 | })
9 |
--------------------------------------------------------------------------------
/env.d.ts:
--------------------------------------------------------------------------------
1 | ///